[
  {
    "path": ".appends/.github/labels.yml",
    "content": "# ----------------------------------------------------------------------------------------- #\n# These are the repository-specific labels that augment the Exercise-wide labels defined in #\n# https://github.com/exercism/org-wide-files/blob/main/global-files/.github/labels.yml.     #\n# ----------------------------------------------------------------------------------------- #\n\n- name: 'breaking :boom:'\n  description: ''\n  color: 'fca708'\n\n- name: 'bug :bug:'\n  description: \"Something isn't working\"\n  color: 'b60205'\n\n- name: 'chore :wrench:'\n  description: 'Meta related task such as build, test, linting, maintainers.json etc.'\n  color: '000000'\n\n- name: 'ci :gear:'\n  description: 'Continuous integration related'\n  color: '000000'\n\n- name: 'dependencies'\n  description: 'Pull requests that update a dependency file'\n  color: '0366d6'\n\n- name: 'discussion :speech_balloon:'\n  description: ''\n  color: 'fbca04'\n\n- name: 'do not merge :construction:'\n  description: ''\n  color: 'fbca04'\n\n- name: 'documentation :book:'\n  description: 'Documentation changes'\n  color: '1d76db'\n\n- name: 'duplicate  :repeat:'\n  description: 'This issue or pull request already exists'\n  color: 'ffffff'\n\n- name: 'enhancement :unicorn:'\n  description: \"Changing current behaviour, enhancing what's already there\"\n  color: 'a2eeef'\n\n- name: 'github_actions'\n  description: 'Pull requests that update Github_actions code'\n  color: '000000'\n\n- name: 'good first issue'\n  description: 'First-time contributors preferred'\n  color: 'b1db51'\n\n- name: 'hacktoberfest'\n  description: 'Hacktoberfest issues! Everyone allowed <3'\n  color: '000000'\n\n- name: 'help wanted'\n  description: ''\n  color: 'b1db51'\n\n- name: 'invalid'\n  description: ''\n  color: 'ffffff'\n\n- name: 'javascript'\n  description: 'Pull requests that update Javascript code'\n  color: '168700'\n\n- name: 'new exercise :sparkles:'\n  description: 'Adding an exercise from the canonical data'\n  color: '1105b7'\n\n- name: 'question :thinking:'\n  description: ''\n  color: 'ffffff'\n\n- name: 'reputation/contributed_code/major'\n  description: ''\n  color: '34FBF8'\n\n- name: 'reputation/contributed_code/minor'\n  description: ''\n  color: 'EF6513'\n\n- name: 'rfc :speech_balloon:'\n  description: 'Request for Comments'\n  color: 'fbca04'\n\n- name: 'security :rotating_light:'\n  description: 'Security related issue or change'\n  color: 'b60205'\n\n- name: 'sync :arrows_counterclockwise:'\n  description: 'Sync an exercise with the canonical data'\n  color: '1105b7'\n\n- name: 'track-anatomy'\n  description: 'config.json, new exercises'\n  color: '000000'\n\n- name: 'upstream ⬆'\n  description: ''\n  color: 'ffffff'\n\n- name: 'v3-migration 🤖'\n  description: 'Preparing for Exercism v3'\n  color: 'E99695'\n\n- name: 'wontfix :no_good_woman:'\n  description: ''\n  color: 'ffffff'\n"
  },
  {
    "path": ".dependabot/config.yml",
    "content": "version: 1\nupdate_configs:\n  - package_manager: 'javascript'\n    directory: '/'\n    update_schedule: 'live'\n    allowed_updates:\n      - match:\n          update_type: 'security'\n"
  },
  {
    "path": ".gitattributes",
    "content": "* text=auto eol=lf\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "# Code owners\n.github/CODEOWNERS      @exercism/maintainers-admin\n\n# Changes to `fetch-configlet` should be made in the `exercism/configlet` repo\nbin/fetch-configlet     @exercism/maintainers-admin\nbin/fetch-configlet.ps1 @exercism/maintainers-admin\n\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\n\nupdates:\n  # Keep dependencies for GitHub Actions up-to-date\n  - package-ecosystem: 'github-actions'\n    directory: '/'\n    schedule:\n      interval: 'monthly'\n\n  # Enable version updates for npm (yarn)\n  - package-ecosystem: 'npm'\n    # Look for `package.json` and `lock` files in the `root` directory\n    directory: '/'\n    # Check the npm registry for updates every day (weekdays)\n    schedule:\n      interval: 'monthly'\n\n  # Enable version updates for npm (yarn)\n  - package-ecosystem: 'npm'\n    # Look for `package.json` and `lock` files in the common directory\n    directory: '/common/'\n    # Check the npm registry for updates every day (weekdays)\n    schedule:\n      interval: 'monthly'\n"
  },
  {
    "path": ".github/labels.yml",
    "content": "# --------------------------------------------------------------- #\n# This is an auto-generated file - Do not manually edit this file #\n# --------------------------------------------------------------- #\n\n# This file is automatically generated by concatenating two files:\n#\n# 1. The Exercism-wide labels: defined in https://github.com/exercism/org-wide-files/blob/main/global-files/.github/labels.yml\n# 2. The repository-specific labels: defined in the `.appends/.github/labels.yml` file within this repository.\n#\n# If any of these two files change, a pull request is automatically created containing a re-generated version of this file.\n# Consequently, to change repository-specific labels you should update the `.appends/.github/labels.yml` file and _not_ this file.\n#\n# When the pull request has been merged, the GitHub labels will be automatically updated by the \"Sync labels\" workflow.\n# This typically takes 5-10 minutes.\n\n# --------------------------------------------------------------------- #\n# These are the Exercism-wide labels which are shared across all repos. #\n# --------------------------------------------------------------------- #\n\n# The following Exercism-wide labels are used to show \"tasks\" on the website, which will point users to things they can contribute to.\n\n# The `x:action/<value>` labels describe what sort of work the contributor will be engaged in when working on the issue\n- name: \"x:action/create\"\n  description: \"Work on something from scratch\"\n  color: \"ffffff\"\n\n- name: \"x:action/fix\"\n  description: \"Fix an issue\"\n  color: \"ffffff\"\n\n- name: \"x:action/improve\"\n  description: \"Improve existing functionality/content\"\n  color: \"ffffff\"\n\n- name: \"x:action/proofread\"\n  description: \"Proofread text\"\n  color: \"ffffff\"\n\n- name: \"x:action/sync\"\n  description: \"Sync content with its latest version\"\n  color: \"ffffff\"\n\n# The `x:knowledge/<value>` labels describe how much Exercism knowledge is required by the contributor\n- name: \"x:knowledge/none\"\n  description: \"No existing Exercism knowledge required\"\n  color: \"ffffff\"\n\n- name: \"x:knowledge/elementary\"\n  description: \"Little Exercism knowledge required\"\n  color: \"ffffff\"\n\n- name: \"x:knowledge/intermediate\"\n  description: \"Quite a bit of Exercism knowledge required\"\n  color: \"ffffff\"\n\n- name: \"x:knowledge/advanced\"\n  description: \"Comprehensive Exercism knowledge required\"\n  color: \"ffffff\"\n\n# The `x:module/<value>` labels indicate what part of Exercism the contributor will be working on\n- name: \"x:module/analyzer\"\n  description: \"Work on Analyzers\"\n  color: \"ffffff\"\n\n- name: \"x:module/concept\"\n  description: \"Work on Concepts\"\n  color: \"ffffff\"\n\n- name: \"x:module/concept-exercise\"\n  description: \"Work on Concept Exercises\"\n  color: \"ffffff\"\n\n- name: \"x:module/generator\"\n  description: \"Work on Exercise generators\"\n  color: \"ffffff\"\n\n- name: \"x:module/practice-exercise\"\n  description: \"Work on Practice Exercises\"\n  color: \"ffffff\"\n\n- name: \"x:module/representer\"\n  description: \"Work on Representers\"\n  color: \"ffffff\"\n\n- name: \"x:module/test-runner\"\n  description: \"Work on Test Runners\"\n  color: \"ffffff\"\n\n# The `x:rep/<value>` labels describe the amount of reputation to award\n#\n# For more information on reputation and how these labels should be used,\n# check out https://exercism.org/docs/using/product/reputation\n- name: \"x:rep/tiny\"\n  description: \"Tiny amount of reputation\"\n  color: \"ffffff\"\n\n- name: \"x:rep/small\"\n  description: \"Small amount of reputation\"\n  color: \"ffffff\"\n\n- name: \"x:rep/medium\"\n  description: \"Medium amount of reputation\"\n  color: \"ffffff\"\n\n- name: \"x:rep/large\"\n  description: \"Large amount of reputation\"\n  color: \"ffffff\"\n\n- name: \"x:rep/massive\"\n  description: \"Massive amount of reputation\"\n  color: \"ffffff\"\n\n# The `x:size/<value>` labels describe the expected amount of work for a contributor\n- name: \"x:size/tiny\"\n  description: \"Tiny amount of work\"\n  color: \"ffffff\"\n\n- name: \"x:size/small\"\n  description: \"Small amount of work\"\n  color: \"ffffff\"\n\n- name: \"x:size/medium\"\n  description: \"Medium amount of work\"\n  color: \"ffffff\"\n\n- name: \"x:size/large\"\n  description: \"Large amount of work\"\n  color: \"ffffff\"\n\n- name: \"x:size/massive\"\n  description: \"Massive amount of work\"\n  color: \"ffffff\"\n\n# The `x:status/<value>` label indicates if there is already someone working on the issue\n- name: \"x:status/claimed\"\n  description: \"Someone is working on this issue\"\n  color: \"ffffff\"\n\n# The `x:type/<value>` labels describe what type of work the contributor will be engaged in\n- name: \"x:type/ci\"\n  description: \"Work on Continuous Integration (e.g. GitHub Actions workflows)\"\n  color: \"ffffff\"\n\n- name: \"x:type/coding\"\n  description: \"Write code that is not student-facing content (e.g. test-runners, generators, but not exercises)\"\n  color: \"ffffff\"\n\n- name: \"x:type/content\"\n  description: \"Work on content (e.g. exercises, concepts)\"\n  color: \"ffffff\"\n\n- name: \"x:type/docker\"\n  description: \"Work on Dockerfiles\"\n  color: \"ffffff\"\n\n- name: \"x:type/docs\"\n  description: \"Work on Documentation\"\n  color: \"ffffff\"\n\n# This Exercism-wide label is added to all automatically created pull requests that help migrate/prepare a track for Exercism v3\n- name: \"v3-migration 🤖\"\n  description: \"Preparing for Exercism v3\"\n  color: \"e99695\"\n\n# This Exercism-wide label can be used to bulk-close issues in preparation for pausing community contributions\n- name: \"paused\"\n  description: \"Work paused until further notice\"\n  color: \"e4e669\"\n\n# ----------------------------------------------------------------------------------------- #\n# These are the repository-specific labels that augment the Exercise-wide labels defined in #\n# https://github.com/exercism/org-wide-files/blob/main/global-files/.github/labels.yml.     #\n# ----------------------------------------------------------------------------------------- #\n\n- name: 'breaking :boom:'\n  description: ''\n  color: 'fca708'\n\n- name: 'bug :bug:'\n  description: \"Something isn't working\"\n  color: 'b60205'\n\n- name: 'chore :wrench:'\n  description: 'Meta related task such as build, test, linting, maintainers.json etc.'\n  color: '000000'\n\n- name: 'ci :gear:'\n  description: 'Continuous integration related'\n  color: '000000'\n\n- name: 'dependencies'\n  description: 'Pull requests that update a dependency file'\n  color: '0366d6'\n\n- name: 'discussion :speech_balloon:'\n  description: ''\n  color: 'fbca04'\n\n- name: 'do not merge :construction:'\n  description: ''\n  color: 'fbca04'\n\n- name: 'documentation :book:'\n  description: 'Documentation changes'\n  color: '1d76db'\n\n- name: 'duplicate  :repeat:'\n  description: 'This issue or pull request already exists'\n  color: 'ffffff'\n\n- name: 'enhancement :unicorn:'\n  description: \"Changing current behaviour, enhancing what's already there\"\n  color: 'a2eeef'\n\n- name: 'github_actions'\n  description: 'Pull requests that update Github_actions code'\n  color: '000000'\n\n- name: 'good first issue'\n  description: 'First-time contributors preferred'\n  color: 'b1db51'\n\n- name: 'hacktoberfest'\n  description: 'Hacktoberfest issues! Everyone allowed <3'\n  color: '000000'\n\n- name: 'help wanted'\n  description: ''\n  color: 'b1db51'\n\n- name: 'invalid'\n  description: ''\n  color: 'ffffff'\n\n- name: 'javascript'\n  description: 'Pull requests that update Javascript code'\n  color: '168700'\n\n- name: 'new exercise :sparkles:'\n  description: 'Adding an exercise from the canonical data'\n  color: '1105b7'\n\n- name: 'question :thinking:'\n  description: ''\n  color: 'ffffff'\n\n- name: 'reputation/contributed_code/major'\n  description: ''\n  color: '34FBF8'\n\n- name: 'reputation/contributed_code/minor'\n  description: ''\n  color: 'EF6513'\n\n- name: 'rfc :speech_balloon:'\n  description: 'Request for Comments'\n  color: 'fbca04'\n\n- name: 'security :rotating_light:'\n  description: 'Security related issue or change'\n  color: 'b60205'\n\n- name: 'sync :arrows_counterclockwise:'\n  description: 'Sync an exercise with the canonical data'\n  color: '1105b7'\n\n- name: 'track-anatomy'\n  description: 'config.json, new exercises'\n  color: '000000'\n\n- name: 'upstream ⬆'\n  description: ''\n  color: 'ffffff'\n\n- name: 'v3-migration 🤖'\n  description: 'Preparing for Exercism v3'\n  color: 'E99695'\n\n- name: 'wontfix :no_good_woman:'\n  description: ''\n  color: 'ffffff'\n"
  },
  {
    "path": ".github/workflows/action-format.yml",
    "content": "name: 'typescript / format'\n\non:\n  issue_comment:\n    types: [created]\n\njobs:\n  format:\n    name: 'Format code'\n    runs-on: ubuntu-24.04\n    if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '/format')\n    steps:\n      - name: 'Post acknowledgement that it will format code'\n        continue-on-error: true # Never fail the build if this fails\n        uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea\n        with:\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n          script: |\n            github.rest.issues.createComment({\n              issue_number: context.issue.number,\n              owner: context.repo.owner,\n              repo: context.repo.repo,\n              body: 'The \"Format code\" action has started running.'\n            })\n\n      - name: 'Download PR data'\n        run: |\n          PR_DATA=\"/tmp/pr.json\"\n\n          jq -r \".issue.pull_request.url\" \"$GITHUB_EVENT_PATH\" | \\\n            xargs curl --header 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' -o \"$PR_DATA\" --url\n\n      - name: 'Check fork status'\n        id: fork_status\n        run: |\n          IS_FORK=\"$(jq '.head.repo.fork' \"/tmp/pr.json\")\"\n          echo \"fork=$IS_FORK\" >> \"$GITHUB_OUTPUT\"\n\n      - name: 'Setup SSH deploy key'\n        if: steps.fork_status.outputs.fork == 'false'\n        run: |\n          mkdir ~/.ssh\n          echo \"${{ secrets.DEPLOY_KEY }}\" > ~/.ssh/id_ed25519\n          chmod 600 ~/.ssh/id_ed25519\n\n      - name: 'Checkout code'\n        run: |\n          PR_DATA=\"/tmp/pr.json\"\n\n          HEAD_REF=$(jq -r \".head.ref\" \"$PR_DATA\")\n\n          if [ ${{ steps.fork_status.outputs.fork }} == \"false\" ]; then\n            echo \"::debug::Setting up repo using SSH\"\n            HEAD_REPO=$(jq -r '.head.repo.ssh_url' \"$PR_DATA\")\n          else\n            echo \"::debug::Setting up repo using HTTPS\"\n            HEAD_REPO=$(jq -r '.head.repo.clone_url | sub(\"https://\"; \"https://x-access-token:${{ secrets.GITHUB_TOKEN }}@\")' \"$PR_DATA\")\n          fi\n\n          git clone $HEAD_REPO .\n          git checkout -b \"$HEAD_REF\" \"origin/$HEAD_REF\"\n      - name: Enable corepack to fix https://github.com/actions/setup-node/pull/901\n        run: corepack enable yarn\n      - name: Use Node.js LTS (20.x)\n        uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6\n        with:\n          node-version: 20.x\n          cache: 'yarn'\n      - name: Install project development dependencies\n        run: corepack yarn install --immutable\n      - name: 'Format code'\n        run: ./bin/format.sh\n\n      - name: 'Commit formatted code'\n        run: |\n          # Check if there is nothing to commit (i.e. no formatting changes made)\n          if [ -z \"$(git status --porcelain)\" ]; then\n            echo \"Code is already formatted correctly\"\n            exit 0\n          fi\n\n          # Setup the git user (required to commit anything)\n          git config --global user.email \"github-actions[bot]@users.noreply.github.com\"\n          git config --global user.name \"github-actions[bot]\"\n\n          # Commit the changes made by prettier\n          git add .\n          git commit -m \"[CI] Format code\"\n          git push\n\n      - name: 'Post acknowledgement that it has formatted the code'\n        continue-on-error: true # Never fail the build if this fails\n        uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea\n        with:\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n          script: |\n            github.rest.issues.createComment({\n              issue_number: context.issue.number,\n              owner: context.repo.owner,\n              repo: context.repo.repo,\n              body: 'The \"Format code\" action has finished running.'\n            })\n\n      - name: 'Post reminder to trigger build manually'\n        continue-on-error: true # Never fail the build if this fails\n        if: steps.fork_status.outputs.fork == 'true'\n        uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea\n        with:\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n          script: |\n            github.rest.issues.createComment({\n              issue_number: context.issue.number,\n              owner: context.repo.owner,\n              repo: context.repo.repo,\n              body: 'For security reasons, `/format` does not trigger CI builds when the PR has been submitted from a fork. If checks were not passing due to code format, trigger a build to make the required checks pass, through one of the following ways:\\n\\n- Push an empty commit to this branch: `git commit --allow-empty -m \"Trigger builds\"`.\\n- Close and reopen the PR.\\n- Push a regular commit to this branch.'\n            })\n"
  },
  {
    "path": ".github/workflows/action-sync.yml",
    "content": "name: 'typescript / sync'\n\non:\n  issue_comment:\n    types: [created]\n\njobs:\n  format:\n    name: 'Sync all exercises'\n    runs-on: ubuntu-24.04\n    if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '/sync')\n    steps:\n      - name: 'Post acknowledgement that it will sync exercises'\n        continue-on-error: true # Never fail the build if this fails\n        uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea\n        with:\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n          script: |\n            github.rest.issues.createComment({\n              issue_number: context.issue.number,\n              owner: context.repo.owner,\n              repo: context.repo.repo,\n              body: 'The \"Sync all exercises\" action has started running.'\n            })\n\n      - name: 'Download PR data'\n        run: |\n          PR_DATA=\"/tmp/pr.json\"\n\n          jq -r \".issue.pull_request.url\" \"$GITHUB_EVENT_PATH\" | \\\n            xargs curl --header 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' -o \"$PR_DATA\" --url\n\n      - name: 'Check fork status'\n        id: fork_status\n        run: |\n          IS_FORK=\"$(jq '.head.repo.fork' \"/tmp/pr.json\")\"\n          echo \"fork=$IS_FORK\" >> \"$GITHUB_OUTPUT\"\n\n      - name: 'Setup SSH deploy key'\n        if: steps.fork_status.outputs.fork == 'false'\n        run: |\n          mkdir ~/.ssh\n          echo \"${{ secrets.DEPLOY_KEY }}\" > ~/.ssh/id_ed25519\n          chmod 600 ~/.ssh/id_ed25519\n\n      - name: 'Checkout code'\n        run: |\n          PR_DATA=\"/tmp/pr.json\"\n\n          HEAD_REF=$(jq -r \".head.ref\" \"$PR_DATA\")\n\n          if [ ${{ steps.fork_status.outputs.fork }} == \"false\" ]; then\n            echo \"::debug::Setting up repo using SSH\"\n            HEAD_REPO=$(jq -r '.head.repo.ssh_url' \"$PR_DATA\")\n          else\n            echo \"::debug::Setting up repo using HTTPS\"\n            HEAD_REPO=$(jq -r '.head.repo.clone_url | sub(\"https://\"; \"https://x-access-token:${{ secrets.GITHUB_TOKEN }}@\")' \"$PR_DATA\")\n          fi\n\n          git clone $HEAD_REPO .\n          git checkout -b \"$HEAD_REF\" \"origin/$HEAD_REF\"\n\n      - name: 'Install dependencies'\n        run: |\n          corepack enable yarn\n          corepack yarn install\n      - name: 'Sync exercises'\n        run: corepack yarn sync\n\n      - name: 'Commit changes'\n        run: |\n          # Check if there is nothing to commit (i.e. no syncing changes made)\n          if [ -z \"$(git status --porcelain)\" ]; then\n            echo \"Exercises are already synced correctly\"\n            exit 0\n          fi\n\n          # Setup the git user (required to commit anything)\n          git config --global user.email \"github-actions[bot]@users.noreply.github.com\"\n          git config --global user.name \"github-actions[bot]\"\n\n          # Commit the changes made by prettier\n          git add .\n          git commit -m \"[CI] Sync exercises\"\n          git push\n\n      - name: 'Post acknowledgement that it has synced the code'\n        continue-on-error: true # Never fail the build if this fails\n        uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea\n        with:\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n          script: |\n            github.rest.issues.createComment({\n              issue_number: context.issue.number,\n              owner: context.repo.owner,\n              repo: context.repo.repo,\n              body: 'The \"Sync all exercises\" action has finished running.'\n            })\n\n      - name: 'Post reminder to trigger build manually'\n        continue-on-error: true # Never fail the build if this fails\n        if: steps.fork_status.outputs.fork == 'true'\n        uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea\n        with:\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n          script: |\n            github.rest.issues.createComment({\n              issue_number: context.issue.number,\n              owner: context.repo.owner,\n              repo: context.repo.repo,\n              body: 'For security reasons, `/sync` does not trigger CI builds when the PR has been submitted from a fork. If checks were not passing due to code format, trigger a build to make the required checks pass, through one of the following ways:\\n\\n- Push an empty commit to this branch: `git commit --allow-empty -m \"Trigger builds\"`.\\n- Close and reopen the PR.\\n- Push a regular commit to this branch.'\n            })\n"
  },
  {
    "path": ".github/workflows/ci.js.yml",
    "content": "# This workflow will do a clean install of node dependencies and run tests across different versions of node\n# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions\n\nname: typescript / main\n\non:\n  push:\n    branches: [main]\n\njobs:\n  precheck:\n    runs-on: ubuntu-24.04\n\n    steps:\n      - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871\n\n      - name: Enable corepack to fix https://github.com/actions/setup-node/pull/901\n        run: corepack enable yarn\n\n      - name: Use Node.js LTS (20.x)\n        uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6\n        with:\n          node-version: 20.x\n          cache: 'yarn'\n\n      - name: Install project dependencies\n        run: corepack yarn install --immutable\n\n      - name: Run exercism/typescript ci precheck (checks config, lint code, and runs tests) for all exercises\n        run: corepack yarn ci:check\n\n  ci:\n    runs-on: ubuntu-24.04\n\n    strategy:\n      matrix:\n        node-version: [20.x, 22.x]\n\n    steps:\n      - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871\n      - name: Enable corepack to fix https://github.com/actions/setup-node/pull/901\n        run: corepack enable yarn\n\n      - name: Use Node.js ${{ matrix.node-version }}\n        uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6\n        with:\n          node-version: ${{ matrix.node-version }}\n          cache: 'yarn'\n\n      - name: Install project dependencies\n        run: corepack yarn install --immutable\n\n      - name: Run exercism/typescript ci (checks config, lint code, and runs tests) for all exercises\n        run: corepack yarn ci\n\n  impersonate:\n    # This job tries to run tests for the 'hello-world' exercise, but\n    # simulating what would happen if a student runs the tests standalone.\n    # We do this by removing all project files in the root.\n\n    runs-on: ubuntu-24.04\n\n    steps:\n      - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871\n      - name: Enable corepack to fix https://github.com/actions/setup-node/pull/901\n        run: corepack enable yarn\n\n      - name: Use Node.js 20.x\n        uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6\n        with:\n          node-version: 20.x\n          cache: 'yarn'\n\n      - name: Remove root project files\n        run: rm -f package.json yarn.lock .yarnrc.yml\n\n      - name: Move solution file so that tests pass\n        working-directory: exercises/practice/hello-world\n        run: |\n          rm -f hello-world.ts\n          cp ./.meta/proof.ci.ts hello-world.ts\n\n      - name: Install project dependencies\n        working-directory: exercises/practice/hello-world\n        run: corepack yarn install --no-immutable\n\n      - name: Run tests\n        working-directory: exercises/practice/hello-world\n        run: corepack yarn test\n"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "content": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# You may wish to alter this file to override the set of languages analyzed,\n# or to provide custom queries or build logic.\nname: 'codeql'\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    # The branches below must be a subset of the branches above\n    branches: [main]\n  schedule:\n    - cron: '0 14 * * 5'\n\njobs:\n  analyze:\n    runs-on: ubuntu-24.04\n\n    strategy:\n      fail-fast: false\n      matrix:\n        # Override automatic language detection by changing the below list\n        # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python']\n        language: ['javascript']\n        # Learn more...\n        # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection\n\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v2.3.4\n\n      # Initializes the CodeQL tools for scanning.\n      - name: Initialize CodeQL\n        uses: github/codeql-action/init@v3\n        with:\n          languages: ${{ matrix.language }}\n          # If you wish to specify custom queries, you can do so here or in a config file.\n          # By default, queries listed here will override any specified in a config file.\n          # Prefix the list here with \"+\" to use these queries and those in the config file.\n          # queries: ./path/to/local/query, your-org/your-repo/queries@main\n\n      # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).\n      # If this step fails, then you should remove it and run the build manually (see below)\n      - name: Autobuild\n        uses: github/codeql-action/autobuild@v3\n\n      # ℹ️ Command-line programs to run using the OS shell.\n      # 📚 https://git.io/JvXDl\n\n      # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines\n      #    and modify them (or add more) to build your code if your project\n      #    uses a compiled language\n\n      #- run: |\n      #   make bootstrap\n      #   make release\n\n      - name: Perform CodeQL Analysis\n        uses: github/codeql-action/analyze@v3\n"
  },
  {
    "path": ".github/workflows/configlet.yml",
    "content": "name: Configlet\n\non:\n  pull_request:\n  push:\n    branches:\n      - main\n  workflow_dispatch:\n\npermissions:\n  contents: read\n\njobs:\n  configlet:\n    uses: exercism/github-actions/.github/workflows/configlet.yml@main\n"
  },
  {
    "path": ".github/workflows/no-important-files-changed.yml",
    "content": "name: No important files changed\n\non:\n  pull_request_target:\n    types: [opened]\n    branches: [main]\n    paths:\n      - \"exercises/concept/**\"\n      - \"exercises/practice/**\"\n      - \"!exercises/*/*/.approaches/**\"\n      - \"!exercises/*/*/.articles/**\"\n      - \"!exercises/*/*/.docs/**\"\n      - \"!exercises/*/*/.meta/**\"\n\npermissions:\n  pull-requests: write\n\njobs:\n  check:\n    uses: exercism/github-actions/.github/workflows/check-no-important-files-changed.yml@main\n    with:\n      repository: ${{ github.event.pull_request.head.repo.owner.login }}/${{ github.event.pull_request.head.repo.name }}\n      ref: ${{ github.head_ref }}\n"
  },
  {
    "path": ".github/workflows/pause-community-contributions.yml",
    "content": "name: Pause Community Contributions\n\non:\n  issues:\n    types:\n      - opened\n  pull_request_target:\n    types:\n      - opened\n    paths-ignore:\n      - 'exercises/*/*/.approaches/**'\n      - 'exercises/*/*/.articles/**'\n\npermissions:\n  issues: write\n  pull-requests: write\n\njobs:\n  pause:\n    if: github.repository_owner == 'exercism' # Stops this job from running on forks\n    uses: exercism/github-actions/.github/workflows/community-contributions.yml@main\n    with:\n      forum_category: typescript\n    secrets:\n      github_membership_token: ${{ secrets.COMMUNITY_CONTRIBUTIONS_WORKFLOW_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/ping-cross-track-maintainers-team.yml",
    "content": "name: Ping cross-track maintainers team\n\non:\n  pull_request_target:\n    types:\n      - opened\n\npermissions:\n  pull-requests: write\n\njobs:\n  ping:\n    if: github.repository_owner == 'exercism' # Stops this job from running on forks\n    uses: exercism/github-actions/.github/workflows/ping-cross-track-maintainers-team.yml@main\n    secrets:\n      github_membership_token: ${{ secrets.COMMUNITY_CONTRIBUTIONS_WORKFLOW_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/pr.ci.js.yml",
    "content": "# This workflow will do a clean install of node dependencies and run tests across different versions of node\n# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions\n\nname: typescript / pr\n\non: pull_request\n\njobs:\n  precheck:\n    runs-on: ubuntu-24.04\n\n    steps:\n      - name: Checkout PR\n        uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871\n        with:\n          fetch-depth: ${{ github.event_name == 'pull_request' && 2 || 0 }}\n\n      - name: Get changed files\n        id: changed-files\n        run: |\n          if ${{ github.event_name == 'pull_request' }}; then\n              echo \"changed_files=$(git diff --name-only --diff-filter=ACM -r HEAD^1 HEAD | xargs)\" >> $GITHUB_OUTPUT\n          else\n              echo \"changed_files=$(git diff --name-only --diff-filter=ACM ${{ github.event.before }} ${{ github.event.after }} | xargs)\" >> $GITHUB_OUTPUT\n          fi\n\n      - name: Enable corepack to fix https://github.com/actions/setup-node/pull/901\n        run: corepack enable yarn\n\n      - name: Use Node.js LTS (20.x)\n        uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6\n        with:\n          node-version: 20.x\n          cache: 'yarn'\n\n      - name: Install project dependencies\n        run: corepack yarn install --immutable\n\n      - name: Run exercism/typescript ci precheck (stub files, config integrity) for changed exercises\n        run: corepack yarn node scripts/pr-check.mjs ${{ steps.changed-files.outputs.changed_files }}\n\n  ci:\n    runs-on: ubuntu-24.04\n\n    strategy:\n      matrix:\n        node-version: [20.x, 22.x]\n\n    steps:\n      - name: Checkout PR\n        uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871\n        with:\n          fetch-depth: ${{ github.event_name == 'pull_request' && 2 || 0 }}\n\n      - name: Get changed files\n        id: changed-files\n        run: |\n          if ${{ github.event_name == 'pull_request' }}; then\n              echo \"changed_files=$(git diff --name-only --diff-filter=ACM -r HEAD^1 HEAD | xargs)\" >> $GITHUB_OUTPUT\n          else\n              echo \"changed_files=$(git diff --name-only --diff-filter=ACM ${{ github.event.before }} ${{ github.event.after }} | xargs)\" >> $GITHUB_OUTPUT\n          fi\n\n      - name: Enable corepack to fix https://github.com/actions/setup-node/pull/901\n        run: corepack enable yarn\n\n      - name: Use Node.js ${{ matrix.node-version }}\n        uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6\n        with:\n          node-version: ${{ matrix.node-version }}\n          cache: 'yarn'\n\n      - name: Install project dependencies\n        run: corepack yarn install --immutable\n\n      - name: Run exercism/typescript ci (runs tests) for changed/added exercises\n        run: corepack yarn node scripts/pr.mjs ${{ steps.changed-files.outputs.changed_files }}\n\n  impersonate:\n    # This job tries to run tests for the 'hello-world' exercise, but\n    # simulating what would happen if a student runs the tests standalone.\n    # We do this by removing all project files in the root.\n\n    runs-on: ubuntu-24.04\n\n    steps:\n      - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871\n      - name: Enable corepack to fix https://github.com/actions/setup-node/pull/901\n        run: corepack enable yarn\n\n      - name: Use Node.js 20.x\n        uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6\n        with:\n          node-version: 20.x\n          cache: 'yarn'\n\n      - name: Remove root project files\n        run: rm -f package.json yarn.lock .yarnrc.yml\n\n      - name: Move solution file so that tests pass\n        working-directory: exercises/practice/hello-world\n        run: |\n          rm -f hello-world.ts\n          cp ./.meta/proof.ci.ts hello-world.ts\n\n      - name: Install project dependencies\n        working-directory: exercises/practice/hello-world\n        run: corepack yarn install --no-immutable\n\n      - name: Run tests\n        working-directory: exercises/practice/hello-world\n        run: corepack yarn test\n"
  },
  {
    "path": ".github/workflows/run-configlet-sync.yml",
    "content": "name: Run Configlet Sync\n\non:\n  workflow_dispatch:\n  schedule:\n    - cron: '0 0 15 * *'\n\njobs:\n  call-gha-workflow:\n    uses: exercism/github-actions/.github/workflows/configlet-sync.yml@main\n"
  },
  {
    "path": ".github/workflows/sync-labels.yml",
    "content": "name: Tools\n\non:\n  push:\n    branches:\n      - main\n    paths:\n      - .github/labels.yml\n      - .github/workflows/sync-labels.yml\n  workflow_dispatch:\n  schedule:\n    - cron: 0 0 1 * * # First day of each month\n\npermissions:\n  issues: write\n\njobs:\n  sync-labels:\n    uses: exercism/github-actions/.github/workflows/labels.yml@main\n"
  },
  {
    "path": ".github/workflows/verify-code-formatting.yml",
    "content": "name: typescript / format\n\non:\n  push:\n  pull_request:\n  workflow_dispatch:\n\njobs:\n  verify:\n    runs-on: ubuntu-24.04\n    steps:\n      - name: 'Checkout code'\n        uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871\n\n      - name: 'Verify formatting of all files'\n        run: ./bin/check-formatting.sh\n"
  },
  {
    "path": ".gitignore",
    "content": "*.swp\n.DS_Store\n.idea\nnpm-debug.log\nbuild\nbabel-output\nlintreport.json\ndebug.log\n\n# Binaries downloaded by binary download scripts\nbin/configlet\nbin/configlet.exe\n\n# Node modules\n/exercises/**/node_modules\n/common/node_modules\n/node_modules\n\n# Yarn files\n/exercises/**/.pnp.*\n/exercises/**/.yarn/*\n!/exercises/**/.yarn/patches\n!/exercises/**/.yarn/plugins\n!/exercises/**/.yarn/releases\n!/exercises/**/.yarn/sdks\n!/exercises/**/.yarn/versions\n\n/common/.pnp.*\n/common/.yarn/*\n!/common/.yarn/patches\n!/common/.yarn/plugins\n!/common/.yarn/releases\n!/common/.yarn/sdks\n!/common/.yarn/versions\n\n/.pnp.*\n/.yarn/*\n!/.yarn/patches\n!/.yarn/plugins\n!/.yarn/releases\n!/.yarn/sdks\n!/.yarn/versions\n\n# Maintainer specific generated files\n/tmp_exercises\n/tmp\nexercise-package.json\n"
  },
  {
    "path": ".prettierignore",
    "content": "/.github/labels.yml\n/.github/workflows/sync-labels.yml\n/.github/workflows/no-important-files-changed.yml\nexercises/**/README.md\n!/README.md\n\n.vscode/**/*\n.yarn/**/*\n\n# Originates from https://github.com/exercism/org-wide-files\nCODE_OF_CONDUCT.md\nLICENSE\n\n# These are formatted via configlet and will not match prettier\nexercises/**/.meta/config.json\nexercises/**/.approaches/config.json\nconfig.json\n\n# Originates from https://github.com/exercism/problem-specifications\nexercises/practice/**/.docs/instructions.md\nexercises/practice/**/.docs/introduction.md\n"
  },
  {
    "path": ".prettierrc",
    "content": "{\n  \"trailingComma\": \"es5\",\n  \"tabWidth\": 2,\n  \"semi\": false,\n  \"singleQuote\": true,\n  \"arrowParens\": \"always\",\n  \"printWidth\": 80,\n  \"endOfLine\": \"lf\"\n}\n"
  },
  {
    "path": ".vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\n    \"exercism\"\n  ],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  },\n  \"eslint.nodePath\": \".yarn/sdks\",\n  \"prettier.prettierPath\": \".yarn/sdks/prettier/index.cjs\",\n  \"typescript.tsdk\": \".yarn/sdks/typescript/lib\",\n  \"typescript.enablePromptUseWorkspaceTsdk\": true\n}\n"
  },
  {
    "path": ".yarn/sdks/eslint/bin/eslint.js",
    "content": "#!/usr/bin/env node\n\nconst {existsSync} = require(`fs`);\nconst {createRequire, register} = require(`module`);\nconst {resolve} = require(`path`);\nconst {pathToFileURL} = require(`url`);\n\nconst relPnpApiPath = \"../../../../.pnp.cjs\";\n\nconst absPnpApiPath = resolve(__dirname, relPnpApiPath);\nconst absRequire = createRequire(absPnpApiPath);\n\nconst absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);\nconst isPnpLoaderEnabled = existsSync(absPnpLoaderPath);\n\nif (existsSync(absPnpApiPath)) {\n  if (!process.versions.pnp) {\n    // Setup the environment to be able to require eslint/bin/eslint.js\n    require(absPnpApiPath).setup();\n    if (isPnpLoaderEnabled && register) {\n      register(pathToFileURL(absPnpLoaderPath));\n    }\n  }\n}\n\n// Defer to the real eslint/bin/eslint.js your application uses\nmodule.exports = absRequire(`eslint/bin/eslint.js`);\n"
  },
  {
    "path": ".yarn/sdks/eslint/lib/api.js",
    "content": "#!/usr/bin/env node\n\nconst {existsSync} = require(`fs`);\nconst {createRequire, register} = require(`module`);\nconst {resolve} = require(`path`);\nconst {pathToFileURL} = require(`url`);\n\nconst relPnpApiPath = \"../../../../.pnp.cjs\";\n\nconst absPnpApiPath = resolve(__dirname, relPnpApiPath);\nconst absRequire = createRequire(absPnpApiPath);\n\nconst absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);\nconst isPnpLoaderEnabled = existsSync(absPnpLoaderPath);\n\nif (existsSync(absPnpApiPath)) {\n  if (!process.versions.pnp) {\n    // Setup the environment to be able to require eslint\n    require(absPnpApiPath).setup();\n    if (isPnpLoaderEnabled && register) {\n      register(pathToFileURL(absPnpLoaderPath));\n    }\n  }\n}\n\n// Defer to the real eslint your application uses\nmodule.exports = absRequire(`eslint`);\n"
  },
  {
    "path": ".yarn/sdks/eslint/lib/unsupported-api.js",
    "content": "#!/usr/bin/env node\n\nconst {existsSync} = require(`fs`);\nconst {createRequire, register} = require(`module`);\nconst {resolve} = require(`path`);\nconst {pathToFileURL} = require(`url`);\n\nconst relPnpApiPath = \"../../../../.pnp.cjs\";\n\nconst absPnpApiPath = resolve(__dirname, relPnpApiPath);\nconst absRequire = createRequire(absPnpApiPath);\n\nconst absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);\nconst isPnpLoaderEnabled = existsSync(absPnpLoaderPath);\n\nif (existsSync(absPnpApiPath)) {\n  if (!process.versions.pnp) {\n    // Setup the environment to be able to require eslint/use-at-your-own-risk\n    require(absPnpApiPath).setup();\n    if (isPnpLoaderEnabled && register) {\n      register(pathToFileURL(absPnpLoaderPath));\n    }\n  }\n}\n\n// Defer to the real eslint/use-at-your-own-risk your application uses\nmodule.exports = absRequire(`eslint/use-at-your-own-risk`);\n"
  },
  {
    "path": ".yarn/sdks/eslint/package.json",
    "content": "{\n  \"name\": \"eslint\",\n  \"version\": \"9.8.0-sdk\",\n  \"main\": \"./lib/api.js\",\n  \"type\": \"commonjs\",\n  \"bin\": {\n    \"eslint\": \"./bin/eslint.js\"\n  },\n  \"exports\": {\n    \"./package.json\": \"./package.json\",\n    \".\": \"./lib/api.js\",\n    \"./use-at-your-own-risk\": \"./lib/unsupported-api.js\"\n  }\n}\n"
  },
  {
    "path": ".yarn/sdks/integrations.yml",
    "content": "# This file is automatically generated by @yarnpkg/sdks.\n# Manual changes might be lost!\n\nintegrations:\n  - vscode\n"
  },
  {
    "path": ".yarn/sdks/prettier/bin/prettier.cjs",
    "content": "#!/usr/bin/env node\n\nconst {existsSync} = require(`fs`);\nconst {createRequire, register} = require(`module`);\nconst {resolve} = require(`path`);\nconst {pathToFileURL} = require(`url`);\n\nconst relPnpApiPath = \"../../../../.pnp.cjs\";\n\nconst absPnpApiPath = resolve(__dirname, relPnpApiPath);\nconst absRequire = createRequire(absPnpApiPath);\n\nconst absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);\nconst isPnpLoaderEnabled = existsSync(absPnpLoaderPath);\n\nif (existsSync(absPnpApiPath)) {\n  if (!process.versions.pnp) {\n    // Setup the environment to be able to require prettier/bin/prettier.cjs\n    require(absPnpApiPath).setup();\n    if (isPnpLoaderEnabled && register) {\n      register(pathToFileURL(absPnpLoaderPath));\n    }\n  }\n}\n\n// Defer to the real prettier/bin/prettier.cjs your application uses\nmodule.exports = absRequire(`prettier/bin/prettier.cjs`);\n"
  },
  {
    "path": ".yarn/sdks/prettier/index.cjs",
    "content": "#!/usr/bin/env node\n\nconst {existsSync} = require(`fs`);\nconst {createRequire, register} = require(`module`);\nconst {resolve} = require(`path`);\nconst {pathToFileURL} = require(`url`);\n\nconst relPnpApiPath = \"../../../.pnp.cjs\";\n\nconst absPnpApiPath = resolve(__dirname, relPnpApiPath);\nconst absRequire = createRequire(absPnpApiPath);\n\nconst absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);\nconst isPnpLoaderEnabled = existsSync(absPnpLoaderPath);\n\nif (existsSync(absPnpApiPath)) {\n  if (!process.versions.pnp) {\n    // Setup the environment to be able to require prettier\n    require(absPnpApiPath).setup();\n    if (isPnpLoaderEnabled && register) {\n      register(pathToFileURL(absPnpLoaderPath));\n    }\n  }\n}\n\n// Defer to the real prettier your application uses\nmodule.exports = absRequire(`prettier`);\n"
  },
  {
    "path": ".yarn/sdks/prettier/package.json",
    "content": "{\n  \"name\": \"prettier\",\n  \"version\": \"3.3.3-sdk\",\n  \"main\": \"./index.cjs\",\n  \"type\": \"commonjs\",\n  \"bin\": \"./bin/prettier.cjs\"\n}\n"
  },
  {
    "path": ".yarn/sdks/typescript/bin/tsc",
    "content": "#!/usr/bin/env node\n\nconst {existsSync} = require(`fs`);\nconst {createRequire, register} = require(`module`);\nconst {resolve} = require(`path`);\nconst {pathToFileURL} = require(`url`);\n\nconst relPnpApiPath = \"../../../../.pnp.cjs\";\n\nconst absPnpApiPath = resolve(__dirname, relPnpApiPath);\nconst absRequire = createRequire(absPnpApiPath);\n\nconst absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);\nconst isPnpLoaderEnabled = existsSync(absPnpLoaderPath);\n\nif (existsSync(absPnpApiPath)) {\n  if (!process.versions.pnp) {\n    // Setup the environment to be able to require typescript/bin/tsc\n    require(absPnpApiPath).setup();\n    if (isPnpLoaderEnabled && register) {\n      register(pathToFileURL(absPnpLoaderPath));\n    }\n  }\n}\n\n// Defer to the real typescript/bin/tsc your application uses\nmodule.exports = absRequire(`typescript/bin/tsc`);\n"
  },
  {
    "path": ".yarn/sdks/typescript/bin/tsserver",
    "content": "#!/usr/bin/env node\n\nconst {existsSync} = require(`fs`);\nconst {createRequire, register} = require(`module`);\nconst {resolve} = require(`path`);\nconst {pathToFileURL} = require(`url`);\n\nconst relPnpApiPath = \"../../../../.pnp.cjs\";\n\nconst absPnpApiPath = resolve(__dirname, relPnpApiPath);\nconst absRequire = createRequire(absPnpApiPath);\n\nconst absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);\nconst isPnpLoaderEnabled = existsSync(absPnpLoaderPath);\n\nif (existsSync(absPnpApiPath)) {\n  if (!process.versions.pnp) {\n    // Setup the environment to be able to require typescript/bin/tsserver\n    require(absPnpApiPath).setup();\n    if (isPnpLoaderEnabled && register) {\n      register(pathToFileURL(absPnpLoaderPath));\n    }\n  }\n}\n\n// Defer to the real typescript/bin/tsserver your application uses\nmodule.exports = absRequire(`typescript/bin/tsserver`);\n"
  },
  {
    "path": ".yarn/sdks/typescript/lib/tsc.js",
    "content": "#!/usr/bin/env node\n\nconst {existsSync} = require(`fs`);\nconst {createRequire, register} = require(`module`);\nconst {resolve} = require(`path`);\nconst {pathToFileURL} = require(`url`);\n\nconst relPnpApiPath = \"../../../../.pnp.cjs\";\n\nconst absPnpApiPath = resolve(__dirname, relPnpApiPath);\nconst absRequire = createRequire(absPnpApiPath);\n\nconst absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);\nconst isPnpLoaderEnabled = existsSync(absPnpLoaderPath);\n\nif (existsSync(absPnpApiPath)) {\n  if (!process.versions.pnp) {\n    // Setup the environment to be able to require typescript/lib/tsc.js\n    require(absPnpApiPath).setup();\n    if (isPnpLoaderEnabled && register) {\n      register(pathToFileURL(absPnpLoaderPath));\n    }\n  }\n}\n\n// Defer to the real typescript/lib/tsc.js your application uses\nmodule.exports = absRequire(`typescript/lib/tsc.js`);\n"
  },
  {
    "path": ".yarn/sdks/typescript/lib/tsserver.js",
    "content": "#!/usr/bin/env node\n\nconst {existsSync} = require(`fs`);\nconst {createRequire, register} = require(`module`);\nconst {resolve} = require(`path`);\nconst {pathToFileURL} = require(`url`);\n\nconst relPnpApiPath = \"../../../../.pnp.cjs\";\n\nconst absPnpApiPath = resolve(__dirname, relPnpApiPath);\nconst absRequire = createRequire(absPnpApiPath);\n\nconst absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);\nconst isPnpLoaderEnabled = existsSync(absPnpLoaderPath);\n\nif (existsSync(absPnpApiPath)) {\n  if (!process.versions.pnp) {\n    // Setup the environment to be able to require typescript/lib/tsserver.js\n    require(absPnpApiPath).setup();\n    if (isPnpLoaderEnabled && register) {\n      register(pathToFileURL(absPnpLoaderPath));\n    }\n  }\n}\n\nconst moduleWrapper = tsserver => {\n  if (!process.versions.pnp) {\n    return tsserver;\n  }\n\n  const {isAbsolute} = require(`path`);\n  const pnpApi = require(`pnpapi`);\n\n  const isVirtual = str => str.match(/\\/(\\$\\$virtual|__virtual__)\\//);\n  const isPortal = str => str.startsWith(\"portal:/\");\n  const normalize = str => str.replace(/\\\\/g, `/`).replace(/^\\/?/, `/`);\n\n  const dependencyTreeRoots = new Set(pnpApi.getDependencyTreeRoots().map(locator => {\n    return `${locator.name}@${locator.reference}`;\n  }));\n\n  // VSCode sends the zip paths to TS using the \"zip://\" prefix, that TS\n  // doesn't understand. This layer makes sure to remove the protocol\n  // before forwarding it to TS, and to add it back on all returned paths.\n\n  function toEditorPath(str) {\n    // We add the `zip:` prefix to both `.zip/` paths and virtual paths\n    if (isAbsolute(str) && !str.match(/^\\^?(zip:|\\/zip\\/)/) && (str.match(/\\.zip\\//) || isVirtual(str))) {\n      // We also take the opportunity to turn virtual paths into physical ones;\n      // this makes it much easier to work with workspaces that list peer\n      // dependencies, since otherwise Ctrl+Click would bring us to the virtual\n      // file instances instead of the real ones.\n      //\n      // We only do this to modules owned by the the dependency tree roots.\n      // This avoids breaking the resolution when jumping inside a vendor\n      // with peer dep (otherwise jumping into react-dom would show resolution\n      // errors on react).\n      //\n      const resolved = isVirtual(str) ? pnpApi.resolveVirtual(str) : str;\n      if (resolved) {\n        const locator = pnpApi.findPackageLocator(resolved);\n        if (locator && (dependencyTreeRoots.has(`${locator.name}@${locator.reference}`) || isPortal(locator.reference))) {\n          str = resolved;\n        }\n      }\n\n      str = normalize(str);\n\n      if (str.match(/\\.zip\\//)) {\n        switch (hostInfo) {\n          // Absolute VSCode `Uri.fsPath`s need to start with a slash.\n          // VSCode only adds it automatically for supported schemes,\n          // so we have to do it manually for the `zip` scheme.\n          // The path needs to start with a caret otherwise VSCode doesn't handle the protocol\n          //\n          // Ref: https://github.com/microsoft/vscode/issues/105014#issuecomment-686760910\n          //\n          // 2021-10-08: VSCode changed the format in 1.61.\n          // Before | ^zip:/c:/foo/bar.zip/package.json\n          // After  | ^/zip//c:/foo/bar.zip/package.json\n          //\n          // 2022-04-06: VSCode changed the format in 1.66.\n          // Before | ^/zip//c:/foo/bar.zip/package.json\n          // After  | ^/zip/c:/foo/bar.zip/package.json\n          //\n          // 2022-05-06: VSCode changed the format in 1.68\n          // Before | ^/zip/c:/foo/bar.zip/package.json\n          // After  | ^/zip//c:/foo/bar.zip/package.json\n          //\n          case `vscode <1.61`: {\n            str = `^zip:${str}`;\n          } break;\n\n          case `vscode <1.66`: {\n            str = `^/zip/${str}`;\n          } break;\n\n          case `vscode <1.68`: {\n            str = `^/zip${str}`;\n          } break;\n\n          case `vscode`: {\n            str = `^/zip/${str}`;\n          } break;\n\n          // To make \"go to definition\" work,\n          // We have to resolve the actual file system path from virtual path\n          // and convert scheme to supported by [vim-rzip](https://github.com/lbrayner/vim-rzip)\n          case `coc-nvim`: {\n            str = normalize(resolved).replace(/\\.zip\\//, `.zip::`);\n            str = resolve(`zipfile:${str}`);\n          } break;\n\n          // Support neovim native LSP and [typescript-language-server](https://github.com/theia-ide/typescript-language-server)\n          // We have to resolve the actual file system path from virtual path,\n          // everything else is up to neovim\n          case `neovim`: {\n            str = normalize(resolved).replace(/\\.zip\\//, `.zip::`);\n            str = `zipfile://${str}`;\n          } break;\n\n          default: {\n            str = `zip:${str}`;\n          } break;\n        }\n      } else {\n        str = str.replace(/^\\/?/, process.platform === `win32` ? `` : `/`);\n      }\n    }\n\n    return str;\n  }\n\n  function fromEditorPath(str) {\n    switch (hostInfo) {\n      case `coc-nvim`: {\n        str = str.replace(/\\.zip::/, `.zip/`);\n        // The path for coc-nvim is in format of /<pwd>/zipfile:/<pwd>/.yarn/...\n        // So in order to convert it back, we use .* to match all the thing\n        // before `zipfile:`\n        return process.platform === `win32`\n          ? str.replace(/^.*zipfile:\\//, ``)\n          : str.replace(/^.*zipfile:/, ``);\n      } break;\n\n      case `neovim`: {\n        str = str.replace(/\\.zip::/, `.zip/`);\n        // The path for neovim is in format of zipfile:///<pwd>/.yarn/...\n        return str.replace(/^zipfile:\\/\\//, ``);\n      } break;\n\n      case `vscode`:\n      default: {\n        return str.replace(/^\\^?(zip:|\\/zip(\\/ts-nul-authority)?)\\/+/, process.platform === `win32` ? `` : `/`)\n      } break;\n    }\n  }\n\n  // Force enable 'allowLocalPluginLoads'\n  // TypeScript tries to resolve plugins using a path relative to itself\n  // which doesn't work when using the global cache\n  // https://github.com/microsoft/TypeScript/blob/1b57a0395e0bff191581c9606aab92832001de62/src/server/project.ts#L2238\n  // VSCode doesn't want to enable 'allowLocalPluginLoads' due to security concerns but\n  // TypeScript already does local loads and if this code is running the user trusts the workspace\n  // https://github.com/microsoft/vscode/issues/45856\n  const ConfiguredProject = tsserver.server.ConfiguredProject;\n  const {enablePluginsWithOptions: originalEnablePluginsWithOptions} = ConfiguredProject.prototype;\n  ConfiguredProject.prototype.enablePluginsWithOptions = function() {\n    this.projectService.allowLocalPluginLoads = true;\n    return originalEnablePluginsWithOptions.apply(this, arguments);\n  };\n\n  // And here is the point where we hijack the VSCode <-> TS communications\n  // by adding ourselves in the middle. We locate everything that looks\n  // like an absolute path of ours and normalize it.\n\n  const Session = tsserver.server.Session;\n  const {onMessage: originalOnMessage, send: originalSend} = Session.prototype;\n  let hostInfo = `unknown`;\n\n  Object.assign(Session.prototype, {\n    onMessage(/** @type {string | object} */ message) {\n      const isStringMessage = typeof message === 'string';\n      const parsedMessage = isStringMessage ? JSON.parse(message) : message;\n\n      if (\n        parsedMessage != null &&\n        typeof parsedMessage === `object` &&\n        parsedMessage.arguments &&\n        typeof parsedMessage.arguments.hostInfo === `string`\n      ) {\n        hostInfo = parsedMessage.arguments.hostInfo;\n        if (hostInfo === `vscode` && process.env.VSCODE_IPC_HOOK) {\n          const [, major, minor] = (process.env.VSCODE_IPC_HOOK.match(\n            // The RegExp from https://semver.org/ but without the caret at the start\n            /(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-]+)*))?$/\n          ) ?? []).map(Number)\n\n          if (major === 1) {\n            if (minor < 61) {\n              hostInfo += ` <1.61`;\n            } else if (minor < 66) {\n              hostInfo += ` <1.66`;\n            } else if (minor < 68) {\n              hostInfo += ` <1.68`;\n            }\n          }\n        }\n      }\n\n      const processedMessageJSON = JSON.stringify(parsedMessage, (key, value) => {\n        return typeof value === 'string' ? fromEditorPath(value) : value;\n      });\n\n      return originalOnMessage.call(\n        this,\n        isStringMessage ? processedMessageJSON : JSON.parse(processedMessageJSON)\n      );\n    },\n\n    send(/** @type {any} */ msg) {\n      return originalSend.call(this, JSON.parse(JSON.stringify(msg, (key, value) => {\n        return typeof value === `string` ? toEditorPath(value) : value;\n      })));\n    }\n  });\n\n  return tsserver;\n};\n\nconst [major, minor] = absRequire(`typescript/package.json`).version.split(`.`, 2).map(value => parseInt(value, 10));\n// In TypeScript@>=5.5 the tsserver uses the public TypeScript API so that needs to be patched as well.\n// Ref https://github.com/microsoft/TypeScript/pull/55326\nif (major > 5 || (major === 5 && minor >= 5)) {\n  moduleWrapper(absRequire(`typescript`));\n}\n\n// Defer to the real typescript/lib/tsserver.js your application uses\nmodule.exports = moduleWrapper(absRequire(`typescript/lib/tsserver.js`));\n"
  },
  {
    "path": ".yarn/sdks/typescript/lib/tsserverlibrary.js",
    "content": "#!/usr/bin/env node\n\nconst {existsSync} = require(`fs`);\nconst {createRequire, register} = require(`module`);\nconst {resolve} = require(`path`);\nconst {pathToFileURL} = require(`url`);\n\nconst relPnpApiPath = \"../../../../.pnp.cjs\";\n\nconst absPnpApiPath = resolve(__dirname, relPnpApiPath);\nconst absRequire = createRequire(absPnpApiPath);\n\nconst absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);\nconst isPnpLoaderEnabled = existsSync(absPnpLoaderPath);\n\nif (existsSync(absPnpApiPath)) {\n  if (!process.versions.pnp) {\n    // Setup the environment to be able to require typescript/lib/tsserverlibrary.js\n    require(absPnpApiPath).setup();\n    if (isPnpLoaderEnabled && register) {\n      register(pathToFileURL(absPnpLoaderPath));\n    }\n  }\n}\n\nconst moduleWrapper = tsserver => {\n  if (!process.versions.pnp) {\n    return tsserver;\n  }\n\n  const {isAbsolute} = require(`path`);\n  const pnpApi = require(`pnpapi`);\n\n  const isVirtual = str => str.match(/\\/(\\$\\$virtual|__virtual__)\\//);\n  const isPortal = str => str.startsWith(\"portal:/\");\n  const normalize = str => str.replace(/\\\\/g, `/`).replace(/^\\/?/, `/`);\n\n  const dependencyTreeRoots = new Set(pnpApi.getDependencyTreeRoots().map(locator => {\n    return `${locator.name}@${locator.reference}`;\n  }));\n\n  // VSCode sends the zip paths to TS using the \"zip://\" prefix, that TS\n  // doesn't understand. This layer makes sure to remove the protocol\n  // before forwarding it to TS, and to add it back on all returned paths.\n\n  function toEditorPath(str) {\n    // We add the `zip:` prefix to both `.zip/` paths and virtual paths\n    if (isAbsolute(str) && !str.match(/^\\^?(zip:|\\/zip\\/)/) && (str.match(/\\.zip\\//) || isVirtual(str))) {\n      // We also take the opportunity to turn virtual paths into physical ones;\n      // this makes it much easier to work with workspaces that list peer\n      // dependencies, since otherwise Ctrl+Click would bring us to the virtual\n      // file instances instead of the real ones.\n      //\n      // We only do this to modules owned by the the dependency tree roots.\n      // This avoids breaking the resolution when jumping inside a vendor\n      // with peer dep (otherwise jumping into react-dom would show resolution\n      // errors on react).\n      //\n      const resolved = isVirtual(str) ? pnpApi.resolveVirtual(str) : str;\n      if (resolved) {\n        const locator = pnpApi.findPackageLocator(resolved);\n        if (locator && (dependencyTreeRoots.has(`${locator.name}@${locator.reference}`) || isPortal(locator.reference))) {\n          str = resolved;\n        }\n      }\n\n      str = normalize(str);\n\n      if (str.match(/\\.zip\\//)) {\n        switch (hostInfo) {\n          // Absolute VSCode `Uri.fsPath`s need to start with a slash.\n          // VSCode only adds it automatically for supported schemes,\n          // so we have to do it manually for the `zip` scheme.\n          // The path needs to start with a caret otherwise VSCode doesn't handle the protocol\n          //\n          // Ref: https://github.com/microsoft/vscode/issues/105014#issuecomment-686760910\n          //\n          // 2021-10-08: VSCode changed the format in 1.61.\n          // Before | ^zip:/c:/foo/bar.zip/package.json\n          // After  | ^/zip//c:/foo/bar.zip/package.json\n          //\n          // 2022-04-06: VSCode changed the format in 1.66.\n          // Before | ^/zip//c:/foo/bar.zip/package.json\n          // After  | ^/zip/c:/foo/bar.zip/package.json\n          //\n          // 2022-05-06: VSCode changed the format in 1.68\n          // Before | ^/zip/c:/foo/bar.zip/package.json\n          // After  | ^/zip//c:/foo/bar.zip/package.json\n          //\n          case `vscode <1.61`: {\n            str = `^zip:${str}`;\n          } break;\n\n          case `vscode <1.66`: {\n            str = `^/zip/${str}`;\n          } break;\n\n          case `vscode <1.68`: {\n            str = `^/zip${str}`;\n          } break;\n\n          case `vscode`: {\n            str = `^/zip/${str}`;\n          } break;\n\n          // To make \"go to definition\" work,\n          // We have to resolve the actual file system path from virtual path\n          // and convert scheme to supported by [vim-rzip](https://github.com/lbrayner/vim-rzip)\n          case `coc-nvim`: {\n            str = normalize(resolved).replace(/\\.zip\\//, `.zip::`);\n            str = resolve(`zipfile:${str}`);\n          } break;\n\n          // Support neovim native LSP and [typescript-language-server](https://github.com/theia-ide/typescript-language-server)\n          // We have to resolve the actual file system path from virtual path,\n          // everything else is up to neovim\n          case `neovim`: {\n            str = normalize(resolved).replace(/\\.zip\\//, `.zip::`);\n            str = `zipfile://${str}`;\n          } break;\n\n          default: {\n            str = `zip:${str}`;\n          } break;\n        }\n      } else {\n        str = str.replace(/^\\/?/, process.platform === `win32` ? `` : `/`);\n      }\n    }\n\n    return str;\n  }\n\n  function fromEditorPath(str) {\n    switch (hostInfo) {\n      case `coc-nvim`: {\n        str = str.replace(/\\.zip::/, `.zip/`);\n        // The path for coc-nvim is in format of /<pwd>/zipfile:/<pwd>/.yarn/...\n        // So in order to convert it back, we use .* to match all the thing\n        // before `zipfile:`\n        return process.platform === `win32`\n          ? str.replace(/^.*zipfile:\\//, ``)\n          : str.replace(/^.*zipfile:/, ``);\n      } break;\n\n      case `neovim`: {\n        str = str.replace(/\\.zip::/, `.zip/`);\n        // The path for neovim is in format of zipfile:///<pwd>/.yarn/...\n        return str.replace(/^zipfile:\\/\\//, ``);\n      } break;\n\n      case `vscode`:\n      default: {\n        return str.replace(/^\\^?(zip:|\\/zip(\\/ts-nul-authority)?)\\/+/, process.platform === `win32` ? `` : `/`)\n      } break;\n    }\n  }\n\n  // Force enable 'allowLocalPluginLoads'\n  // TypeScript tries to resolve plugins using a path relative to itself\n  // which doesn't work when using the global cache\n  // https://github.com/microsoft/TypeScript/blob/1b57a0395e0bff191581c9606aab92832001de62/src/server/project.ts#L2238\n  // VSCode doesn't want to enable 'allowLocalPluginLoads' due to security concerns but\n  // TypeScript already does local loads and if this code is running the user trusts the workspace\n  // https://github.com/microsoft/vscode/issues/45856\n  const ConfiguredProject = tsserver.server.ConfiguredProject;\n  const {enablePluginsWithOptions: originalEnablePluginsWithOptions} = ConfiguredProject.prototype;\n  ConfiguredProject.prototype.enablePluginsWithOptions = function() {\n    this.projectService.allowLocalPluginLoads = true;\n    return originalEnablePluginsWithOptions.apply(this, arguments);\n  };\n\n  // And here is the point where we hijack the VSCode <-> TS communications\n  // by adding ourselves in the middle. We locate everything that looks\n  // like an absolute path of ours and normalize it.\n\n  const Session = tsserver.server.Session;\n  const {onMessage: originalOnMessage, send: originalSend} = Session.prototype;\n  let hostInfo = `unknown`;\n\n  Object.assign(Session.prototype, {\n    onMessage(/** @type {string | object} */ message) {\n      const isStringMessage = typeof message === 'string';\n      const parsedMessage = isStringMessage ? JSON.parse(message) : message;\n\n      if (\n        parsedMessage != null &&\n        typeof parsedMessage === `object` &&\n        parsedMessage.arguments &&\n        typeof parsedMessage.arguments.hostInfo === `string`\n      ) {\n        hostInfo = parsedMessage.arguments.hostInfo;\n        if (hostInfo === `vscode` && process.env.VSCODE_IPC_HOOK) {\n          const [, major, minor] = (process.env.VSCODE_IPC_HOOK.match(\n            // The RegExp from https://semver.org/ but without the caret at the start\n            /(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-]+)*))?$/\n          ) ?? []).map(Number)\n\n          if (major === 1) {\n            if (minor < 61) {\n              hostInfo += ` <1.61`;\n            } else if (minor < 66) {\n              hostInfo += ` <1.66`;\n            } else if (minor < 68) {\n              hostInfo += ` <1.68`;\n            }\n          }\n        }\n      }\n\n      const processedMessageJSON = JSON.stringify(parsedMessage, (key, value) => {\n        return typeof value === 'string' ? fromEditorPath(value) : value;\n      });\n\n      return originalOnMessage.call(\n        this,\n        isStringMessage ? processedMessageJSON : JSON.parse(processedMessageJSON)\n      );\n    },\n\n    send(/** @type {any} */ msg) {\n      return originalSend.call(this, JSON.parse(JSON.stringify(msg, (key, value) => {\n        return typeof value === `string` ? toEditorPath(value) : value;\n      })));\n    }\n  });\n\n  return tsserver;\n};\n\nconst [major, minor] = absRequire(`typescript/package.json`).version.split(`.`, 2).map(value => parseInt(value, 10));\n// In TypeScript@>=5.5 the tsserver uses the public TypeScript API so that needs to be patched as well.\n// Ref https://github.com/microsoft/TypeScript/pull/55326\nif (major > 5 || (major === 5 && minor >= 5)) {\n  moduleWrapper(absRequire(`typescript`));\n}\n\n// Defer to the real typescript/lib/tsserverlibrary.js your application uses\nmodule.exports = moduleWrapper(absRequire(`typescript/lib/tsserverlibrary.js`));\n"
  },
  {
    "path": ".yarn/sdks/typescript/lib/typescript.js",
    "content": "#!/usr/bin/env node\n\nconst {existsSync} = require(`fs`);\nconst {createRequire, register} = require(`module`);\nconst {resolve} = require(`path`);\nconst {pathToFileURL} = require(`url`);\n\nconst relPnpApiPath = \"../../../../.pnp.cjs\";\n\nconst absPnpApiPath = resolve(__dirname, relPnpApiPath);\nconst absRequire = createRequire(absPnpApiPath);\n\nconst absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);\nconst isPnpLoaderEnabled = existsSync(absPnpLoaderPath);\n\nif (existsSync(absPnpApiPath)) {\n  if (!process.versions.pnp) {\n    // Setup the environment to be able to require typescript\n    require(absPnpApiPath).setup();\n    if (isPnpLoaderEnabled && register) {\n      register(pathToFileURL(absPnpLoaderPath));\n    }\n  }\n}\n\n// Defer to the real typescript your application uses\nmodule.exports = absRequire(`typescript`);\n"
  },
  {
    "path": ".yarn/sdks/typescript/package.json",
    "content": "{\n  \"name\": \"typescript\",\n  \"version\": \"5.5.4-sdk\",\n  \"main\": \"./lib/typescript.js\",\n  \"type\": \"commonjs\",\n  \"bin\": {\n    \"tsc\": \"./bin/tsc\",\n    \"tsserver\": \"./bin/tsserver\"\n  }\n}\n"
  },
  {
    "path": ".yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Code of Conduct\n\n## Introduction\n\nExercism is a platform centered around empathetic conversation.\nWe have a low tolerance for communication that makes anyone feel unwelcome, unsupported, insulted or discriminated against.\n\n## Seen or experienced something uncomfortable?\n\nIf you see or experience abuse, harassment, discrimination, or feel unsafe or upset, please email [abuse@exercism.org](mailto:abuse@exercism.org?subject=%5BCoC%5D) and include \\[CoC\\] in the subject line.\nWe will follow up with you as a priority.\n\n## Enforcement\n\nWe actively monitor for Code of Conduct (CoC) violations and take any reports of violations extremely seriously.\nWe have banned contributors, mentors and users due to violations.\n\nAfter we receive a report of a CoC violation, we view that person's conversation history on Exercism and related communication channels and attempt to understand whether someone has deliberately broken the CoC, or accidentally crossed a line.\nWe generally reach out to the person who has been reported to discuss any concerns we have and warn them that repeated violations will result in a ban.\nSometimes we decide that no violation has occurred and that no action is required and sometimes we will also ban people on a first offense.\nWe strive to be fair, but will err on the side of protecting the culture of our community.\n\nExercism's leadership reserve the right to take whatever action they feel appropriate with regards to CoC violations.\n\n## The simple version\n\n- Be empathetic\n- Be welcoming\n- Be kind\n- Be honest\n- Be supportive\n- Be polite\n\n## The details\n\nExercism should be a safe place for everybody regardless of\n\n- Gender, gender identity or gender expression\n- Sexual orientation\n- Disability\n- Physical appearance (including but not limited to body size)\n- Race\n- Age\n- Religion\n- Anything else you can think of\n\nAs someone who is part of this community, you agree that:\n\n- We are collectively and individually committed to safety and inclusivity\n- We have zero tolerance for abuse, harassment, or discrimination\n- We respect people’s boundaries and identities\n- We refrain from using language that can be considered offensive or oppressive (systemically or otherwise), eg. sexist, racist, homophobic, transphobic, ableist, classist, etc.\n  - this includes (but is not limited to) various slurs.\n- We avoid using offensive topics as a form of humor\n\nWe actively work towards:\n\n- Being a safe community\n- Cultivating a network of support & encouragement for each other\n- Encouraging responsible and varied forms of expression\n\nWe condemn:\n\n- Stalking, doxxing, or publishing private information\n- Violence, threats of violence or violent language\n- Anything that compromises people’s safety\n- Conduct or speech which might be considered sexist, racist, homophobic, transphobic, ableist or otherwise discriminatory or offensive in nature\n- The use of unwelcome, suggestive, derogatory or inappropriate nicknames or terms\n- Disrespect towards others (jokes, innuendo, dismissive attitudes) and towards differences of opinion\n- Intimidation or harassment (online or in-person).\n  Please read the [Citizen Code of Conduct](https://github.com/stumpsyn/policies/blob/master/citizen_code_of_conduct.md) for how we interpret harassment\n- Inappropriate attention or contact\n- Not understanding the differences between constructive criticism and disparagement\n\nThese things are NOT OK.\n\nBe aware of how your actions affect others.\nIf it makes someone uncomfortable, stop.\n\nIf you say something that is found offensive, and you are called out on it, try to:\n\n- Listen without interruption\n- Believe what the person is saying & do not attempt to disqualify what they have to say\n- Ask for tips / help with avoiding making the offense in the future\n- Apologize and ask forgiveness\n\n## History\n\nThis policy was initially adopted from the Front-end London Slack community and has been modified since.\nA version history can be seen on [GitHub](https://github.com/exercism/website-copy/edit/main/pages/code_of_conduct.md).\n\n_This policy is a \"living\" document, and subject to refinement and expansion in the future.\nThis policy applies to the Exercism website, the Exercism GitHub organization, any other Exercism-related communication channels (e.g. Discord, Forum, Twitter, email) and any other Exercism entity or event._\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\nThis is the TypeScript track, one of the many tracks on [exercism][web-exercism]. It holds all the _exercises_ that are currently implemented and available for students to complete.\nThe track consists of various **core** exercises, the ones a student _must_ complete, and each **core** exercise may unlock various _side_ exercises.\nYou can find this in the [`config.json`][file-config].\nIt's not uncommon that people discover incorrect implementations of certain tests, have a suggestion for a track specific hint to aid the student on the _JavaScript specifics_, see optimisations in terms of the configurations of `jest`, `eslint` or other dependencies, report missing edge cases, factual errors, logical errors, and, implement exercises or develop new exercises.\n\n> [!IMPORTANT]\n> When contributing, please open your PR from a branch so our automated tooling can run.\n\nWe welcome contributions of all sorts and sizes, from reporting issues to submitting patches, as well as joining the current [discussions 💬][issue-discussion].\n\n---\n\n## Table of Contents\n\n- [Contributing](#contributing)\n  - [Table of Contents](#table-of-contents)\n  - [Code of Conduct](#code-of-conduct)\n  - [Exercises](#exercises)\n    - [New exercise](#new-exercise)\n      - [Implementing existing exercise](#implementing-existing-exercise)\n      - [Creating a track-specific exercise](#creating-a-track-specific-exercise)\n    - [Existing exercises](#existing-exercises)\n      - [Improving the README.md](#improving-the-readmemd)\n      - [Syncing the exercise](#syncing-the-exercise)\n      - [Improving or adding mentor notes](#improving-or-adding-mentor-notes)\n      - [Improving or adding automated test analyzers](#improving-or-adding-automated-test-analyzers)\n  - [Documentation](#documentation)\n  - [Tools](#tools)\n    - [Fetch configlet](#fetch-configlet)\n    - [Scripts](#scripts)\n      - [`format`](#format)\n      - [`lint`](#lint)\n      - [`test`](#test)\n      - [`sync`](#sync)\n      - [`checksum`](#checksum)\n      - [`ci-check`](#ci-check)\n      - [`ci`](#ci)\n      - [`name-check`](#name-check)\n      - [`name-uniq`](#name-uniq)\n\n---\n\nThis guide covers several common scenarios pertaining to **improving the TypeScript track**.\nThere are several other guides about contributing to other parts of the Exercism ecosystem, that are similar to this repository.\n\n- [Generic information about track-contributing][contributing-generic]\n- [The JavaScript track][contributing-javascript]\n- [The JavaScript Analyzer][contributing-javascript-analyzer]\n- [The JavaScript Test Runner][contributing-javascript-test-runner]\n- [The TypeScript Analyzer][contributing-typescript-analyzer]\n- [The TypeScript Test Runner][contributing-typescript-test-runner]\n\n## Code of Conduct\n\nHelp us keep Exercism welcoming. Please read and abide by the [Code of Conduct][coc].\n\n## Exercises\n\nBefore contributing code to any existing exercise or any new exercise, please have a thorough look at the current exercises and dive into [open issues][issue-open].\n\n### New exercise\n\nThere are two ways to implement new exercises (exercises that don't exist in this track).\n\n1. Pick one from [the list of exercises][list-of-exercises] (implemented in other tracks).\n2. Create a new, track-specific exercise from scratch.\n\n#### Implementing existing exercise\n\nLet's say you want to implement a new exercise, from the list of (practice) exercises, because you've noticed that this track could benefit from this exercise, really liked it in another track, or just because you find this interesting; the first step is to [check for an open issue][issue-new-exercise].\nIf it's there, make sure no one is working on it, and most of all that there is not an open Pull Request towards this exercise.\n\nIf there is no such issue, you may open one. The baseline of work is as follows:\n\n1. Open a new issue, we'll label it with `new exercise ✨`\n1. We'll assign the issue to you, so you get to work on this exercise\n1. Create a new folder in `/exercises`\n1. You'll need to sync this folder with the matching config files.\n   You can use `sync` to do this: `ASSIGNMENT=practice/slug corepack yarn sync`.\n1. Create a `<slug>.ts` stub file.\n1. Create a `<slug>.test.ts` test file.\n   Here add the tests, per canonical data if possible (more on canonical data below).\n1. Create a `.meta/proof.ci.ts` file.\n   Place a working implementation, assuming it's renamed to `<slug>.ts`\n1. Create `.meta/tests.toml`.\n   If the exercise that is being implemented has test data in the [problem specifications repository][problem-specifications], the contents of this file **must** be a list of UUIDs of the tests that are implemented or not implemented.\n   Scroll down to [tools](#tools) to find the configlet application which aids generating this file _interactively_.\n1. Create a `.meta/config.json`.\n   Copy the structure from any other `.meta/config.json`. Fill the `blurb`, `source` and `source_url` according to the `metadata.yml` in the [problem specifications repository][problem-specifications].\n   Add yourself as author.\n1. Create a `.docs/instructions.md` file.\n   Copy the instructions from the [problem specifications repository][problem-specifications]\n1. Run the tests locally, using `scripts/test`: `ASSIGNMENT=practice/slug corepack yarn test`.\n1. Run the linter locally, using `scripts/lint`: `ASSIGNMENT=practice/slug corepack yarn lint`.\n1. Create an entry in `config.json`: a unique _new_ UUID (you can use the `configlet uuid` tool to generate one, scroll down to [tools](#tools) to see how you can get it), give it a difficulty (should be similar to similar exercises), and make sure the _order_ of the file is sane.\n   Currently the file is ordered first on core - non core, then on difficulty low to high, and finally lexographically.\n1. Format the files, using `scripts/format`: `corepack yarn format`.\n\nThe final step is opening a Pull Request, with these items all checked off.\nMake sure the tests run and the linter is happy.\nIt will run automatically on your PR.\n\n#### Creating a track-specific exercise\n\nThe steps for a track-specific exercise are similar to those of implementing an established, existing exercise. The differences are:\n\n- You'll have to write a README.md and test-suite from scratch\n- You'll have to come up with a unique _slug_.\n- We need to require an icon for it.\n- Generate a UUID, for example using [configlet][configlet].\n\nOpen a new issue with your proposal, and we'll make sure all these steps are correctly taken.\nDon't worry! You're not alone in this.\n\n### Existing exercises\n\nThere are always improvements possible on existing exercises.\n\n#### Improving the README.md\n\n`README.md`: the description that shows up on the student's exercise page, when they are ready to start.\nIt's also downloaded as part of the exercise's data.\nhe `README.md`, together with the `<slug>.test.ts` file form the contract for the implementation of the exercise.\nNo test should _force_ a specific implementation, no `README.md` explanation should _give away_ a certain implementation.\nThe `README.md` files are [generated][doc-readme], which is explains [here][doc-readme].\n\n- This file may need to be _regenerated_ in order to sync with the latest canonical data.\n- You may contribute track specific `hints.md`, as listed in that [document][doc-readme]\n- You may improve the track specific `exercise-readme-insert.md`, and regenerate all the READMEs.\n\n> **Note**: In v3, this will no longer be exactly the same. We'll update this section of the guide when V3 is live.\n\n#### Syncing the exercise\n\nSyncing an exercise with _canonical data_: There is a [problem-specifications][problem-specifications] repository that holds test data in a standardised format.\nThese tests are occasionally fixed, improved, added, removed or otherwise changed.\nSyncing an exercise consists of:\n\n- updating `tests.toml`;\n- updating the `<slug>.test.ts` file;\n- updating the `.meta/tests.toml` file, if the exercise that is being updated has test data in the [problem specifications repository][problem-specifications].\n  The contents of this file can be updated using configlet, interactively;\n- match the `proof.ci.ts` file to still work with the new tests; and\n- regenerate the [`README.md`][doc-readme], should there be any changes.\n\n#### Improving or adding mentor notes\n\n[Mentor notes][mentor-notes] are the notes that are given to the mentors to guide them with mentoring.\nThese notes _do not live in this repository_, but instead in the `website-copy` repository.\nFind their [contributing guidelines][contributing-website-copy] [here][contributing-website-copy].\n\n#### Improving or adding automated test analyzers\n\nSome exercises already have automated mentoring support.\nThese automations don't live in this repository, but instead in the `typescript-analyzer` repository.\nFind their [contributing guidelines][contributing-typescript-analyzer] [here][contributing-typescript-analyzer].\n\n## Documentation\n\nThere is quite a bit of student-facing documentation, which can be found in the [`docs`][file-docs] folder.\nYou may improve these files by making the required changes and opening a new Pull Request.\n\n## Tools\n\nYou'll need LTS or higher NodeJS in order to contribute to the _code_ in this respository. Run `yarn` in the root in order to be able to run the scripts as listed below.\nWe use the following dependencies:\n\n- `shelljs` in order to provide shell interface to scripts\n- `eslint` for linting all code in the stub, test file and example file\n- `jest` to run all the test files on all example implementations\n- `babel` to transpile everything so it works _regardless of your version of NodeJS_.\n\nWe also use `prettier` to format the files. When possible, use `corepack yarn format` to run prettier.\nIf you want to auto-format using your editor, match the version in the GitHub Workflow `verify-code-formatting.yml`.\n\n### Fetch configlet\n\nIf you'd like to download [configlet][configlet], you can use the [`fetch-configlet`][bin-fetch-configlet] binary.\nIt will run on Linux, Mac OSX and Windows, and download `configlet` to your local drive.\nFind more information about [configlet][configlet] [here][configlet].\n\n> If a track implements an exercise for which test data exists, the exercise _must_ contain a `.meta/tests.toml` file.\n> The goal of the `tests.toml` file is to keep track of which tests are implemented by the exercise.\n> Tests in this file are identified by their UUID and each test has a boolean value that indicates if it is implemented by that exercise.\n\nA `tests.toml` file for a track's `two-fer` exercise looks like this:\n\n```toml\n[canonical-tests]\n\n[19709124-b82e-4e86-a722-9e5c5ebf3952]\ndescription = \"no name given\"\ninclude = true\n\n[3451eebd-123f-4256-b667-7b109affce32]\ndescription = \"a name given\"\ninclude = true\n\n[653611c6-be9f-4935-ab42-978e25fe9a10]\ndescription = \"another name given\"\ninclude = false\n```\n\nTo make it easy to keep the `tests.toml` files up to date, contributors can use the `configlet` application's `sync` command.\nThis command will compare the tests specified in the `tests.toml` files against the tests that are defined in the exercise's canonical data.\nIt then interactively gives the maintainer the option to include or exclude test cases that are currently missing, updating the `tests.toml` file accordingly.\n\n### Scripts\n\nWe have various `scripts` for you in order to aid with maintaining and contributing to this repository.\n\n#### `format`\n\n> This has been aliased as a top-level package.json `scripts` script:\n>\n> ```shell\n> corepack yarn format\n> ```\n\n```typescript\n/*\n * Run this script (from root directory):\n *\n * $ corepack yarn format\n *\n * This runs `prettier` on all applicable files, FORCES using the same version\n * as the CI uses to check if the files have been formatted.\n */\n```\n\nUse this action to format all the files using the correct version of prettier.\nIf you want your editor to do this automatically, make sure you install `corepack yarn install`.\n\n#### `lint`\n\n> This has been aliased as a top-level package.json `scripts` script:\n>\n> ```shell\n> corepack yarn lint\n> ```\n\n```typescript\n/*\n * Run this script (from root directory):\n *\n * $ corepack yarn lint\n *\n * This runs `eslint` on all sample solutions (and test) files\n */\n```\n\nIf the `ASSIGNMENT` environment variable is set, only _that_ exercise is tested.\nFor example, if you only want to lint `two-fer`, you may, depending on your environment use:\n\n```shell\nASSIGNMENT=practice/two-fer corepack yarn lint\n```\n\n#### `test`\n\n> This has been aliased as a top-level package.json `scripts` script:\n>\n> ```shell\n> corepack yarn test\n> ```\n\n```typescript\n/**\n * Run this script (from root directory):\n *\n * $ corepack yarn test\n *\n * This runs `jest` tests for all sample solutions\n */\n```\n\nIf the `ASSIGNMENT` environment variable is set, only _that_ exercise is tested.\nFor example, if you only want to test the `example.js` for `two-fer`, you may, depending on your environment, use:\n\n```shell\nASSIGNMENT=practice/two-fer corepack yarn test\n```\n\n#### `sync`\n\n> This has been aliased as a top-level package.json `scripts` script:\n>\n> ```shell\n> corepack yarn sync\n> ```\n\n```typescript\n/**\n * Run this script (from root directory):\n *\n * $ corepack yarn sync\n *\n * This script is used to propagate any change to root package.json to\n * all exercises and keep them in sync.\n * There is a CI step which checks that package.json in root & exercises match\n * (see checksum script for more info).\n */\n```\n\nIf the `ASSIGNMENT` environment variable is set, only _that_ exercise is tested.\nFor example, if you only want to sync the files for `two-fer`, you may, depending on your environment, use:\n\n```shell\nASSIGNMENT=practice/two-fer corepack yarn sync\n```\n\n#### `checksum`\n\n```typescript\n/*\n * Run this script (from root directory):\n *\n * $ corepack yarn node scripts/checksum.mjs\n *\n * This will check root `package.json` matches each exercise's `package.json`.\n * But the catch is there are some dependencies used for build but not served to end users\n * We skip those dependencies while performing checksum.\n * See `SKIP_PACKAGES_FOR_CHECKSUM` in helpers.js for list of skipped packages.\n */\n```\n\n#### `ci-check`\n\n> This has been aliased as a top-level package.json `scripts` script:\n>\n> ```shell\n> corepack yarn ci:check\n> ```\n\n```typescript\n/**\n * Run this script (from root directory):\n *\n * $ corepack yarn ci:check\n *\n * This will run following checks:\n *\n * 1. Check config in all exercises matches\n * 2. Checks stubs exist\n * 3. Run eslint to check code-style\n */\n```\n\nRun this script to check stubs, configuration integrity and lint the code.\n\n#### `ci`\n\n> This has been aliased as a top-level package.json `scripts` script:\n>\n> ```shell\n> corepack yarn ci\n> ```\n\nThis script is _almost_ the same as `test`. You may use them interchangeably at moment of writing\n\n```typescript\n/**\n * Run this script (from root directory):\n *\n * $ corepack yarn ci\n *\n * This will run following checks:\n *\n * 1. Find the exercises\n * 2. Run tests against sample solutions\n */\n```\n\nRun this script to test all exercises.\n\n#### `name-check`\n\n```typescript\n/**\n * Run this script (from root directory):\n *\n * $ corepack yarn node scripts/name-check.mjs\n *\n * This will run following checks:\n *\n * 1. Package name is of the format \"@exercism/typescript-<exercise>\"\n *\n * This script also allows fixing these names:\n *\n * $ corepack yarn node scripts/name-check.mjs --fix\n */\n```\n\nRun this script to check if package name in package.json of exercises is in expected format.\nRun this script with the `--fix` flag to automatically fix the names.\n\n#### `name-uniq`\n\n```typescript\n/**\n * Run this script (from root directory):\n *\n * $ corepack yarn node scripts/name-uniq.mjs\n *\n * This will run following checks:\n *\n * 1. All exercises have unique package names in their package.json files.\n */\n```\n\nRun this script to check if there is any duplicate package name.\n\n[configlet]: https://github.com/exercism/docs/blob/master/language-tracks/configuration/configlet.md\n[bin-fetch-configlet]: https://github.com/exercism/javascript/blob/master/bin/fetch-configlet\n[web-exercism]: https://exercism.org\n[file-config]: https://github.com/exercism/javascript/blob/master/config.json\n[file-docs]: https://github.com/exercism/javascript/blob/master/docs\n[issue-open]: https://github.com/exercism/javascript/issues\n[issue-discussion]: https://github.com/exercism/javascript/labels/discussion%20%3Aspeech_balloon%3A\n[issue-new-exercise]: https://github.com/exercism/javascript/issues?q=is%3Aopen+is%3Aissue+label%3A%22%3Asparkles%3A+new+exercise%22\n[list-of-exercises]: https://tracks.exercism.org/typescript/master/unimplemented\n[contributing-generic]: https://github.com/exercism/docs/tree/master/contributing-to-language-tracks\n[contributing-javascript]: https://github.com/exercism/javascript/blob/master/CONTRIBUTING.md\n[contributing-javascript-analyzer]: https://github.com/exercism/javascript-analyzer/blob/master/CONTRIBUTING.md\n[contributing-javascript-test-runner]: https://github.com/exercism/javascript-test-runner\n[contributing-typescript]: https://github.com/exercism/typescript/blob/master/CONTRIBUTING.md\n[contributing-typescript-analyzer]: https://github.com/exercism/typescript-analyzer/blob/master/CONTRIBUTING.md\n[contributing-typescript-test-runner]: https://github.com/exercism/typescript-test-runner\n[contributing-website-copy]: https://github.com/exercism/website-copy#contributing\n[doc-readme]: https://github.com/exercism/docs/blob/master/language-tracks/exercises/anatomy/readmes.md\n[problem-specifications]: https://github.com/exercism/problem-specifications\n[coc]: https://exercism.org/code-of-conduct\n[mentor-notes]: https://github.com/exercism/website-copy/tree/master/tracks/javascript/exercises\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 Exercism\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": "# Exercism TypeScript Track\n\n[![configlet](https://github.com/exercism/typescript/actions/workflows/configlet.yml/badge.svg)](https://github.com/exercism/typescript/actions/workflows/configlet.yml) [![typescript / ci](https://github.com/exercism/typescript/workflows/typescript%20/%20main/badge.svg)](https://github.com/exercism/typescript/actions?query=workflow%3A%22typescript+%2F+main%22)\n\n**Exercism exercises in TypeScript**\n\nThis is the TypeScript track, one of the many tracks on [exercism][web-exercism].\nIt holds all the _exercises_ that are currently implemented and available for students to complete.\nThe track consists of various **core** exercises - the ones a student _must_ complete - and each **core** exercise may unlock various _side_ exercises.\nYou can find this in the [`config.json`][file-config].\n\n> In version 3 of exercism, the above no longer holds. See the [`exercism/v3`][git-v3] repository for more information.\n\n## Tools\n\nSee [CONTRIBUTING.md][file-contributing] for a list of requirements to contribute to this track.\nIt also has a list of tools you can use, of which the `test` tool is one of them.\n\n## Running the test suite\n\nThis runs `jest` tests for all sample solutions.\nThis _does not_ use the regular way to run `jest`, because the example solution files must be renamed to be imported correctly into the test files.\n\n```shell\ncorepack yarn test\n```\n\nIf the `ASSIGNMENT` environment variable is set, only _that_ exercise is tested.\nFor example, if you only want to test the `two-fer.example.ts` for `two-fer`, you may, depending on your environment, use:\n\n```shell\nASSIGNMENT=practice/two-fer corepack yarn test\n```\n\n> Running on Windows? Depending on your shell, environment variables are set differently.\n> You can use `cross-env` to normalize this. The following should work across environments:\n>\n> ```bash\n> corepack yarn dlx cross-env ASSIGNMENT=practice/two-fer corepack yarn test\n> ```\n\n## Related repositories\n\n- [Website Copy][git-website-copy] (Mentor Notes)\n- [The TypeScript Analyzer][git-typescript-analyzer]\n- [The TypeScript Representer][git-typescript-representer]\n- [The TypeScript Test Runner][git-typescript-test-runner]\n\n### Related JavaScript repositories\n\nA lot of the improvements made to this track and tooling, is also made to the JavaScript track and tooling and vice-versa.\n\n- [The JavaScript track][git-javascript]\n- [The JavaScript Analyzer][git-javascript-analyzer] (Automated Code Analysis)\n- [The JavaScript Representer][git-javascript-representer]\n- [The JavaScript Test Runner][git-javascript-test-runner]\n\n[web-exercism]: https://exercism.org\n[file-config]: https://github.com/exercism/typescript/blob/master/config.json\n[file-contributing]: https://github.com/exercism/typescript/blob/master/CONTRIBUTING.md\n[git-javascript]: https://github.com/exercism/javascript\n[git-javascript-analyzer]: https://github.com/exercism/javascript-analyzer\n[git-javascript-representer]: https://github.com/exercism/javascript-representer\n[git-javascript-test-runner]: https://github.com/exercism/javascript-test-runner\n[git-typescript]: https://github.com/exercism/typescript/\n[git-typescript-analyzer]: https://github.com/exercism/typescript-analyzer\n[git-typescript-representer]: https://github.com/exercism/typescript-representer\n[git-typescript-test-runner]: https://github.com/exercism/typescript-test-runner\n[git-v3]: https://github.com/exercism/v3\n[git-website-copy]: https://github.com/exercism/website-copy\n"
  },
  {
    "path": "TAGS.md",
    "content": "# Tags\n\nThis document aims to provide reasoning why `config.json` contains the `\"tags\"` it contains.\n\nIt uses as a basis the JavaScript's [TAGS.md](https://github.com/exercism/javascript/blob/main/TAGS.md) because anything that JavaScript does can be done with TypeScript, being a transpiled language, and adds/modifies with the perks TypeScript brings on top of it.\n\n## Paradigms\n\n- [x] `paradigm/declarative`: mostly popularised by libraries and frameworks such as React, Vue, etc.\n- [x] `paradigm/functional`: there is a lot of support for functional programming, including various defactor libraries in the ecosystem providing functional programming patterns.\n- [x] `paradigm/imperative`: It retains JavaScript's script and DOM's manipulation imperative programming, but the language design doesn't encourage it.\n- [ ] `paradigm/logic`: whilst it is possible to write DSL or patterns that' allow for logic-based programming, JavaScript doesn't inherently support it.\n- [x] `paradigm/object_oriented`: becomes a main feature of the language compared to JavaScript, along with static type checking and a rich type system.\n\n## Typing\n\n- [x] `typing/static`: Will check types at compile time for any part of the code which has its types stated.\n- [x] `typing/dynamic`: At runtime all TypeScript's type information is stripped. Runtime type checking can also be manually achieved, as well.\n- [x] `typing/strong`: TypeScript adds a rich type system, that is checked at compile time if used.\n- [x] `typing/weak`: TypeScript allows for explicit (strong) typing, inferred (weak) typing, deferred (computed / conditional) typing, opt-out (using `any`) of typing, and forced run-time (using `unknown`) typing.\n\n## Execution mode\n\n- [x] `execution_mode/compiled`: TypeScript transpilation (transpilation via [`tsc`](https://www.typescriptlang.org/), or stripping types and then compiling using [`@babel/preset-typescript`](https://babeljs.io/docs/en/babel-preset-typescript)) compiles the code to a certain version of JavaScript. This includes in-memory compilation using tools such as [`ts-node`](https://github.com/TypeStrong/ts-node), however due to the in-line nature and REPL like support, it might be considered interpreted.\n- [x] `execution_mode/interpreted`: TypeScript _can_ be interpreted Just-In-Time by stripping types, for example using [`@babel/preset-typescript`](https://babeljs.io/docs/en/babel-preset-typescript).\n\n## Platform\n\n- [x] `platform/windows`: popularised by Electron and Node\n- [x] `platform/mac`: popularised by Electron and Node\n- [x] `platform/linux`: popularised by Electron and Node\n- [x] `platform/ios`: popularised by PhoneGap/Cordova, Ionic, React-Native\n- [x] `platform/android`: popularised by PhoneGap/Cordova, Ionic, React-Native\n- [x] `platform/web`: used in frontend frameworks like Angular\n\n## Runtime\n\n- [ ] `runtime/standalone_executable`: it doesn't. Any executable that exists packages Node, or requires Node or a Browser.\n- [x] `runtime/language_specific`: it runs on Node\n- [ ] `runtime/clr`: it doesn't\n- [ ] `runtime/jvm`: it doesn't\n- [ ] `runtime/beam`: it doesn't\n- [x] `runtime/wasmtime`: Just like JavaScript, it doesn't natively, but JavaScript can compile to WASM, and thus then run on wastime. It's a bit of a cheat, but probably what people will search for.\n\n## Used for\n\n- [x] `used_for/artificial_intelligence`: popularised by TensorFlow\n- [x] `used_for/backends`: popularised by Express\n- [x] `used_for/cross_platform_development`: popularised by PhoneGap/Cordova, Ionic, React-Native, Electron and more\n- [ ] `used_for/embedded_systems`: It's possible to run the transpiled JavaScript on microcontrollers and IoT platforms, but the low-end nature makes it not a viable, professional, solution. Therefore this is not included.\n- [ ] `used_for/financial_systems`: Although it improves in the type safeness department, TypeScript being still JavaScript makes it too slow for fintech.\n- [x] `used_for/frontends`: Most TypeScript usage is with Frontend frameworks.\n- [x] `used_for/games`: probably one of the most popular replacements for browser-based games.\n- [x] `used_for/guis`: same reason as frontends, which is more and more interesting as libraries such as React can now also render to less common/expected displays, such as terminals (and thus be used to build GUIs), not requiring CSS or other ways to provide styling.\n- [x] `used_for/mobile`: yep, see platform\n- [ ] `used_for/robotics`: it's possible. Things like Johnny-Five help a lot. However, it's not a _go to_ language to provide robotics programming, so it's not included.\n- [ ] `used_for/scientific_calculations`: possible, and not uncommon especially for _visualisation_ (for example d3), but not a _go to_ language to do scientific calculations, so it's not included.\n- [ ] `used_for/scripts`: You could still transpile your TypeScript files, but is usually not worth the hassle, so is not used for scripting at all compared to JavaScript\n- [x] `used_for/web_development`: yes\n"
  },
  {
    "path": "babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "bin/check-formatting.sh",
    "content": "#!/usr/bin/env bash\n\nset -uo pipefail\n\nif [ -z \"${EXERCISM_PRETTIER_VERSION:-}\" ]; then\n  echo \"[format] pulling prettier version from yarn.lock using sed\"\n  EXERCISM_PRETTIER_VERSION=\"$(corepack yarn info prettier --json --name-only | sed -n -e 's/^\"prettier@npm://' -e 's/\"//p')\"\n  echo \"[format] expected version is now ${EXERCISM_PRETTIER_VERSION:-}\"\nfi\n\nif [ -z \"${EXERCISM_PRETTIER_VERSION:-}\" ]; then\n  echo \"Version could not be pulled using sed\" >&2\n  echo \"[format] pulling prettier version from yarn.lock using grep\"\n  EXERCISM_PRETTIER_VERSION=\"$(corepack yarn info prettier --json --name-only | grep -Po '\"prettier@npm:\\K[^\"]+')\"\n  echo \"[format] expected version is now ${EXERCISM_PRETTIER_VERSION:-}\"\nfi\n\nif [ -z \"${EXERCISM_PRETTIER_VERSION:-}\" ]; then\n  echo \"Version could not be pulled using grep or sed\" >&2\n  echo \"\"\n  echo \"---------------------------------------------------\"\n  echo \"This script requires the EXERCISM_PRETTIER_VERSION variable to work.\"\n  echo \"Please see https://exercism.org/docs/building/markdown/style-guide for guidance.\"\n  echo \"---------------------------------------------------\"\n  echo \"$(corepack yarn -v)\"\n  echo \"\"\n  echo \"This is what yarn why reports:\"\n  echo \"$ corepack yarn why prettier\"\n  echo \"$(corepack yarn why prettier)\"\n  echo \"\"\n  echo \"And corepack yarn info reports the following:\"\n  echo \"$ corepack yarn info prettier --name-only\"\n  echo \"$(corepack yarn info prettier --name-only)\"\n  echo \"\"\n  echo \"This is the version that can be extracted using grep:\"\n  echo \"$ corepack yarn info prettier --json --name-only | grep -Po '\"prettier@npm:\\K[^\"]+'\"\n  echo \"└─ $(corepack yarn info prettier --json --name-only | grep -Po '\"prettier@npm:\\K[^\"]+')\"\n  echo \"\"\n  echo \"This is the version that can be extracted using sed:\"\n  echo \"$ corepack yarn info prettier --json --name-only | sed -n -e 's/^\"prettier@npm://' -e 's/\"//p'\"\n  echo \"└─ $(corepack yarn info prettier --json --name-only | sed -n -e 's/^\"prettier@npm://' -e 's/\"//p')\"\n  echo \"\"\n  echo \"These files are found in the repo root:\"\n  echo \"$(ls -p | grep -v /)\"\n  echo \"---------------------------------------------------\"\n  exit 1\nelse\n echo \"[format] running with prettier@$EXERCISM_PRETTIER_VERSION\"\nfi\n\ncorepack yarn dlx \"prettier@$EXERCISM_PRETTIER_VERSION\" --check \"**/*.{js,jsx,ts,tsx,css,sass,scss,html,json,md,yml}\"\n"
  },
  {
    "path": "bin/fetch-configlet",
    "content": "#!/usr/bin/env bash\n\n# This file is a copy of the\n# https://github.com/exercism/configlet/blob/main/scripts/fetch-configlet file.\n# Please submit bugfixes/improvements to the above file to ensure that all tracks benefit from the changes.\n\nset -eo pipefail\n\ncurlopts=(\n  --silent\n  --show-error\n  --fail\n  --location\n  --retry 3\n)\n\nif [[ -n \"${GITHUB_TOKEN}\" ]]; then\n  curlopts+=(--header \"authorization: Bearer ${GITHUB_TOKEN}\")\nfi\n\nget_download_url() {\n  local os=\"$1\"\n  local ext=\"$2\"\n  local latest='https://api.github.com/repos/exercism/configlet/releases/latest'\n  local arch\n  case \"$(uname -m)\" in\n    aarch64|arm64) arch='arm64'  ;;\n    x86_64)        arch='x86-64' ;;\n    *686*)         arch='i386'   ;;\n    *386*)         arch='i386'   ;;\n    *)             arch='x86-64' ;;\n  esac\n  local suffix=\"${os}_${arch}.${ext}\"\n  curl \"${curlopts[@]}\" --header 'Accept: application/vnd.github.v3+json' \"${latest}\" |\n    grep \"\\\"browser_download_url\\\": \\\".*/download/.*/configlet.*${suffix}\\\"$\" |\n    cut -d'\"' -f4\n}\n\nmain() {\n  local output_dir\n  if [[ -d ./bin ]]; then\n    output_dir=\"./bin\"\n  elif [[ $PWD == */bin ]]; then\n    output_dir=\"$PWD\"\n  else\n    echo \"Error: no ./bin directory found. This script should be ran from a repo root.\" >&2\n    return 1\n  fi\n\n  local os\n  case \"$(uname -s)\" in\n    Darwin*)   os='macos'   ;;\n    Linux*)    os='linux'   ;;\n    Windows*)  os='windows' ;;\n    MINGW*)    os='windows' ;;\n    MSYS_NT-*) os='windows' ;;\n    *)         os='linux'   ;;\n  esac\n\n  local ext\n  case \"${os}\" in\n    windows) ext='zip'    ;;\n    *)       ext='tar.gz' ;;\n  esac\n\n  echo \"Fetching configlet...\" >&2\n  local download_url\n  download_url=\"$(get_download_url \"${os}\" \"${ext}\")\"\n  local output_path=\"${output_dir}/latest-configlet.${ext}\"\n  curl \"${curlopts[@]}\" --output \"${output_path}\" \"${download_url}\"\n\n  case \"${ext}\" in\n    zip) unzip \"${output_path}\" -d \"${output_dir}\"   ;;\n    *)   tar xzf \"${output_path}\" -C \"${output_dir}\" ;;\n  esac\n\n  rm -f \"${output_path}\"\n\n  local executable_ext\n  case \"${os}\" in\n    windows) executable_ext='.exe' ;;\n    *)       executable_ext=''     ;;\n  esac\n\n  local configlet_path=\"${output_dir}/configlet${executable_ext}\"\n  local configlet_version\n  configlet_version=\"$(${configlet_path} --version)\"\n  echo \"Downloaded configlet ${configlet_version} to ${configlet_path}\"\n}\n\nmain\n"
  },
  {
    "path": "bin/fetch-configlet.ps1",
    "content": "# This file is a copy of the\n# https://github.com/exercism/configlet/blob/main/scripts/fetch-configlet.ps1 file.\n# Please submit bugfixes/improvements to the above file to ensure that all tracks\n# benefit from the changes.\n\n$ErrorActionPreference = \"Stop\"\n$ProgressPreference = \"SilentlyContinue\"\n\n$requestOpts = @{\n    Headers           = If ($env:GITHUB_TOKEN) { @{ Authorization = \"Bearer ${env:GITHUB_TOKEN}\" } } Else { @{ } }\n    MaximumRetryCount = 3\n    RetryIntervalSec  = 1\n}\n\nFunction Get-DownloadUrl {\n    $arch = If ([Environment]::Is64BitOperatingSystem) { \"x86-64\" } Else { \"i386\" }\n    $latestUrl = \"https://api.github.com/repos/exercism/configlet/releases/latest\"\n    Invoke-RestMethod -Uri $latestUrl -PreserveAuthorizationOnRedirect @requestOpts `\n    | Select-Object -ExpandProperty assets `\n    | Where-Object { $_.name -match \"^configlet_.+_windows_${arch}.zip$\" } `\n    | Select-Object -ExpandProperty browser_download_url -First 1\n}\n\n$outputDirectory = \"bin\"\nif (!(Test-Path -Path $outputDirectory)) {\n    Write-Output \"Error: no ./bin directory found. This script should be ran from a repo root.\"\n    exit 1\n}\n\nWrite-Output \"Fetching configlet...\"\n$downloadUrl = Get-DownloadUrl\n$outputFileName = \"configlet.zip\"\n$outputPath = Join-Path -Path $outputDirectory -ChildPath $outputFileName\nInvoke-WebRequest -Uri $downloadUrl -OutFile $outputPath @requestOpts\n\n$configletPath = Join-Path -Path $outputDirectory -ChildPath \"configlet.exe\"\nif (Test-Path -Path $configletPath) { Remove-Item -Path $configletPath }\n[System.IO.Compression.ZipFile]::ExtractToDirectory($outputPath, $outputDirectory)\nRemove-Item -Path $outputPath\n\n$configletVersion = (Select-String -Pattern \"/releases/download/(.+?)/\" -InputObject $downloadUrl -AllMatches).Matches.Groups[1].Value\nWrite-Output \"Downloaded configlet ${configletVersion} to ${configletPath}\"\n"
  },
  {
    "path": "bin/format.sh",
    "content": "#!/usr/bin/env bash\n\nset -uo pipefail\n\nif [ -z \"${EXERCISM_PRETTIER_VERSION:-}\" ]; then\n  echo \"[format] pulling prettier version from yarn.lock using sed\"\n  EXERCISM_PRETTIER_VERSION=\"$(corepack yarn info prettier --json --name-only | sed -n -e 's/^\"prettier@npm://' -e 's/\"//p')\"\n  echo \"[format] expected version is now ${EXERCISM_PRETTIER_VERSION:-}\"\nfi\n\nif [ -z \"${EXERCISM_PRETTIER_VERSION:-}\" ]; then\n  echo \"Version could not be pulled using sed\" >&2\n  echo \"[format] pulling prettier version from yarn.lock using grep\"\n  EXERCISM_PRETTIER_VERSION=\"$(corepack yarn info prettier --json --name-only | grep -Po '\"prettier@npm:\\K[^\"]+')\"\n  echo \"[format] expected version is now ${EXERCISM_PRETTIER_VERSION:-}\"\nfi\n\nif [ -z \"${EXERCISM_PRETTIER_VERSION:-}\" ]; then\n  echo \"Version could not be pulled using grep or sed\" >&2\n  echo \"\"\n  echo \"---------------------------------------------------\"\n  echo \"This script requires the EXERCISM_PRETTIER_VERSION variable to work.\"\n  echo \"Please see https://exercism.org/docs/building/markdown/style-guide for guidance.\"\n  echo \"---------------------------------------------------\"\n  echo \"$(corepack yarn -v)\"\n  echo \"\"\n  echo \"This is what corepack yarn why reports:\"\n  echo \"$ corepack yarn why prettier\"\n  echo \"$(corepack yarn why prettier)\"\n  echo \"\"\n  echo \"And corepack yarn info reports the following:\"\n  echo \"$ corepack yarn info prettier --name-only\"\n  echo \"$(corepack yarn info prettier --name-only)\"\n  echo \"\"\n  echo \"This is the version that can be extracted using grep:\"\n  echo \"$ corepack yarn info prettier --json --name-only | grep -Po '\"prettier@npm:\\K[^\"]+'\"\n  echo \"└─ $(corepack yarn info prettier --json --name-only | grep -Po '\"prettier@npm:\\K[^\"]+')\"\n  echo \"\"\n  echo \"This is the version that can be extracted using sed:\"\n  echo \"$ corepack yarn info prettier --json --name-only | sed -n -e 's/^\"prettier@npm://' -e 's/\"//p'\"\n  echo \"└─ $(corepack yarn info prettier --json --name-only | sed -n -e 's/^\"prettier@npm://' -e 's/\"//p')\"\n  echo \"\"\n  echo \"These files are found in the repo root:\"\n  echo \"$(ls -p | grep -v /)\"\n  echo \"---------------------------------------------------\"\n  exit 1\nelse\n echo \"[format] running with prettier@$EXERCISM_PRETTIER_VERSION\"\nfi\n\ncorepack yarn dlx \"prettier@$EXERCISM_PRETTIER_VERSION\" --write \"**/*.{js,jsx,ts,tsx,css,sass,scss,html,json,md,yml}\"\n"
  },
  {
    "path": "bin/generate-config-tree",
    "content": "#!/usr/bin/env node\n\nconst { exercises } = require('../config.json')\nconst TAG_CORE = '__core'\nconst TAG_BONUS = '__bonus'\n\n// node inter-opt exports\nexports.TAG_CORE = TAG_CORE\nexports.TAG_BONUS = TAG_BONUS\n\nexports.tree = exercises.reduce((result, exercise) => {\n    const tag = exercise.slug\n    const item = {\n        slug: tag,\n        difficulty: exercise.difficulty,\n    }\n\n    if (exercise.core) {\n        const current = result[TAG_CORE] || []\n\n        if (result[tag]) {\n            console.warn(`${tag} is not ordered correctly in config.json`)\n        }\n\n        return {\n            ...result,\n            __core: current.concat([item]),\n            [tag]: result[tag] || []\n        }\n    }\n\n    const parent = exercise.unlocked_by || TAG_BONUS\n    const current = result[parent] || []\n    return { ...result, [parent]: current.concat([item]) }\n}, {})\n"
  },
  {
    "path": "bin/md5-hash",
    "content": "#!/bin/bash\n#\n# Calculates the MD5 hash of a given file. It uses hashing utilities powered by\n# operating systems, but wraps them into a consistent interface.\n\nOS=$(\n    case $(uname) in\n        (Darwin*)  echo \"mac\";;\n        (Linux*)   echo \"linux\";;\n        # TODO: implement MD5 hashing on Windows\n        # (Windows*) echo \"windows\";;\n        (*)        echo \"linux\";;\n    esac\n)\n\ncase $OS in\n    mac )\n        md5 -q $@;;\n    linux )\n        md5sum $@ | sed -E 's/([a-z0-9]{32}).+$/\\1/';;\nesac\n"
  },
  {
    "path": "bin/print-config-tree",
    "content": "#!/usr/bin/env node\n\nconst actions = require('./generate-config-tree')\n\nconst { tree, TAG_BONUS, TAG_CORE } = actions\nconst { [TAG_BONUS]: __bonus, [TAG_CORE]: __core, ...track } = tree\n\nfunction printLn(line) {\n    process.stdout.write(`${line}\\n`)\n}\n\nfunction printList(items) {\n    items.forEach(item => {\n        printLn(`- ${item.slug} (${item.difficulty})`)\n    })\n}\n\nprintLn('Core (matches config.json) of this track:')\nprintList(__core)\nprintLn('\\n')\nprintLn('core')\nprintLn('----')\nObject.keys(track).forEach(slug => {\n    printLn(`├─ ${slug}`)\n    track[slug].forEach((side, index, self) => {\n        junction = index === self.length - 1 ? '└─' : '├─'\n        printLn(`│  ${junction} ${side.slug} (${side.difficulty})`)\n    })\n    printLn('│')\n})\n\nprintLn('bonus')\nprintLn('----')\nprintList(__bonus)\n"
  },
  {
    "path": "common/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "common/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "common/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "common/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "common/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "common/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "common/keep.ts",
    "content": "// This exists to keep tsconfig.json in this folder happy\nexport {}\n"
  },
  {
    "path": "common/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"author\": \"Katrina Owen\",\n  \"contributors\": [\n    \"Derk-Jan Karrenbeld <derk-jan+git@karrenbeld.info> (https://derk-jan.com)\"\n  ],\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "common/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "common/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "concepts/.keep",
    "content": ""
  },
  {
    "path": "concepts/basics/.meta/config.json",
    "content": "{\n  \"blurb\": \"Basics contains the minimal knowledge required to get started in TypeScript: function declarations, variable assignment, and exposing entities.\",\n  \"authors\": [\"SleeplessByte\"],\n  \"contributors\": [\"junedev\"]\n}\n"
  },
  {
    "path": "concepts/basics/about.md",
    "content": "# About\n\nTypeScript is JavaScript with syntax for types, making it a a strongly typed programming language, supporting object-oriented, imperative, and declarative (e.g. functional programming) styles, giving you better tooling at any scale.\nIt has a few [primitives][mdn-primitive], and everything else is considered an object.\n\nWhile JavaScript is the most well-known as the scripting language for Web pages, many non-browser environments also use it, such as Node.js.\nThe language is actively being developed; and because of its multi-paradigm property, allows for many styles of programming.\n\nTypeScript builds on-top of this and is also actively developed.\nIn some rankings from 2023 it is more popular than JavaScript in daily use.\n\nBecause [you cannot learn TypeScript without learning JavaScript][handbook-js-or-ts], some of the content in this Track is focused on teaching JavaScript concepts and some of the concepts focus on TypeScript specific features only.\n\n## (Re-)Assignment\n\nThere are a few primary ways to assign values to names in TypeScript - using variables or constants.\nOn Exercism, variables are always written in [camelCase][wiki-camel-case]; constants are written in [SCREAMING_SNAKE_CASE][wiki-snake-case].\nThere is no official guide to follow, and various companies and organizations have various style guides.\n_Feel free to write variables any way you like_.\nThe upside from writing them the way the exercises are prepared is that they'll be highlighted differently in the web interface and most IDEs.\n\nVariables in TypeScript can be defined using the [`const`][mdn-const], [`let`][mdn-let] or [`var`][mdn-var] keyword.\n\nA variable can reference different values over its lifetime when using `let` or `var`.\nFor example, `myFirstVariable` can be defined and redefined many times using the assignment operator `=`:\n\n```typescript\nlet myFirstVariable = 1\nmyFirstVariable = 'Some string'\nmyFirstVariable = new SomeComplexClass()\n```\n\nIn contrast to `let` and `var`, variables that are defined with `const` can only be assigned once.\nThis is used to define constants in TypeScript.\n\n```typescript\nconst MY_FIRST_CONSTANT = 10\n\n// Can not be re-assigned.\nMY_FIRST_CONSTANT = 20\n// => TypeError: Assignment to constant variable.\n```\n\nBecause TypeScript can detect this statically, the TypeScript compiler will also yield an error:\n\n```typescript\n// ^? Cannot assign to 'MY_FIRST_CONSTANT' because it is a constant.(2588)\n```\n\nThis means you don't need to run the code to detect the `TypeError`.\n\n<!--prettier-ignore -->\n~~~~exercism/note\n💡 In a later Learning Exercise, the difference between _constant_ assignment / binding and _constant_ value is explored and explained.\n~~~~\n\n## Type inference\n\nWithout diving too deep into the subject of [type inference][handbook-type-inference], you should be aware that an assigned variable usually as an inferred type, even without a type annotation.\n\n```typescript\nconst MY_FIRST_CONSTANT = 10\n// ^? const MY_FIRST_CONSTANT: number\n```\n\nThis type is then enforced throughout the code.\nThis also means that where the following code is valid JavaScript:\n\n```javascript\nlet myFirstVariable = 1\nmyFirstVariable = 'Some string'\n```\n\nIt complains when using TypeScript:\n\n```typescript\nlet myFirstVariable = 1\nmyFirstVariable = 'Some string'\n// ^? Type 'string' is not assignable to type 'number'.(2322)\n```\n\nThis feature ensures type-safety even when type annotations are not used.\n\n### Constant Assignment\n\nThe `const` keyword is mentioned _both_ for variables and constants.\nAnother concept often mentioned around constants is [(im)-mutability][wiki-mutability].\n\nThe `const` keyword only makes the _binding_ immutable, that is, you can only assign a value to a `const` variable once.\nIn TypeScript, only [primitive][mdn-primitive] values are immutable.\nHowever, [non-primitive][mdn-primitive] values can still be mutated.\n\n```typescript\nconst MY_MUTABLE_VALUE_CONSTANT = { food: 'apple' }\n\n// This is possible\nMY_MUTABLE_VALUE_CONSTANT.food = 'pear'\n\nMY_MUTABLE_VALUE_CONSTANT\n// => { food: \"pear\" }\n```\n\n### Constant Value (Immutability)\n\nAs a rule, on Exercism, and many other organizations and project style guides, don't mutate values that look like `const SCREAMING_SNAKE_CASE`.\nTechnically the values _can_ be changed, but for clarity and expectation management on Exercism this is discouraged.\nWhen this _must_ be enforced, use [`Object.freeze(value)`][mdn-object-freeze].\n\nWhere possible, the TypeScript keyword `readonly`, `as const`, or `Readonly<T>` generic type may be used to enforce immutability statically.\nYou will learn more about this subject later.\n\n```typescript\nconst MY_VALUE_CONSTANT = Object.freeze({ food: 'apple' })\n\nMY_VALUE_CONSTANT.food = 'pear'\n// ^? Cannot assign to 'food' because it is a read-only property.(2540)\n\nMY_VALUE_CONSTANT\n// => { food: \"apple\" }\n```\n\nIn the wild, it's unlikely to see `Object.freeze` all over a code base, but the rule to not mutate a `SCREAMING_SNAKE_CASE` value ever, is a good rule; often enforced using automated analysis such as a linter.\n\n## Function Declarations\n\nIn TypeScript, units of functionality are encapsulated in _functions_, usually grouping functions together in the same file if they belong together.\nThese functions can take parameters (arguments), and can _return_ a value using the `return` keyword.\nFunctions are invoked using `()` syntax.\n\n```typescript\nfunction add(num1: number, num2: number): number {\n  return num1 + num2\n}\n\nadd(1, 3)\n// => 4\n```\n\nFunction parameters should usually be annotated with a type using a colon (`:`) followed by the type.\nFunction return values can be annotated after closing the parameter list using a colon (`:`) followed by the type.\n\nIf a function does not have a type annotation for its return value, the type will be inferred.\n\n```typescript\nfunction add(num1: number, num2: number) {\n  return num1 + num2\n}\n\nadd(1, 3)\n// ^? function add(num1: number, num2: number): number\n```\n\nHere the return type was inferred because TypeScript knows that the result of `number + number` must always be `number`.\n\n<!--prettier-ignore -->\n~~~~exercism/note\n💡 In TypeScript there are _many_ different ways to declare a function.\nThese other ways look different than using the `function` keyword.\nThe track tries to gradually introduce them, but if you already know about them, feel free to use any of them.\nIn most cases, using one or the other isn't better or worse.\n~~~~\n\n## Type Annotations\n\nAs shown in the function declaration for `add`, the parameters have an explicit type annotation `: number`.\nVariable declarations, class properties, function declarations and more all support type annotations.\n\nBoth explicit type annotation as inferred types are enforced by the type-checker.\n\n```typescript\nadd('foo', 3)\n// ^? Argument of type 'string' is not assignable to parameter of type 'number'.(2345)\n```\n\nIf TypeScript does not find an explicit type annotation and cannot infer the type, it will assign the `any` type, which [you should not use][handbook-dont-use-any].\nLater you will learn about the `unknown` type as a good alternative.\n\n## Export and Import\n\nThe `export` and `import` keywords are powerful tools that turn a regular TypeScript file into a [TypeScript module][mdn-module].\nApart from allowing code to selectively expose components, such as functions, classes, variables and constants, it also enables a whole range of other features, such as:\n\n- [Renaming exports and imports][mdn-renaming-modules], which allows you to avoid naming conflicts,\n- [Dynamic Imports][mdn-dynamic-imports], which loads code on demand,\n- [Tree shaking][blog-tree-shaking], which reduces the size of the final code by eliminating side-effect free modules and even contents of modules _that are not used_,\n- Exporting [_live bindings_][blog-live-bindings], which allows you to export a value that mutates everywhere it's imported if the original value mutates.\n\nA concrete example is how the tests work on Exercism's TypeScript Track.\nEach exercise has at least one implementation file, for example `lasagna.ts`, and each exercise has at least one test file, for example `lasagna.test.ts`.\nThe implementation file uses `export` to expose the public API and the test file uses `import` to access these, which is how it can test the implementation's outcomes.\n\n```typescript\n// file.js\nexport const MY_VALUE = 10\n\nexport function add(num1, num2) {\n  return num1 + num2\n}\n\n// file.spec.js\nimport { MY_VALUE, add } from './file.js'\n\nadd(MY_VALUE, 5)\n// => 15\n```\n\n<!--prettier-ignore -->\n~~~~exercism/advanced\nBecause the TypeScript compiler does _not rewrite import paths_, the imports should be written using the `.js` extension (as that's what it will become after transpilation).\nHowever, the option `allowImportingTsExtensions` is on because we have a process that rewrites the paths.\nThis allows importing from `.ts` (as well as `.js`).\n\nIn older code you will find imports _without file extension_.\n~~~~\n\n[blog-live-bindings]: https://2ality.com/2015/07/es6-module-exports.html#es6-modules-export-immutable-bindings\n[blog-tree-shaking]: https://bitsofco.de/what-is-tree-shaking/\n[mdn-const]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const\n[mdn-dynamic-imports]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#Dynamic_Imports\n[mdn-let]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let\n[mdn-module]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules\n[mdn-object-freeze]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze\n[mdn-primitive]: https://developer.mozilla.org/en-US/docs/Glossary/Primitive\n[mdn-renaming-modules]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules#Renaming_imports_and_exports\n[mdn-var]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var\n[handbook-dont-use-any]: https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html#any\n[handbook-js-or-ts]: https://www.typescriptlang.org/docs/handbook/typescript-from-scratch.html#learning-javascript-and-typescript\n[handbook-type-inference]: https://www.typescriptlang.org/docs/handbook/type-inference.html\n[wiki-mutability]: https://en.wikipedia.org/wiki/Immutable_object\n[wiki-camel-case]: https://en.wikipedia.org/wiki/Camel_case\n[wiki-snake-case]: https://en.wikipedia.org/wiki/Snake_case\n"
  },
  {
    "path": "concepts/basics/introduction.md",
    "content": "# Introduction\n\nTypeScript is JavaScript with syntax for types, making it a a strongly typed programming language, supporting object-oriented, imperative, and declarative (e.g. functional programming) styles, giving you better tooling at any scale.\n\nBecause [you cannot learn TypeScript without learning JavaScript][handbook-js-or-ts], some of the content in this Track is focused on teaching JavaScript concepts and some of the concepts focus on TypeScript specific features only.\n\n## (Re-)Assignment\n\nThere are a few primary ways to assign values to names in TypeScript - using variables or constants.\nOn Exercism, variables are always written in [camelCase][wiki-camel-case]; constants are written in [SCREAMING_SNAKE_CASE][wiki-snake-case].\nThere is no official guide to follow, and various companies and organizations have various style guides.\n_Feel free to write variables any way you like_.\nThe upside from writing them the way the exercises are prepared is that they'll be highlighted differently in the web interface and most IDEs.\n\nVariables in TypeScript can be defined using the [`const`][mdn-const], [`let`][mdn-let] or [`var`][mdn-var] keyword.\n\nA variable can reference different values over its lifetime when using `let` or `var`.\nFor example, `myFirstVariable` can be defined and redefined many times using the assignment operator `=`:\n\n```typescript\nlet myFirstVariable = 1\nmyFirstVariable = 0\nmyFirstVariable = 42\n```\n\nIn contrast to `let` and `var`, variables that are defined with `const` can only be assigned once.\nThis is used to define constants in TypeScript.\n\n```typescript\nconst MY_FIRST_CONSTANT = 10\n\n// Can not be re-assigned.\nMY_FIRST_CONSTANT = 20\n// => TypeError: Assignment to constant variable.\n```\n\nBecause TypeScript can detect this statically, the TypeScript compiler will also yield an error:\n\n```typescript\n// ^? Cannot assign to 'MY_FIRST_CONSTANT' because it is a constant.(2588)\n```\n\nThis means you don't need to run the code to detect the `TypeError`.\n\n<!--prettier-ignore -->\n~~~~exercism/note\n💡 In a later Learning Exercise, the difference between _constant_ assignment / binding and _constant_ value is explored and explained.\n~~~~\n\n## Type inference\n\nWithout diving too deep into the subject of [type inference][handbook-type-inference], you should be aware that an assigned variable usually as an inferred type, even without a type annotation.\n\n```typescript\nconst MY_FIRST_CONSTANT = 10\n// ^? const MY_FIRST_CONSTANT: number\n```\n\nThis type is then enforced throughout the code.\nThis also means that where the following code is valid JavaScript:\n\n```javascript\nlet myFirstVariable = 1\nmyFirstVariable = 'Some string'\n```\n\nIt complains when using TypeScript:\n\n```typescript\nlet myFirstVariable = 1\nmyFirstVariable = 'Some string'\n// ^? Type 'string' is not assignable to type 'number'.(2322)\n```\n\nThis feature ensures type-safety even when type annotations are not used.\n\n## Function Declarations\n\nIn TypeScript, units of functionality are encapsulated in _functions_, usually grouping functions together in the same file if they belong together.\nThese functions can take parameters (arguments), and can _return_ a value using the `return` keyword.\nFunctions are invoked using `()` syntax.\n\n```typescript\nfunction add(num1: number, num2: number): number {\n  return num1 + num2\n}\n\nadd(1, 3)\n// => 4\n```\n\nFunction parameters should usually be annotated with a type using a colon (`:`) followed by the type.\nFunction return values can be annotated after closing the parameter list using a colon (`:`) followed by the type.\n\n<!--prettier-ignore -->\n~~~~exercism/note\n💡 In TypeScript there are _many_ different ways to declare a function.\nThese other ways look different than using the `function` keyword.\nThe track tries to gradually introduce them, but if you already know about them, feel free to use any of them.\nIn most cases, using one or the other isn't better or worse.\n~~~~\n\n## Type Annotations\n\nAs shown in the function declaration for `add`, the parameters have an explicit type annotation `: number`.\nVariable declarations, class properties, function declarations and more all support type annotations.\n\nBoth explicit type annotation as inferred types are enforced by the type-checker.\n\n```typescript\nadd('foo', 3)\n// ^? Argument of type 'string' is not assignable to parameter of type 'number'.(2345)\n```\n\n## Exposing to Other Files\n\nTo make a `function`, a constant, or a variable available in _other files_, they need to be [exported][mdn-export] using the `export` keyword.\nAnother file may then [import][mdn-import] these using the `import` keyword.\nThis is also known as the module system.\nA great example is how all the tests work.\nEach exercise has at least one file, for example `lasagna.ts`, which contains the _implementation_.\nAdditionally, there is at least one other file, for example `lasagna.test.ts`, that contains the _tests_.\nThis file _imports_ the public (i.e. exported) entities to test the implementation:\n\n```typescript\n// file.ts\nexport const MY_VALUE = 10\n\nexport function add(num1, num2) {\n  return num1 + num2\n}\n\n// file.test.ts\nimport { MY_VALUE, add } from './file.js'\n\nadd(MY_VALUE, 5)\n// => 15\n```\n\n[mdn-const]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const\n[mdn-export]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export\n[mdn-import]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import\n[mdn-let]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let\n[mdn-var]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var\n[handbook-js-or-ts]: https://www.typescriptlang.org/docs/handbook/typescript-from-scratch.html#learning-javascript-and-typescript\n[handbook-type-inference]: https://www.typescriptlang.org/docs/handbook/type-inference.html\n[wiki-camel-case]: https://en.wikipedia.org/wiki/Camel_case\n[wiki-snake-case]: https://en.wikipedia.org/wiki/Snake_case\n"
  },
  {
    "path": "concepts/basics/links.json",
    "content": "[\n  {\n    \"url\": \"https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html\",\n    \"description\": \"TypeScript for JavaScript Programmers\"\n  },\n  {\n    \"url\": \"https://www.typescriptlang.org/docs/handbook/2/basic-types.html\",\n    \"description\": \"TypeScript Handbook: The Basics\"\n  },\n  {\n    \"url\": \"https://www.typescriptlang.org/docs/handbook/type-inference.html\",\n    \"description\": \"TypeScript Handbook: Type Inference\"\n  },\n  {\n    \"url\": \"https://developer.mozilla.org/en-US/docs/Glossary/Primitive\",\n    \"description\": \"MDN Glossary: JavaScript Primitive\"\n  },\n  {\n    \"url\": \"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze\",\n    \"description\": \"MDN: JavaScript Object freezing\"\n  },\n  {\n    \"url\": \"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules\",\n    \"description\": \"MDN: JavaScript Module System\"\n  },\n  {\n    \"url\": \"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules#Renaming_imports_and_exports\",\n    \"description\": \"MDN: Renaming modules when importing or exporting\"\n  },\n  {\n    \"url\": \"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#Dynamic_Imports\",\n    \"description\": \"MDN: JavaScript Dynamic imports\"\n  },\n  {\n    \"url\": \"https://en.wikipedia.org/wiki/Immutable_object\",\n    \"description\": \"About immutable objects\"\n  },\n  {\n    \"url\": \"https://bitsofco.de/what-is-tree-shaking/\",\n    \"description\": \"About tree shaking\"\n  },\n  {\n    \"url\": \"https://2ality.com/2015/07/es6-module-exports.html#es6-modules-export-immutable-bindings\",\n    \"description\": \"About live bindings (JavaScript exports)\"\n  }\n]\n"
  },
  {
    "path": "config.json",
    "content": "{\n  \"language\": \"TypeScript\",\n  \"slug\": \"typescript\",\n  \"active\": true,\n  \"status\": {\n    \"concept_exercises\": false,\n    \"test_runner\": true,\n    \"representer\": true,\n    \"analyzer\": true\n  },\n  \"blurb\": \"TypeScript is a language for writing more maintainable JavaScript. TypeScript adds optional types, classes, and modules to JavaScript.\",\n  \"version\": 3,\n  \"online_editor\": {\n    \"indent_style\": \"space\",\n    \"indent_size\": 2,\n    \"highlightjs_language\": \"typescript\"\n  },\n  \"test_runner\": {\n    \"average_run_time\": 8\n  },\n  \"files\": {\n    \"solution\": [\n      \"%{kebab_slug}.ts\"\n    ],\n    \"test\": [\n      \"%{kebab_slug}.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ],\n    \"exemplar\": [\n      \".meta/exemplar.ts\"\n    ]\n  },\n  \"exercises\": {\n    \"concept\": [\n      {\n        \"slug\": \"lasagna\",\n        \"name\": \"lasagna\",\n        \"uuid\": \"a0bed44f-b179-4d09-8788-a23d2ace359e\",\n        \"concepts\": [\n          \"basics\"\n        ],\n        \"prerequisites\": [],\n        \"status\": \"wip\"\n      }\n    ],\n    \"practice\": [\n      {\n        \"slug\": \"hello-world\",\n        \"name\": \"Hello World\",\n        \"uuid\": \"755f6f85-9ab3-4af6-9e35-dbb9d64be9c5\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 1,\n        \"topics\": [\n          \"optional_values\",\n          \"strings\",\n          \"text_formatting\"\n        ]\n      },\n      {\n        \"slug\": \"two-fer\",\n        \"name\": \"Two Fer\",\n        \"uuid\": \"f66508fe-4ddc-4bbd-b8e6-542d400e57e9\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 1,\n        \"topics\": [\n          \"optional_values\",\n          \"strings\",\n          \"text_formatting\"\n        ]\n      },\n      {\n        \"slug\": \"resistor-color\",\n        \"name\": \"Resistor Color\",\n        \"uuid\": \"c6f41fd5-584c-46ca-b3c5-6a0825446bf4\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 1,\n        \"topics\": [\n          \"arrays\",\n          \"strings\"\n        ]\n      },\n      {\n        \"slug\": \"resistor-color-duo\",\n        \"name\": \"Resistor Color Duo\",\n        \"uuid\": \"fd677d24-72eb-46d9-bfa4-8013e96fa71f\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 2,\n        \"topics\": [\n          \"strings\",\n          \"arrays\"\n        ]\n      },\n      {\n        \"slug\": \"resistor-color-trio\",\n        \"name\": \"Resistor Color Trio\",\n        \"uuid\": \"9316fc6a-42d2-4b12-85e1-e8abd9ce3ae2\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 3,\n        \"topics\": [\n          \"strings\",\n          \"arrays\"\n        ]\n      },\n      {\n        \"slug\": \"leap\",\n        \"name\": \"Leap\",\n        \"uuid\": \"fb80f76c-42da-4f62-9f0f-8c85d984908b\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 1,\n        \"topics\": [\n          \"booleans\",\n          \"integers\",\n          \"logic\"\n        ]\n      },\n      {\n        \"slug\": \"line-up\",\n        \"name\": \"Line Up\",\n        \"uuid\": \"614dbbe5-56dc-47ea-86e6-ee64497f2cac\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 1,\n        \"topics\": [\n          \"numbers\",\n          \"strings\"\n        ]\n      },\n      {\n        \"slug\": \"rna-transcription\",\n        \"name\": \"RNA Transcription\",\n        \"uuid\": \"b4db381f-1c99-44c6-948c-c8892d77823e\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 2,\n        \"topics\": [\n          \"strings\",\n          \"transforming\"\n        ]\n      },\n      {\n        \"slug\": \"space-age\",\n        \"name\": \"Space Age\",\n        \"uuid\": \"8fe1e0ef-068e-4a53-a576-35be59f8152f\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 2,\n        \"topics\": [\n          \"classes\",\n          \"floating_point_numbers\"\n        ]\n      },\n      {\n        \"slug\": \"dnd-character\",\n        \"name\": \"D&D Character\",\n        \"uuid\": \"6f34eb4d-4028-4f89-9965-c9a887f416a0\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 2,\n        \"topics\": [\n          \"classes\"\n        ]\n      },\n      {\n        \"slug\": \"darts\",\n        \"name\": \"Darts\",\n        \"uuid\": \"5697c090-4ab3-4f76-b9d2-a82330a27a91\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 3\n      },\n      {\n        \"slug\": \"pangram\",\n        \"name\": \"Pangram\",\n        \"uuid\": \"721d9c74-cc16-4b32-8f0b-ffab75027539\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 3,\n        \"topics\": [\n          \"algorithms\",\n          \"conditionals\",\n          \"loops\",\n          \"lists\",\n          \"maps\",\n          \"searching\",\n          \"strings\"\n        ]\n      },\n      {\n        \"slug\": \"bob\",\n        \"name\": \"Bob\",\n        \"uuid\": \"3977d4e5-82ca-4801-ae20-6682dda23506\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 3,\n        \"topics\": [\n          \"conditionals\",\n          \"pattern_recognition\",\n          \"polymorphism\",\n          \"regular_expressions\",\n          \"strings\",\n          \"unicode\"\n        ]\n      },\n      {\n        \"slug\": \"matrix\",\n        \"name\": \"Matrix\",\n        \"uuid\": \"167ec8f2-a206-4a7e-999d-7dbfc136a9fe\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"data_structures\",\n          \"matrices\",\n          \"text_formatting\"\n        ]\n      },\n      {\n        \"slug\": \"robot-name\",\n        \"name\": \"Robot Name\",\n        \"uuid\": \"b00dd1af-f89c-4382-ab43-514651de6b20\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\n          \"conditionals\",\n          \"exception_handling\",\n          \"randomness\",\n          \"regular_expressions\",\n          \"sets\"\n        ]\n      },\n      {\n        \"slug\": \"grade-school\",\n        \"name\": \"Grade School\",\n        \"uuid\": \"32e79fd7-f002-4bdc-b6bd-7a91d8c1af61\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\n          \"arrays\",\n          \"maps\",\n          \"sorting\"\n        ]\n      },\n      {\n        \"slug\": \"clock\",\n        \"name\": \"Clock\",\n        \"uuid\": \"c6960d69-7794-4711-8891-9c5a63727112\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\n          \"integers\",\n          \"logic\",\n          \"strings\"\n        ]\n      },\n      {\n        \"slug\": \"split-second-stopwatch\",\n        \"name\": \"Split-Second Stopwatch\",\n        \"uuid\": \"bc1fc50f-36ed-4a16-92bd-3001c8cd53d3\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4\n      },\n      {\n        \"slug\": \"secret-handshake\",\n        \"name\": \"Secret Handshake\",\n        \"uuid\": \"ac2ec51b-a2cd-4d8c-99e3-5bd6758b4e7b\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\n          \"algorithms\",\n          \"arrays\",\n          \"bitwise_operations\",\n          \"conditionals\",\n          \"loops\",\n          \"games\"\n        ]\n      },\n      {\n        \"slug\": \"binary-search\",\n        \"name\": \"Binary Search\",\n        \"uuid\": \"53584e8d-9b8d-4c0e-8ad8-4c228fcf6bcf\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5,\n        \"topics\": [\n          \"algorithms\",\n          \"arrays\",\n          \"conditionals\",\n          \"loops\"\n        ]\n      },\n      {\n        \"slug\": \"linked-list\",\n        \"name\": \"Linked List\",\n        \"uuid\": \"5b7ab927-6e4d-480f-b005-d23091e579d6\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5,\n        \"topics\": [\n          \"algorithms\",\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"data_structures\",\n          \"lists\",\n          \"optional_values\"\n        ]\n      },\n      {\n        \"slug\": \"prism\",\n        \"name\": \"Prism\",\n        \"uuid\": \"ba7d5b31-50ab-482f-9669-718949ccb753\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5\n      },\n      {\n        \"slug\": \"rational-numbers\",\n        \"name\": \"Rational Numbers\",\n        \"uuid\": \"4439ab9d-266b-483b-b5ca-3920c478fd62\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5,\n        \"topics\": [\n          \"algorithms\",\n          \"floating_point_numbers\",\n          \"math\"\n        ]\n      },\n      {\n        \"slug\": \"atbash-cipher\",\n        \"name\": \"Atbash Cipher\",\n        \"uuid\": \"04de61fb-9fde-461c-b306-0b4ce52e2169\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 6,\n        \"topics\": [\n          \"algorithms\",\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"text_formatting\"\n        ]\n      },\n      {\n        \"slug\": \"simple-cipher\",\n        \"name\": \"Simple Cipher\",\n        \"uuid\": \"3ea9d03e-6d06-48e5-a4d3-6e1bb9367c2f\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 7,\n        \"topics\": [\n          \"algorithms\",\n          \"conditionals\",\n          \"loops\",\n          \"randomness\",\n          \"strings\",\n          \"text_formatting\",\n          \"transforming\"\n        ]\n      },\n      {\n        \"slug\": \"wordy\",\n        \"name\": \"Wordy\",\n        \"uuid\": \"269577e5-e782-4264-9ad9-9ad4b8bc0aab\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 7,\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"exception_handling\",\n          \"parsing\",\n          \"pattern_recognition\",\n          \"regular_expressions\",\n          \"strings\"\n        ]\n      },\n      {\n        \"slug\": \"list-ops\",\n        \"name\": \"List Ops\",\n        \"uuid\": \"26787ded-0aa2-46f6-88dd-13a00cce9236\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 8,\n        \"topics\": [\n          \"data_structures\",\n          \"lists\",\n          \"recursion\"\n        ]\n      },\n      {\n        \"slug\": \"word-count\",\n        \"name\": \"Word Count\",\n        \"uuid\": \"5e5c48fb-91bb-495a-97f6-ec8642739a0a\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 1,\n        \"topics\": [\n          \"loops\",\n          \"lists\",\n          \"regular_expressions\",\n          \"strings\",\n          \"unicode\"\n        ]\n      },\n      {\n        \"slug\": \"difference-of-squares\",\n        \"name\": \"Difference of Squares\",\n        \"uuid\": \"3f649490-dc7d-4a77-a2a0-2ae71ae834a9\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 3,\n        \"topics\": [\n          \"algorithms\",\n          \"loops\",\n          \"integers\",\n          \"math\"\n        ]\n      },\n      {\n        \"slug\": \"gigasecond\",\n        \"name\": \"Gigasecond\",\n        \"uuid\": \"9dfabc5c-d2a5-4896-9fc2-2b25b9a5f62f\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 3,\n        \"topics\": [\n          \"time\"\n        ]\n      },\n      {\n        \"slug\": \"square-root\",\n        \"name\": \"Square Root\",\n        \"uuid\": \"bf4a0802-334b-4ed7-9ade-a3ef5fa6878e\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 2\n      },\n      {\n        \"slug\": \"reverse-string\",\n        \"name\": \"Reverse String\",\n        \"uuid\": \"86d5a60a-fc44-443d-bc00-5c6265e736c4\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 2,\n        \"topics\": [\n          \"loops\",\n          \"strings\"\n        ]\n      },\n      {\n        \"slug\": \"triangle\",\n        \"name\": \"Triangle\",\n        \"uuid\": \"0eb37e93-d191-4451-bd77-cd3681c91d94\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 3,\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"exception_handling\",\n          \"integers\"\n        ]\n      },\n      {\n        \"slug\": \"collatz-conjecture\",\n        \"name\": \"Collatz Conjecture\",\n        \"uuid\": \"a701b4ca-55ea-4aa9-a607-2fe8a9828d9c\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\n          \"conditionals\",\n          \"exception_handling\",\n          \"integers\",\n          \"math\",\n          \"recursion\"\n        ]\n      },\n      {\n        \"slug\": \"etl\",\n        \"name\": \"ETL\",\n        \"uuid\": \"ab027a47-d483-4011-aac4-564a6284e5b8\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 2,\n        \"topics\": [\n          \"loops\",\n          \"integers\",\n          \"maps\",\n          \"transforming\"\n        ]\n      },\n      {\n        \"slug\": \"protein-translation\",\n        \"name\": \"Protein Translation\",\n        \"uuid\": \"e18a436f-5d7b-4372-9f74-15e8e9a52d63\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 2,\n        \"topics\": [\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"strings\"\n        ]\n      },\n      {\n        \"slug\": \"raindrops\",\n        \"name\": \"Raindrops\",\n        \"uuid\": \"c8677318-ba6c-4e8c-83ec-513cc6530e7f\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 2,\n        \"topics\": [\n          \"conditionals\",\n          \"integers\",\n          \"strings\",\n          \"transforming\"\n        ]\n      },\n      {\n        \"slug\": \"hamming\",\n        \"name\": \"Hamming\",\n        \"uuid\": \"18204e23-fca8-44dc-8d5c-abe66b87c640\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 3,\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"equality\",\n          \"strings\"\n        ]\n      },\n      {\n        \"slug\": \"nucleotide-count\",\n        \"name\": \"Nucleotide Count\",\n        \"uuid\": \"ef16d487-524e-4c5a-8311-9162babba181\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"strings\",\n          \"text_formatting\"\n        ]\n      },\n      {\n        \"slug\": \"camicia\",\n        \"name\": \"Camicia\",\n        \"uuid\": \"5ee5b5e4-bc56-4be5-b384-225b2b339444\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5,\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"strings\"\n        ]\n      },\n      {\n        \"slug\": \"scrabble-score\",\n        \"name\": \"Scrabble Score\",\n        \"uuid\": \"7c60f7c5-2922-4ce4-acbe-51c5ab654b4d\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5,\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"maps\",\n          \"strings\"\n        ]\n      },\n      {\n        \"slug\": \"allergies\",\n        \"name\": \"Allergies\",\n        \"uuid\": \"9389fcb2-841a-42b6-8ece-f5a63f750273\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 6,\n        \"topics\": [\n          \"arrays\",\n          \"bitwise_operations\",\n          \"conditionals\",\n          \"loops\"\n        ]\n      },\n      {\n        \"slug\": \"perfect-numbers\",\n        \"name\": \"Perfect Numbers\",\n        \"uuid\": \"53cc064f-35d2-4a0e-a915-6a25130252c3\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 3,\n        \"topics\": [\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"integers\",\n          \"math\"\n        ]\n      },\n      {\n        \"slug\": \"complex-numbers\",\n        \"name\": \"Complex Numbers\",\n        \"uuid\": \"59d842b4-a804-4cd5-a388-983a22a70c9e\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"math\"\n        ]\n      },\n      {\n        \"slug\": \"luhn\",\n        \"name\": \"Luhn\",\n        \"uuid\": \"249365fb-145c-40e3-90ed-11f3f74a9df1\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"integers\",\n          \"strings\"\n        ]\n      },\n      {\n        \"slug\": \"grains\",\n        \"name\": \"Grains\",\n        \"uuid\": \"5a04b3f8-99b6-4aec-8afd-0d54930e4aff\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5,\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"integers\"\n        ]\n      },\n      {\n        \"slug\": \"pythagorean-triplet\",\n        \"name\": \"Pythagorean Triplet\",\n        \"uuid\": \"85d74be3-8a54-4355-9ef8-0f13ed2a7683\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5,\n        \"topics\": [\n          \"algorithms\",\n          \"conditionals\",\n          \"loops\",\n          \"integers\",\n          \"math\"\n        ]\n      },\n      {\n        \"slug\": \"relative-distance\",\n        \"name\": \"Relative Distance\",\n        \"uuid\": \"bbdf7688-65cb-4291-9a4a-0ab89d122a31\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5,\n        \"topics\": [\n          \"algorithms\",\n          \"data_structures\",\n          \"maps\"\n        ]\n      },\n      {\n        \"slug\": \"sum-of-multiples\",\n        \"name\": \"Sum of Multiples\",\n        \"uuid\": \"e431fb10-766a-4542-94ad-9c30224a3885\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5,\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"integers\",\n          \"lists\",\n          \"math\"\n        ]\n      },\n      {\n        \"slug\": \"acronym\",\n        \"name\": \"Acronym\",\n        \"uuid\": \"f6631a0f-2da3-47a4-b46b-7a81fa0d4dfd\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 2,\n        \"topics\": [\n          \"loops\",\n          \"regular_expressions\",\n          \"strings\",\n          \"transforming\"\n        ]\n      },\n      {\n        \"slug\": \"anagram\",\n        \"name\": \"Anagram\",\n        \"uuid\": \"d3c93056-07b9-4d06-a681-1bb25db68c01\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 2,\n        \"topics\": [\n          \"filtering\",\n          \"strings\"\n        ]\n      },\n      {\n        \"slug\": \"isogram\",\n        \"name\": \"Isogram\",\n        \"uuid\": \"505eadfc-40df-476f-82d7-fe3b78b1f713\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 3,\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"filtering\",\n          \"searching\",\n          \"strings\"\n        ]\n      },\n      {\n        \"slug\": \"roman-numerals\",\n        \"name\": \"Roman Numerals\",\n        \"uuid\": \"a4ea1a4d-d010-4039-a2b5-e3e748df7f8a\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 3,\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"pattern_recognition\",\n          \"transforming\"\n        ]\n      },\n      {\n        \"slug\": \"series\",\n        \"name\": \"Series\",\n        \"uuid\": \"dd332597-4924-48dc-abb3-1d3fde492777\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 3,\n        \"topics\": [\n          \"loops\",\n          \"exception_handling\",\n          \"strings\",\n          \"text_formatting\"\n        ]\n      },\n      {\n        \"slug\": \"state-of-tic-tac-toe\",\n        \"name\": \"State of Tic-Tac-Toe\",\n        \"uuid\": \"86316f23-cbea-4a4d-b5e0-577d24073f08\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 2\n      },\n      {\n        \"slug\": \"phone-number\",\n        \"name\": \"Phone Number\",\n        \"uuid\": \"bbd4665c-be4b-4d70-bc92-e91ce7a1d55f\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5,\n        \"topics\": [\n          \"parsing\",\n          \"transforming\"\n        ]\n      },\n      {\n        \"slug\": \"two-bucket\",\n        \"name\": \"Two Bucket\",\n        \"uuid\": \"6d187289-27b2-4630-b37b-58553271188a\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 6,\n        \"topics\": [\n          \"algorithms\",\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"exception_handling\",\n          \"games\",\n          \"parsing\"\n        ]\n      },\n      {\n        \"slug\": \"variable-length-quantity\",\n        \"name\": \"Variable Length Quantity\",\n        \"uuid\": \"50050198-b5a3-4ab1-8b4b-0eadc8007ebb\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 6,\n        \"topics\": [\n          \"algorithms\",\n          \"arrays\",\n          \"bitwise_operations\",\n          \"conditionals\",\n          \"loops\",\n          \"exception_handling\",\n          \"lists\",\n          \"transforming\"\n        ]\n      },\n      {\n        \"slug\": \"largest-series-product\",\n        \"name\": \"Largest Series Product\",\n        \"uuid\": \"b646dc26-59c1-436e-883a-20290de7a526\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 7,\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"exception_handling\",\n          \"integers\",\n          \"math\",\n          \"regular_expressions\",\n          \"strings\"\n        ]\n      },\n      {\n        \"slug\": \"food-chain\",\n        \"name\": \"Food Chain\",\n        \"uuid\": \"246129c9-83b5-43e0-beb6-8a2cea7e4e17\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\n          \"algorithms\",\n          \"text_formatting\"\n        ]\n      },\n      {\n        \"slug\": \"house\",\n        \"name\": \"House\",\n        \"uuid\": \"9850a74a-1842-4db0-b3ed-5a53b4f25050\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"recursion\",\n          \"strings\"\n        ]\n      },\n      {\n        \"slug\": \"isbn-verifier\",\n        \"name\": \"ISBN Verifier\",\n        \"uuid\": \"50447e18-cfe8-43fb-a791-e8a82483bef6\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"pattern_recognition\",\n          \"regular_expressions\",\n          \"strings\"\n        ]\n      },\n      {\n        \"slug\": \"pig-latin\",\n        \"name\": \"Pig Latin\",\n        \"uuid\": \"38951bf1-6e7d-4d7d-9b7d-219471f17112\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"games\",\n          \"regular_expressions\",\n          \"strings\",\n          \"transforming\"\n        ]\n      },\n      {\n        \"slug\": \"proverb\",\n        \"name\": \"Proverb\",\n        \"uuid\": \"b18876a7-f281-46e5-94b9-f805bb0d1fec\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"optional_values\",\n          \"strings\",\n          \"text_formatting\"\n        ]\n      },\n      {\n        \"slug\": \"twelve-days\",\n        \"name\": \"Twelve Days\",\n        \"uuid\": \"cb04ab17-9611-44a1-8406-ed385da0044d\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"pattern_recognition\",\n          \"polymorphism\",\n          \"strings\"\n        ]\n      },\n      {\n        \"slug\": \"beer-song\",\n        \"name\": \"Beer Song\",\n        \"uuid\": \"7a4fefd2-6e71-42d6-82fd-a25d2ef9eae9\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5,\n        \"status\": \"deprecated\",\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"strings\"\n        ]\n      },\n      {\n        \"slug\": \"say\",\n        \"name\": \"Say\",\n        \"uuid\": \"8e7b92f4-a508-4200-bd62-b36281dd9ed9\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 6,\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"exception_handling\",\n          \"integers\",\n          \"strings\",\n          \"text_formatting\"\n        ]\n      },\n      {\n        \"slug\": \"rectangles\",\n        \"name\": \"Rectangles\",\n        \"uuid\": \"6d81d98f-afde-4aea-85ff-c7baef98fb7e\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"matrices\",\n          \"strings\"\n        ]\n      },\n      {\n        \"slug\": \"saddle-points\",\n        \"name\": \"Saddle Points\",\n        \"uuid\": \"d35da73a-5124-4911-a2c3-07c68d4b79c2\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"integers\",\n          \"lists\",\n          \"matrices\",\n          \"sets\"\n        ]\n      },\n      {\n        \"slug\": \"spiral-matrix\",\n        \"name\": \"Spiral Matrix\",\n        \"uuid\": \"702b1e87-55db-479f-9ef9-4ccdfe8849b1\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"data_structures\",\n          \"matrices\"\n        ]\n      },\n      {\n        \"slug\": \"transpose\",\n        \"name\": \"Transpose\",\n        \"uuid\": \"4e484e0f-0b24-4778-a949-224294735c23\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"lists\",\n          \"matrices\",\n          \"strings\",\n          \"text_formatting\"\n        ]\n      },\n      {\n        \"slug\": \"ocr-numbers\",\n        \"name\": \"OCR Numbers\",\n        \"uuid\": \"61f0964f-0779-446d-bd6b-6bb988414302\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5,\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"equality\",\n          \"exception_handling\",\n          \"integers\",\n          \"parsing\",\n          \"text_formatting\"\n        ]\n      },\n      {\n        \"slug\": \"nth-prime\",\n        \"name\": \"Nth Prime\",\n        \"uuid\": \"4c1392d7-8779-496f-b0bb-81605e777e3b\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5,\n        \"topics\": [\n          \"algorithms\",\n          \"conditionals\",\n          \"loops\",\n          \"exception_handling\",\n          \"integers\",\n          \"math\"\n        ]\n      },\n      {\n        \"slug\": \"alphametics\",\n        \"name\": \"Alphametics\",\n        \"uuid\": \"7219275b-935b-48ac-8bed-3436221bf3f1\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 7,\n        \"topics\": [\n          \"algorithms\",\n          \"games\"\n        ]\n      },\n      {\n        \"slug\": \"connect\",\n        \"name\": \"Connect\",\n        \"uuid\": \"69cbdc2a-50f4-4e14-b9f4-c1ddee021018\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 7,\n        \"topics\": [\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"games\",\n          \"maps\",\n          \"parsing\"\n        ]\n      },\n      {\n        \"slug\": \"bowling\",\n        \"name\": \"Bowling\",\n        \"uuid\": \"18376dda-8e8d-4cf7-a44a-db71da438e87\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 8,\n        \"topics\": [\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"exception_handling\",\n          \"games\",\n          \"parsing\",\n          \"text_formatting\"\n        ]\n      },\n      {\n        \"slug\": \"prime-factors\",\n        \"name\": \"Prime Factors\",\n        \"uuid\": \"ef38ee9b-39b7-4bb8-9a34-2e19eba92260\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\n          \"algorithms\",\n          \"conditionals\",\n          \"loops\",\n          \"integers\",\n          \"math\"\n        ]\n      },\n      {\n        \"slug\": \"diamond\",\n        \"name\": \"Diamond\",\n        \"uuid\": \"df7c1bff-2224-422b-9c34-64b28b09510e\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5,\n        \"topics\": [\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"exception_handling\",\n          \"games\",\n          \"parsing\",\n          \"text_formatting\"\n        ]\n      },\n      {\n        \"slug\": \"pascals-triangle\",\n        \"name\": \"Pascal's Triangle\",\n        \"uuid\": \"10edb37d-cf5d-443a-bb4c-8831a3986b61\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5,\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"math\"\n        ]\n      },\n      {\n        \"slug\": \"binary-search-tree\",\n        \"name\": \"Binary Search Tree\",\n        \"uuid\": \"b912fe4f-c505-4bac-8029-76412644375b\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 6,\n        \"topics\": [\n          \"algorithms\",\n          \"conditionals\",\n          \"loops\",\n          \"recursion\"\n        ]\n      },\n      {\n        \"slug\": \"sublist\",\n        \"name\": \"Sublist\",\n        \"uuid\": \"c5ed4703-59cd-4e31-b109-ba5bfc48a578\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5,\n        \"topics\": [\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"data_structures\",\n          \"lists\"\n        ]\n      },\n      {\n        \"slug\": \"custom-set\",\n        \"name\": \"Custom Set\",\n        \"uuid\": \"e2cfc3b4-5c71-4344-a692-5d55609f097b\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 6,\n        \"topics\": [\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"data_structures\",\n          \"equality\",\n          \"lists\",\n          \"recursion\",\n          \"sets\"\n        ]\n      },\n      {\n        \"slug\": \"circular-buffer\",\n        \"name\": \"Circular Buffer\",\n        \"uuid\": \"759aa79d-975a-4b54-b306-618caba8f201\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 8,\n        \"topics\": [\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"data_structures\",\n          \"exception_handling\",\n          \"lists\"\n        ]\n      },\n      {\n        \"slug\": \"word-search\",\n        \"name\": \"Word Search\",\n        \"uuid\": \"ab16bfad-960d-405b-aba4-afd142330663\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 8,\n        \"topics\": [\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"equality\",\n          \"optional_values\",\n          \"parsing\",\n          \"text_formatting\"\n        ]\n      },\n      {\n        \"slug\": \"sieve\",\n        \"name\": \"Sieve\",\n        \"uuid\": \"f3ad1525-c124-4b2f-b09f-4639eb4a6ad9\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5,\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"integers\",\n          \"math\",\n          \"recursion\"\n        ]\n      },\n      {\n        \"slug\": \"palindrome-products\",\n        \"name\": \"Palindrome Products\",\n        \"uuid\": \"ffb0ad36-2cf5-46d4-9a5f-5bbdfb9691a7\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 7,\n        \"topics\": [\n          \"algorithms\",\n          \"conditionals\",\n          \"loops\",\n          \"integers\",\n          \"math\"\n        ]\n      },\n      {\n        \"slug\": \"diffie-hellman\",\n        \"name\": \"Diffie-Hellman\",\n        \"uuid\": \"1d12bce3-bfdc-4785-9dc7-0a496d2e6d38\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 3,\n        \"topics\": [\n          \"algorithms\",\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"exception_handling\",\n          \"math\"\n        ]\n      },\n      {\n        \"slug\": \"robot-simulator\",\n        \"name\": \"Robot Simulator\",\n        \"uuid\": \"abe907d0-7ca0-4fe5-83fd-72a4d2acab66\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5,\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"exception_handling\",\n          \"games\",\n          \"parsing\",\n          \"strings\"\n        ]\n      },\n      {\n        \"slug\": \"armstrong-numbers\",\n        \"name\": \"Armstrong Numbers\",\n        \"uuid\": \"31e1b8ba-a5dd-4806-9a4c-94f7550e25d5\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 2,\n        \"topics\": [\n          \"algorithms\",\n          \"integers\",\n          \"math\"\n        ]\n      },\n      {\n        \"slug\": \"run-length-encoding\",\n        \"name\": \"Run-Length Encoding\",\n        \"uuid\": \"16c5cf98-c381-46bb-a439-78dbc847c0d0\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 2,\n        \"topics\": [\n          \"conditionals\",\n          \"exception_handling\",\n          \"parsing\",\n          \"pattern_recognition\",\n          \"regular_expressions\",\n          \"strings\",\n          \"text_formatting\"\n        ]\n      },\n      {\n        \"slug\": \"bank-account\",\n        \"name\": \"Bank Account\",\n        \"uuid\": \"3247f8b4-8b80-4c0b-bc3b-779f7a3eb291\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 3,\n        \"topics\": [\n          \"classes\",\n          \"conditionals\"\n        ]\n      },\n      {\n        \"slug\": \"eliuds-eggs\",\n        \"name\": \"Eliud's Eggs\",\n        \"uuid\": \"2cdf947c-34ed-4ecf-92dd-4c4e6c21f9f3\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 3\n      },\n      {\n        \"slug\": \"bottle-song\",\n        \"name\": \"Bottle Song\",\n        \"uuid\": \"6bcfe2b6-e555-4c90-8c80-168730dd5ad3\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 3,\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"strings\"\n        ]\n      },\n      {\n        \"slug\": \"rotational-cipher\",\n        \"name\": \"Rotational Cipher\",\n        \"uuid\": \"dbe39983-5635-4369-89a3-fd549144259b\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\n          \"strings\",\n          \"iterators\"\n        ]\n      },\n      {\n        \"slug\": \"strain\",\n        \"name\": \"Strain\",\n        \"uuid\": \"160c31bd-814c-4de7-8af5-7cd223763da8\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\n          \"algorithms\",\n          \"arrays\",\n          \"callbacks\",\n          \"conditionals\",\n          \"loops\",\n          \"filtering\",\n          \"lists\"\n        ]\n      },\n      {\n        \"slug\": \"accumulate\",\n        \"name\": \"Accumulate\",\n        \"uuid\": \"32953258-d488-4761-9669-895a359a8b9a\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5,\n        \"status\": \"deprecated\",\n        \"topics\": [\n          \"algorithms\",\n          \"callbacks\",\n          \"conditionals\",\n          \"lists\"\n        ]\n      },\n      {\n        \"slug\": \"all-your-base\",\n        \"name\": \"All Your Base\",\n        \"uuid\": \"0f4f98fe-245a-4842-b3cf-6581b89afd44\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5,\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"exception_handling\",\n          \"integers\",\n          \"math\",\n          \"parsing\"\n        ]\n      },\n      {\n        \"slug\": \"flatten-array\",\n        \"name\": \"Flatten Array\",\n        \"uuid\": \"ebe8227e-f445-4387-bf9f-54d4d9730142\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5,\n        \"topics\": [\n          \"arrays\",\n          \"lists\",\n          \"loops\",\n          \"recursion\"\n        ]\n      },\n      {\n        \"slug\": \"matching-brackets\",\n        \"name\": \"Matching Brackets\",\n        \"uuid\": \"b455f96b-329d-4dec-ac31-599b02c0b2e5\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 5,\n        \"topics\": [\n          \"parsing\",\n          \"stacks\",\n          \"strings\"\n        ]\n      },\n      {\n        \"slug\": \"tournament\",\n        \"name\": \"Tournament\",\n        \"uuid\": \"f4634d37-2357-4b54-8cd8-ad450234537a\",\n        \"practices\": [\n          \"string-formatting\"\n        ],\n        \"prerequisites\": [\n          \"strings\",\n          \"string-formatting\"\n        ],\n        \"difficulty\": 6\n      },\n      {\n        \"slug\": \"flower-field\",\n        \"name\": \"Flower Field\",\n        \"uuid\": \"f1c96aaa-0944-4a11-83df-9f3a4f5417f0\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 7,\n        \"topics\": [\n          \"algorithms\",\n          \"arrays\",\n          \"games\"\n        ]\n      },\n      {\n        \"slug\": \"minesweeper\",\n        \"name\": \"Minesweeper\",\n        \"uuid\": \"f5b00e76-3015-444d-8012-9862990db08c\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 7,\n        \"status\": \"deprecated\",\n        \"topics\": [\n          \"algorithms\",\n          \"arrays\",\n          \"games\"\n        ]\n      },\n      {\n        \"slug\": \"kindergarten-garden\",\n        \"name\": \"Kindergarten Garden\",\n        \"uuid\": \"d70d3579-999c-452c-9243-98908e24b47e\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 7,\n        \"topics\": [\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"strings\",\n          \"text_formatting\"\n        ]\n      },\n      {\n        \"slug\": \"queen-attack\",\n        \"name\": \"Queen Attack\",\n        \"uuid\": \"837fbe57-a567-4fc7-a7a2-8b63059ac8b7\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 8,\n        \"topics\": [\n          \"conditionals\",\n          \"loops\",\n          \"equality\",\n          \"exception_handling\",\n          \"optional_values\",\n          \"parsing\",\n          \"text_formatting\"\n        ]\n      },\n      {\n        \"slug\": \"react\",\n        \"name\": \"React\",\n        \"uuid\": \"6ad78102-09cc-4aeb-bfa7-58ba3dba57f3\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 8,\n        \"topics\": [\n          \"algorithms\",\n          \"closures\",\n          \"reactive_programming\"\n        ]\n      },\n      {\n        \"slug\": \"crypto-square\",\n        \"name\": \"Crypto Square\",\n        \"uuid\": \"e92b7444-a5c3-4452-82fd-8c70cf14085a\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 9,\n        \"topics\": [\n          \"algorithms\",\n          \"arrays\",\n          \"conditionals\",\n          \"loops\",\n          \"regular_expressions\",\n          \"sorting\",\n          \"text_formatting\",\n          \"transforming\"\n        ]\n      },\n      {\n        \"slug\": \"knapsack\",\n        \"name\": \"Knapsack\",\n        \"uuid\": \"b80ebb8d-9416-4fc8-91ee-3db99411810c\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 9,\n        \"topics\": [\n          \"algorithms\"\n        ]\n      },\n      {\n        \"slug\": \"game-of-life\",\n        \"name\": \"Conway's Game of Life\",\n        \"uuid\": \"c338cbce-fad4-4de0-bf0d-4a90803a0fe9\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 2\n      },\n      {\n        \"slug\": \"yacht\",\n        \"name\": \"Yacht\",\n        \"uuid\": \"06ac7eed-1417-4510-b526-eb068af21ad9\",\n        \"practices\": [],\n        \"prerequisites\": [],\n        \"difficulty\": 4,\n        \"topics\": [\"arrays\", \"conditionals\", \"filtering\", \"games\"]\n      }\n    ]\n  },\n  \"concepts\": [\n    {\n      \"uuid\": \"6b93ea93-3312-4aee-ad6f-3f8b034e92d9\",\n      \"slug\": \"basics\",\n      \"name\": \"Basics\"\n    }\n  ],\n  \"key_features\": [\n    {\n      \"title\": \"Evolving\",\n      \"content\": \"Typescript is a modern and constantly evolving open-source language supported by Microsoft.\",\n      \"icon\": \"evolving\"\n    },\n    {\n      \"title\": \"Widely used\",\n      \"content\": \"TypeScript is used by many libraries and frameworks, and integrates with JavaScript code as well.\",\n      \"icon\": \"widely-used\"\n    },\n    {\n      \"title\": \"Typed JavaScript\",\n      \"content\": \"Typescript flexible typing system lets you describe what to expect, supporting gradual adoption.\",\n      \"icon\": \"dynamically-typed\"\n    },\n    {\n      \"title\": \"Use any programming style\",\n      \"content\": \"Use prototype-based, object-oriented, functional, or declarative programming styles, and more.\",\n      \"icon\": \"multi-paradigm\"\n    },\n    {\n      \"title\": \"Consistently Good Tooling\",\n      \"content\": \"TS's JavaScript integration is handled by the language itself, enabling its tools and features.\",\n      \"icon\": \"tooling\"\n    },\n    {\n      \"title\": \"Large Community\",\n      \"content\": \"The large number of users makes it easy to find answers, documentation, and libraries.\",\n      \"icon\": \"community\"\n    }\n  ],\n  \"tags\": [\n    \"execution_mode/compiled\",\n    \"paradigm/declarative\",\n    \"paradigm/functional\",\n    \"paradigm/imperative\",\n    \"paradigm/object_oriented\",\n    \"platform/android\",\n    \"platform/ios\",\n    \"platform/linux\",\n    \"platform/mac\",\n    \"platform/web\",\n    \"platform/windows\",\n    \"runtime/language_specific\",\n    \"runtime/wasmtime\",\n    \"typing/dynamic\",\n    \"typing/static\",\n    \"typing/strong\",\n    \"typing/weak\",\n    \"used_for/artificial_intelligence\",\n    \"used_for/backends\",\n    \"used_for/cross_platform_development\",\n    \"used_for/frontends\",\n    \"used_for/games\",\n    \"used_for/guis\",\n    \"used_for/mobile\",\n    \"used_for/web_development\"\n  ]\n}\n"
  },
  {
    "path": "docs/ABOUT.md",
    "content": "# About\n\n[TypeScript](https://www.typescriptlang.org/) (TS) is a superset of JavaScript (JS), created at Microsoft\nin response to frustration developing large-scale applications in JS. In a large JS project, knowing\nwhat properties your own objects have, what arguments your functions take (and what type they need to be)\ncan become difficult. Similarly, since there is no ability to intelligently inspect JS code, when you include\na package (like from `npm`), you have to keep the documentation up so you know what methods are available and\nwhat arguments they take. TS solves these issues. It is currently an open-source project hosted on Github.\nIt supports tools for any browser as well as Node, for any host, on any OS. TS compiles to readable,\nstandards-based JavaScript.\n\nTS adds a flexible type system to JS, in addition to interfaces (custom types) and modifying the syntax of\nsome ECMAScript features such as classes. Types are optional and flexible (for example, you can specify an\nargument is a string OR a number). Types allow tooling available in most code editors that improve the\ndevelopment experience such as code completion and method detection, both in your own code and in packages\nyou use. It supports many upcoming ECMAScript features (such as async/await). TS can be written in Object Oriented or Functional\nstyles. It is compatible with all existing JS packages. TS transpiles to clean, readable JS.\n\nTry it out at the [playground](https://www.typescriptlang.org/play), and stay up to date via [the Typescript blog](https://devblogs.microsoft.com/typescript/) and [Twitter account](https://twitter.com/typescript).\n"
  },
  {
    "path": "docs/INSTALLATION.md",
    "content": "# Installation\n\nYou need [NodeJS LTS](https://nodejs.org/en).\n\n> 💡 This track likely works with older stable versions, as well as the \"current\" version.\n> However, [by design](https://github.com/nodejs/release#release-schedule), odd versions are never stable.\n> Always make sure you install an even version of NodeJS.\n\nInstall [Yarn 4+](https://yarnpkg.com/getting-started/install) using Node.JS `corepack`:\n\n```shell\ncorepack enable yarn\n```\n\n## Checking your installation\n\nYou generally need to open a new terminal in order to use binaries you've just installed.\n\n```shell\n$ node -v\nv20.15.0\n\n$ corepack -v\n0.28.1\n\n$ corepack yarn -v\nv4.3.1\n```\n\n_Note: your versions will likely differ from this._\n\n## Assignment installation\n\n**Each assignment** needs some tools to run the tests:\n\nThey can be installed running this command within each assignment directory:\n\n```bash\n$ corepack yarn install\n```\n\nDepending on your editor, the [Editor SDK](https://yarnpkg.com/getting-started/editor-sdks) needs to be installed in each assignment, in order to work with Plug'n'Play installs.\nAt moment of writing the following are supported:\n\n- [CoC nvim](https://yarnpkg.com/getting-started/editor-sdks#coc-nvim)\n- [Emacs](https://yarnpkg.com/getting-started/editor-sdks#emacs)\n- [Neovim Native LSP](https://yarnpkg.com/getting-started/editor-sdks#neovim-native-lsp)\n- [VSCode](https://yarnpkg.com/getting-started/editor-sdks#vscode)\n\nFor example, if using VSCode, the commands you run are:\n\n```shell\n$ corepack yarn install\n\n➤ YN0000: · Yarn 4.3.1\n➤ YN0000: ┌ Resolution step\n➤ YN0000: └ Completed\n➤ YN0000: ┌ Post-resolution validation\n➤ YN0060: │ # [...]\n➤ YN0000: └ Completed\n➤ YN0000: ┌ Fetch step\n➤ YN0000: └ Completed in 0s 566ms\n➤ YN0000: ┌ Link step\n➤ YN0000: │ ESM support for PnP uses the experimental loader API and is therefore experimental\n➤ YN0000: └ Completed\n➤ YN0000: · Done with warnings in 0s 768ms\n\n$ corepack yarn dlx @yarnpkg/sdks vscode\n\n➤ YN0000: · Yarn 4.3.1\n➤ YN0000: ┌ Resolution step\n➤ YN0085: │ + @yarnpkg/sdks@npm:3.1.3, and 103 more.\n➤ YN0000: └ Completed in 0s 509ms\n➤ YN0000: ┌ Fetch step\n➤ YN0013: │ 104 packages were added to the project (+ 2.87 MiB).\n➤ YN0000: └ Completed\n➤ YN0000: ┌ Link step\n➤ YN0000: └ Completed in 0s 270ms\n➤ YN0000: · Done in 0s 881ms\n\n➤ YN0000: Cleaning up the existing SDK files...\n➤ YN0000: ┌ Generating SDKs inside .yarn/sdks\n➤ YN0000: │ ✓ Eslint\n➤ YN0000: │ ✓ Prettier\n➤ YN0000: │ ✓ Typescript\n➤ YN0000: │ • 5 SDKs were skipped based on your root dependencies\n➤ YN0000: └ Completed\n➤ YN0000: ┌ Generating settings\n➤ YN0000: │ ✓ Vscode (updated 🔼)\n➤ YN0000: └ Completed\n```\n\nYou must run install _inside the exercise directory_ before you are able to run the tests.\n[Yarn 4 PnP](https://yarnpkg.com/features/pnp/) is enabled, installing the dependencies in each exercise directory does NOT install a complete copy of all the dependencies.\n\nIf your editor is showing errors for `eslint`, `prettier`, or `typescript` afterwards, reload the window or reopen the editor.\n"
  },
  {
    "path": "docs/LEARNING.md",
    "content": "# Learning\n\nIf you want to learn Typescript, check out the following resources.\n\n- [TS Tutorial](https://www.typescriptlang.org/docs/handbook/release-notes/overview.html)\n- [TS Playground](https://www.typescriptlang.org/play)\n\nTypeScript is a superset of JS.\nTypeScript offers all of JavaScript’s features, and an additional layer on top of these: TypeScript’s type system.\n\n- [Exploring ES6](https://leanpub.com/exploring-es6) book, by Axel Rauschmayer\n- [ES6 Katas](https://jskatas.org/#bundle-es6-katas) website\n- [Babel compiler](https://github.com/babel/babel)\n"
  },
  {
    "path": "docs/RESOURCES.md",
    "content": "# Resources\n\n## Recommended References\n\n- [TypeScript QuickStart](https://www.typescriptlang.org/docs/handbook/release-notes/overview.html)\n- [TypeScript Playground](https://www.typescriptlang.org/play)\n\n- [ECMAScript 2015 Language Specification](https://www.ecma-international.org/wp-content/uploads/ECMA-262_6th_edition_june_2015.pdf) (pdf)\n- [Mozilla JavaScript Reference](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference)\n\n## Editors\n\n### Free/Open-Source\n\n- [VS Code](https://code.visualstudio.com)\n\n  VS Code is an open-source code editor. You can find information on how to set up TypeScript [here](https://code.visualstudio.com/docs/languages/typescript). VS Code is a popular editor for TypeScript because Microsoft maintains both VS Code and TypeScript, so it works well with the language; VS Code supports TS without any extra configuration. In fact, VS Code was written using TypeScript!\n\n  A common issue with VS Code and TS is when your editor and project versions are different, which can cause VS Code to display a possibly confusing error message. Instructions on how to handle this error are [here](https://code.visualstudio.com/docs/typescript/typescript-compiling#_using-newer-typescript-versions)\n\n### Licensed\n\n- [Sublime Text](https://www.sublimetext.com)\n\n  Sublime Text is a popular code editor with support for most languages through installable plugins. It is free to try, but you will be regularly prompted to buy a license, which currently costs \\$70 USD.\n\n- [WebStorm](https://www.jetbrains.com/webstorm/)\n\n  WebStorm is a fully-featured JavaScript/TypeScript IDE (Integrated Development Environment). It supports TypeScript with no extra configuration and has integrated testing, debugging and code analysis. It is free to try for 30 days, then an annual license costs \\$129 USD for the first year.\n"
  },
  {
    "path": "docs/SNIPPET.txt",
    "content": "\nexport class HelloWorld {\n  static hello(name = 'World'): string {\n    return `Hello, ${name}!`\n  }\n}\n"
  },
  {
    "path": "docs/TESTS.md",
    "content": "# Tests\n\nBefore trying to execute the tests, ensure the assignment folder is set-up correctly by following the installation steps, namely `corepack yarn install` and the Editor SDK setup.\n\nExecute the tests with:\n\n```bash\n$ corepack yarn test\n```\n\nBe sure your code follows best practices, as other users do, with eslint, a tool to perform static analysis to your code.\nTools like this save you some time detecting typos or silly mistakes in your code:\n\n```bash\n$ corepack yarn lint\n```\n\nOr do both at the same time:\n\n```bash\n$ corepack yarn test && corepack yarn lint\n```\n\nThe TypeScript track on Exercism does not enforce code _style_, so you're free to choose between semicolons, tabs vs spaces, and everything in-between.\n\n## Making Your First Module\n\nUsually, tests on this track will load your implementation importing it as a module: `import Bob from './bob';`.\nTo make it work, you need to export your implementation from the file the tests are looking for your module, `bob.ts`:\n\n```typescript\nexport class Bob {\n  public hey(message: string) {\n    // Your solution here\n  }\n}\n```\n\nWe've provided stubs in each exercise and placed this `export` in there for you.\n"
  },
  {
    "path": "docs/config.json",
    "content": "{\n  \"docs\": [\n    {\n      \"uuid\": \"c79ecacf-6b92-4033-9f25-1f86e7299760\",\n      \"slug\": \"installation\",\n      \"path\": \"docs/INSTALLATION.md\",\n      \"title\": \"Installing TypeScript locally\",\n      \"blurb\": \"Learn how to install TypeScript locally to solve Exercism's exercises on your own machine\"\n    },\n    {\n      \"uuid\": \"d5553e1b-8432-4b27-a855-d060e830636d\",\n      \"slug\": \"learning\",\n      \"path\": \"docs/LEARNING.md\",\n      \"title\": \"How to learn TypeScript\",\n      \"blurb\": \"An overview of how to get started from scratch with TypeScript\"\n    },\n    {\n      \"uuid\": \"bef8b724-0569-4ad9-8e00-5daff3c17057\",\n      \"slug\": \"tests\",\n      \"path\": \"docs/TESTS.md\",\n      \"title\": \"Testing on the TypeScript track\",\n      \"blurb\": \"Learn how to test your TypeScript exercises on Exercism\"\n    },\n    {\n      \"uuid\": \"4d00c4da-0f99-4d0c-9a43-aca47128e4fb\",\n      \"slug\": \"resources\",\n      \"path\": \"docs/RESOURCES.md\",\n      \"title\": \"Useful TypeScript resources\",\n      \"blurb\": \"A collection of useful resources to help you master TypeScript\"\n    }\n  ]\n}\n"
  },
  {
    "path": "eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nimport globals from 'globals'\n\nexport default [\n  ...tsEslint.config(\n    ...config,\n    {\n      files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n      extends: maintainersConfig,\n    },\n    {\n      files: ['scripts/**/*.mjs'],\n      languageOptions: {\n        globals: {\n          ...globals.node,\n        },\n      },\n    }\n  ),\n  {\n    ignores: [\n      // # Protected or generated\n      '/.appends/**/*',\n      '/.github/**/*',\n      '/.vscode/**/*',\n      '/.yarn/**/*',\n      '/common/.vscode/**/*',\n      '/common/.yarn/**/*',\n\n      // # Binaries\n      '/bin/*',\n\n      // # Configuration\n      '/config',\n      '/babel.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/concept/.keep",
    "content": ""
  },
  {
    "path": "exercises/concept/lasagna/.docs/hints.md",
    "content": "# Hints\n\n## 1. Define the expected oven time in minutes\n\n- Define a [constant][constants] which should contain the [`number`][numbers] value specified in the recipe.\n- [`export`][export] the constant.\n\n## 2. Calculate the remaining oven time in minutes\n\n- [Explicitly return a number][return] from the function.\n- Use the [mathematical operator for subtraction][operators] to subtract values.\n\n## 3. Calculate the preparation time in minutes\n\n- [Explicitly return a number][return] from the function.\n- Use the [mathematical operator for multiplication][operators] to multiply values.\n- Use the extra constant for the time in minutes per layer.\n\n## 4. Calculate the total working time in minutes\n\n- [Explicitly return a number][return] from the function.\n- [Invoke][invocation] one of the other methods implemented previously.\n- Use the [mathematical operator for addition][operators] to add values.\n\n[return]: https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Return_values\n[export]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export\n[operators]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators\n[constants]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const\n[invocation]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions#Calling_functions\n[numbers]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type\n"
  },
  {
    "path": "exercises/concept/lasagna/.docs/instructions.md",
    "content": "# Instructions\n\nLucian's girlfriend is on her way home, and he hasn't cooked their anniversary dinner!\n\nIn this exercise, you're going to write some code to help Lucian cook an exquisite lasagna from his favorite cookbook.\n\nYou have four tasks related to the time spent cooking the lasagna.\n\n## 1. Define the expected oven time in minutes\n\nDefine the `EXPECTED_MINUTES_IN_OVEN` constant that represents how many minutes the lasagna should be in the oven. It must be exported. According to the cooking book, the expected oven time in minutes is `40`.\n\n## 2. Calculate the remaining oven time in minutes\n\nImplement the `remainingMinutesInOven` function that takes the actual minutes the lasagna has been in the oven as a _parameter_ and _returns_ how many minutes the lasagna still has to remain in the oven, based on the **expected oven time in minutes** from the previous task.\n\n```javascript\nremainingMinutesInOven(30)\n// => 10\n```\n\n## 3. Calculate the preparation time in minutes\n\nImplement the `preparationTimeInMinutes` function that takes the number of layers you added to the lasagna as a _parameter_ and _returns_ how many minutes you spent preparing the lasagna, assuming each layer takes you 2 minutes to prepare.\n\n```javascript\npreparationTimeInMinutes(2)\n// => 4\n```\n\n## 4. Calculate the total working time in minutes\n\nImplement the `totalTimeInMinutes` function that takes _two parameters_: the `numberOfLayers` parameter is the number of layers you added to the lasagna, and the `actualMinutesInOven` parameter is the number of minutes the lasagna has been in the oven. The function should _return_ how many minutes in total you've worked on cooking the lasagna, which is the sum of the preparation time in minutes, and the time in minutes the lasagna has spent in the oven at the moment.\n\n```javascript\ntotalTimeInMinutes(3, 20)\n// => 26\n```\n"
  },
  {
    "path": "exercises/concept/lasagna/.docs/introduction.md",
    "content": "# Introduction\n\nJavaScript is a dynamic language, supporting object-oriented, imperative, and declarative (e.g. functional programming) styles.\n\n## (Re-)Assignment\n\nThere are a few primary ways to assign values to names in JavaScript - using variables or constants. On Exercism, variables are always written in [camelCase][wiki-camel-case]; constants are written in [SCREAMING_SNAKE_CASE][wiki-snake-case]. There is no official guide to follow, and various companies and organizations have various style guides. _Feel free to write variables any way you like_. The upside from writing them the way the exercises are prepared is that they'll be highlighted differently in the web interface and most IDEs.\n\nVariables in JavaScript can be defined using the [`const`][mdn-const], [`let`][mdn-let] or [`var`][mdn-var] keyword.\n\nA variable can reference different values over its lifetime when using `let` or `var`. For example, `myFirstVariable` can be defined and redefined many times using the assignment operator `=`:\n\n```javascript\nlet myFirstVariable = 1\nmyFirstVariable = 'Some string'\nmyFirstVariable = new SomeComplexClass()\n```\n\nIn contrast to `let` and `var`, variables that are defined with `const` can only be assigned once. This is used to define constants in JavaScript.\n\n```javascript\nconst MY_FIRST_CONSTANT = 10\n\n// Can not be re-assigned.\nMY_FIRST_CONSTANT = 20\n// => TypeError: Assignment to constant variable.\n```\n\n> 💡 In a later Concept Exercise the difference between _constant_ assignment / binding and _constant_ value is explored and explained.\n\n## Function Declarations\n\nIn JavaScript, units of functionality are encapsulated in _functions_, usually grouping functions together in the same file if they belong together. These functions can take parameters (arguments), and can _return_ a value using the `return` keyword. Functions are invoked using `()` syntax.\n\n```javascript\nfunction add(num1, num2) {\n  return num1 + num2\n}\n\nadd(1, 3)\n// => 4\n```\n\n> 💡 In JavaScript there are _many_ different ways to declare a function. These other ways look different than using the `function` keyword. The track tries to gradually introduce them, but if you already know about them, feel free to use any of them. In most cases, using one or the other isn't better or worse.\n\n## Exposing to Other Files\n\nTo make a `function`, a constant, or a variable available in _other files_, they need to be [exported][mdn-export] using the `export` keyword. Another file may then [import][mdn-import] these using the `import` keyword. This is also known as the module system. A great example is how all the tests work. Each exercise has at least one file, for example `lasagna.js`, which contains the _implementation_. Additionally there is at least one other file, for example `lasagna.spec.js`, that contains the _tests_. This file _imports_ the public (i.e. exported) entities in order to test the implementation:\n\n```javascript\n// file.js\nexport const MY_VALUE = 10\n\nexport function add(num1, num2) {\n  return num1 + num2\n}\n\n// file.spec.js\nimport { MY_VALUE, add } from './file'\n\nadd(MY_VALUE, 5)\n// => 15\n```\n\n[mdn-const]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const\n[mdn-export]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export\n[mdn-import]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import\n[mdn-let]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let\n[mdn-var]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var\n[wiki-camel-case]: https://en.wikipedia.org/wiki/Camel_case\n[wiki-snake-case]: https://en.wikipedia.org/wiki/Snake_case\n"
  },
  {
    "path": "exercises/concept/lasagna/.meta/config.json",
    "content": "{\n  \"authors\": [\"SleeplessByte\"],\n  \"files\": {\n    \"solution\": [\n      \"lasagna.ts\"\n    ],\n    \"test\": [\n      \"__typetests__/lasagna.tst.ts\",\n      \"lasagna.test.ts\"\n    ],\n    \"exemplar\": [\n      \".meta/exemplar.ts\"\n    ]\n  },\n  \"forked_from\": [\n    \"javascript/lasagna\"\n  ],\n  \"blurb\": \"Learn the basics of TypeScript cooking a brilliant lasagna from your favorite cooking book.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": true,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": true\n  }\n}\n"
  },
  {
    "path": "exercises/concept/lasagna/.meta/design.md",
    "content": "# Design\n\n## Learning objectives\n\n- Know what a variable is.\n- Know what a constant variable is.\n- Know how to define a variable.\n- Know how to export a variable\n- Know how to return a value from a function (explicit return).\n- Know how to annotate a function parameter\n- Know how to annotate a function return type\n\n## Out of scope\n\nThis exercise is really just to introduce the bare minimum a student needs to know to solve a very basic exercise on Exercism.\nDetails about the primitive data types, different ways to define functions etc. will all be properly introduced in the later concept exercises.\n\nWe don't even explicitly teach the basics of numbers and arithmetic operators in the introduction.\nGiven the general code examples that are provided and some \"I will just try that\", the student should be fine solving the exercise nevertheless.\n\n## Concepts\n\n- `basics`\n\n## Prerequisites\n\nThere are no prerequisites.\n\n## Analyzer\n\nThis exercise could benefit from the following rules added to the the [analyzer][analyzer]:\n\n- Verify that the `remainingMinutesInOven` function uses the `EXPECTED_MINUTES_IN_OVEN` constant.\n- Verify that the `preparationTimeInMinutes` function uses the `PREPARATION_MINUTES_PER_LAYER` constant.\n- Verify that the `totalTimeInMinutes` function calls the `preparationTimeInMinutes` function.\n- Verify that no extra _bookkeeping_ or _intermediate_ variables are declared\n\n[analyzer]: https://github.com/exercism/typescript-analyzer\n"
  },
  {
    "path": "exercises/concept/lasagna/.meta/exemplar.ts",
    "content": "/**\n * The amount of minutes the lasagna should be in the oven.\n */\nexport const EXPECTED_MINUTES_IN_OVEN = 40\n\n/**\n * The amount of minutes it takes to prepare a single layer.\n */\nconst PREPARATION_MINUTES_PER_LAYER = 2\n\n/**\n * Determines the amount of minutes the lasagna still needs to remain in the\n * oven to be properly prepared.\n *\n * @param actualMinutesInOven\n * @returns the number of minutes remaining\n */\nexport function remainingMinutesInOven(actualMinutesInOven: number): number {\n  return EXPECTED_MINUTES_IN_OVEN - actualMinutesInOven\n}\n\n/**\n * Given a number of layers, determines the total preparation time.\n *\n * @param numberOfLayers\n * @returns the total preparation time\n */\nexport function preparationTimeInMinutes(numberOfLayers: number): number {\n  return numberOfLayers * PREPARATION_MINUTES_PER_LAYER\n}\n\n/**\n * Calculates the total working time. That is, the time to prepare all the layers\n * of lasagna, and the time already spent in the oven.\n *\n * @param numberOfLayers\n * @param actualMinutesInOven\n * @returns the total working time\n */\nexport function totalTimeInMinutes(\n  numberOfLayers: number,\n  actualMinutesInOven: number\n): number {\n  return preparationTimeInMinutes(numberOfLayers) + actualMinutesInOven\n}\n"
  },
  {
    "path": "exercises/concept/lasagna/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/concept/lasagna/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/concept/lasagna/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/concept/lasagna/__typetests__/lasagna.tst.ts",
    "content": "import { describe, expect, test } from 'tstyche'\nimport {\n  EXPECTED_MINUTES_IN_OVEN,\n  remainingMinutesInOven,\n  preparationTimeInMinutes,\n  totalTimeInMinutes,\n} from '../lasagna.ts'\n\ndescribe('EXPECTED_MINUTES_IN_OVEN', () => {\n  test('constant is defined as a number or a constant number', () => {\n    expect(EXPECTED_MINUTES_IN_OVEN).type.toBeAssignableTo<number>()\n  })\n})\n\ndescribe('remainingMinutesInOven', () => {\n  test('takes one number parameter', () => {\n    expect<Parameters<typeof remainingMinutesInOven>>().type.toBe<[number]>()\n  })\n\n  test('returns a number', () => {\n    expect<ReturnType<typeof remainingMinutesInOven>>().type.toBe<number>()\n  })\n})\n\ndescribe('preparationTimeInMinutes', () => {\n  test('takes one number parameter', () => {\n    expect<Parameters<typeof preparationTimeInMinutes>>().type.toBe<[number]>()\n  })\n\n  test('returns a number', () => {\n    expect<ReturnType<typeof preparationTimeInMinutes>>().type.toBe<number>()\n  })\n})\n\ndescribe('totalTimeInMinutes', () => {\n  test('takes two number parameters', () => {\n    expect<Parameters<typeof totalTimeInMinutes>>().type.toBe<\n      [number, number]\n    >()\n  })\n\n  test('returns a number', () => {\n    expect<ReturnType<typeof totalTimeInMinutes>>().type.toBe<number>()\n  })\n})\n"
  },
  {
    "path": "exercises/concept/lasagna/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/concept/lasagna/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/concept/lasagna/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/concept/lasagna/lasagna.test.ts",
    "content": "import { describe, test, expect } from '@jest/globals'\n\nimport {\n  EXPECTED_MINUTES_IN_OVEN,\n  remainingMinutesInOven,\n  preparationTimeInMinutes,\n  totalTimeInMinutes,\n} from './lasagna.ts'\n\ndescribe('EXPECTED_MINUTES_IN_OVEN', () => {\n  test('constant is defined correctly', () => {\n    expect(EXPECTED_MINUTES_IN_OVEN).toBe(40)\n  })\n})\n\ndescribe('remainingMinutesInOven', () => {\n  test('calculates the remaining time', () => {\n    expect(remainingMinutesInOven(25)).toBe(15)\n    expect(remainingMinutesInOven(5)).toBe(35)\n    expect(remainingMinutesInOven(39)).toBe(1)\n  })\n\n  test('works correctly for the edge cases', () => {\n    expect(remainingMinutesInOven(40)).toBe(0)\n    expect(remainingMinutesInOven(0)).toBe(40)\n  })\n})\n\ndescribe('preparationTimeInMinutes', () => {\n  test('calculates the preparation time', () => {\n    expect(preparationTimeInMinutes(1)).toBe(2)\n    expect(preparationTimeInMinutes(2)).toBe(4)\n    expect(preparationTimeInMinutes(8)).toBe(16)\n  })\n})\n\ndescribe('totalTimeInMinutes', () => {\n  test('calculates the total cooking time', () => {\n    expect(totalTimeInMinutes(1, 5)).toBe(7)\n    expect(totalTimeInMinutes(4, 15)).toBe(23)\n    expect(totalTimeInMinutes(1, 30)).toBe(32)\n  })\n})\n"
  },
  {
    "path": "exercises/concept/lasagna/lasagna.ts",
    "content": "// 👋🏽 Hi there!\n//\n// On the TypeScript track we provide you with stubs. These stubs provide a\n// starting point to solving the exercise.\n//\n// In general, each variable/constant and each declared function will have a\n// JSDoc comment block above it, explaining what the variable/constant holds or\n// the function is supposed to accomplish.\n//\n// 💡 Often, the JSDoc comment blocks have annotations, such as @param and\n// @returns which are usually highlighted with a different color if the IDE\n// you're in recognizes them. It's these annotations that are used when\n// referring to the constant, variable, or function from somewhere else that\n// IDEs display.\n//\n// You don't need to write these yourself; it is not expected in idiomatic\n// TypeScript, but some companies and style-guides do enforce them.\n//\n// 💡 You're allowed to completely clear a stub before you get started. Often\n// we recommend using the stub, because they are already set-up correctly to\n// work with the tests, which you can find in ./lasagna.spec.js\n//\n// Good luck preparing some lasagna!\n\n/**\n * The number of minutes it takes to prepare a single layer.\n */\nconst PREPARATION_MINUTES_PER_LAYER = 2\n\n/**\n * Determines the number of minutes the lasagna still needs to remain in the\n * oven to be properly prepared.\n *\n * @param actualMinutesInOven\n * @returns the number of minutes remaining\n */\nexport function remainingMinutesInOven(actualMinutesInOven: number): number {\n  throw new Error('Remove this line and implement the function')\n}\n\n/**\n * Given a number of layers, determines the total preparation time.\n *\n * @param numberOfLayers\n * @returns the total preparation time\n */\nexport function preparationTimeInMinutes(numberOfLayers: number): number {\n  throw new Error('Remove this line and implement the function')\n}\n\n/**\n * Calculates the total working time. That is, the time to prepare all the\n * layers of lasagna, and the time already spent in the oven.\n *\n * @param numberOfLayers\n * @param actualMinutesInOven\n * @returns the total working time\n */\nexport function totalTimeInMinutes(\n  numberOfLayers: number,\n  actualMinutesInOven: number\n): number {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/concept/lasagna/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-lasagna\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism concept exercise on lasagna\",\n  \"author\": \"Derk-Jan Karrenbeld <derk-jan+git@karrenbeld.info> (https://derk-jan.com)\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/concept/lasagna/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/concept/lasagna/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/accumulate/.docs/instructions.md",
    "content": "# Instructions\n\nImplement the `accumulate` operation, which, given a collection and an\noperation to perform on each element of the collection, returns a new\ncollection containing the result of applying that operation to each element of\nthe input collection.\n\nGiven the collection of numbers:\n\n- 1, 2, 3, 4, 5\n\nAnd the operation:\n\n- square a number (`x => x * x`)\n\nYour code should be able to produce the collection of squares:\n\n- 1, 4, 9, 16, 25\n\nCheck out the test suite to see the expected function signature.\n\n## Restrictions\n\nKeep your hands off that collect/map/fmap/whatchamacallit functionality\nprovided by your standard library!\nSolve this one yourself using other basic tools instead.\n"
  },
  {
    "path": "exercises/practice/accumulate/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"emiller42\",\n    \"lumosmind\",\n    \"masters3d\",\n    \"pkchv\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"accumulate.ts\"\n    ],\n    \"test\": [\n      \"accumulate.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Implement the `accumulate` operation, which, given a collection and an operation to perform on each element of the collection, returns a new collection containing the result of applying that operation to each element of the input collection.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Conversation with James Edward Gray II\",\n  \"source_url\": \"https://twitter.com/jeg2\"\n}\n"
  },
  {
    "path": "exercises/practice/accumulate/.meta/proof.ci.ts",
    "content": "export function accumulate<T, O>(list: T[], accumulator: (arg: T) => O): O[] {\n  const out = []\n  let idx = -1\n  const end = list.length\n\n  while (++idx < end) {\n    out.push(accumulator(list[idx]))\n  }\n\n  return out\n}\n"
  },
  {
    "path": "exercises/practice/accumulate/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/accumulate/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/accumulate/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/accumulate/accumulate.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { accumulate } from './accumulate.ts'\n\ndescribe('accumulate()', () => {\n  it('accumulation empty', () => {\n    const accumulator = (e: number): number => e * e\n    expect(accumulate([], accumulator)).toEqual([])\n  })\n\n  xit('accumulate squares', () => {\n    const accumulator = (n: number): number => n * n\n    const result = accumulate([1, 2, 3], accumulator)\n    expect(result).toEqual([1, 4, 9])\n  })\n\n  xit('accumulate upcases', () => {\n    const accumulator = (word: string): string => word.toUpperCase()\n    const result = accumulate('hello world'.split(/\\s/), accumulator)\n    expect(result).toEqual(['HELLO', 'WORLD'])\n  })\n\n  xit('accumulate reversed strings', () => {\n    const accumulator = (word: string): string =>\n      word.split('').reverse().join('')\n    const result = accumulate(\n      'the quick brown fox etc'.split(/\\s/),\n      accumulator\n    )\n    expect(result).toEqual(['eht', 'kciuq', 'nworb', 'xof', 'cte'])\n  })\n\n  xit('accumulate recursively', () => {\n    const result = accumulate('a b c'.split(/\\s/), (char: string) =>\n      accumulate('1 2 3'.split(/\\s/), (digit: string) => char + digit)\n    )\n\n    expect(result).toEqual([\n      ['a1', 'a2', 'a3'],\n      ['b1', 'b2', 'b3'],\n      ['c1', 'c2', 'c3'],\n    ])\n  })\n})\n"
  },
  {
    "path": "exercises/practice/accumulate/accumulate.ts",
    "content": "export function accumulate(list: unknown, accumulator: unknown): never {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/accumulate/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/accumulate/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/accumulate/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/accumulate/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-accumulate\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/accumulate/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/accumulate/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/acronym/.docs/instructions.md",
    "content": "# Instructions\n\nConvert a phrase to its acronym.\n\nTechies love their TLA (Three Letter Acronyms)!\n\nHelp generate some jargon by writing a program that converts a long name like Portable Network Graphics to its acronym (PNG).\n\nPunctuation is handled as follows: hyphens are word separators (like whitespace); all other punctuation can be removed from the input.\n\nFor example:\n\n| Input                     | Output |\n| ------------------------- | ------ |\n| As Soon As Possible       | ASAP   |\n| Liquid-crystal display    | LCD    |\n| Thank George It's Friday! | TGIF   |\n"
  },
  {
    "path": "exercises/practice/acronym/.meta/config.json",
    "content": "{\n  \"authors\": [],\n  \"contributors\": [\n    \"lilislilit\",\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"acronym.ts\"\n    ],\n    \"test\": [\n      \"acronym.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Convert a long phrase to its acronym.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Julien Vanier\",\n  \"source_url\": \"https://github.com/monkbroc\"\n}\n"
  },
  {
    "path": "exercises/practice/acronym/.meta/proof.ci.ts",
    "content": "export function parse(phrase: string): string {\n  if (typeof phrase !== 'undefined' && phrase !== undefined) {\n    const match = phrase.match(/[A-Z]+[a-z]*|[a-z]+/g)\n    return !match\n      ? ''\n      : match.reduce(\n          (acronym: string, word: string) => (acronym += word[0].toUpperCase()),\n          ''\n        )\n  }\n  return ''\n}\n"
  },
  {
    "path": "exercises/practice/acronym/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[1e22cceb-c5e4-4562-9afe-aef07ad1eaf4]\ndescription = \"basic\"\n\n[79ae3889-a5c0-4b01-baf0-232d31180c08]\ndescription = \"lowercase words\"\n\n[ec7000a7-3931-4a17-890e-33ca2073a548]\ndescription = \"punctuation\"\n\n[32dd261c-0c92-469a-9c5c-b192e94a63b0]\ndescription = \"all caps word\"\n\n[ae2ac9fa-a606-4d05-8244-3bcc4659c1d4]\ndescription = \"punctuation without whitespace\"\n\n[0e4b1e7c-1a6d-48fb-81a7-bf65eb9e69f9]\ndescription = \"very long abbreviation\"\n\n[6a078f49-c68d-4b7b-89af-33a1a98c28cc]\ndescription = \"consecutive delimiters\"\n\n[5118b4b1-4572-434c-8d57-5b762e57973e]\ndescription = \"apostrophes\"\n\n[adc12eab-ec2d-414f-b48c-66a4fc06cdef]\ndescription = \"underscore emphasis\"\n"
  },
  {
    "path": "exercises/practice/acronym/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/acronym/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/acronym/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/acronym/acronym.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { parse } from './acronym.ts'\n\ndescribe('Acronym are produced from', () => {\n  it('title cased phrases', () => {\n    expect(parse('Portable Network Graphics')).toEqual('PNG')\n  })\n\n  xit('other title cased phrases', () => {\n    expect(parse('Ruby on Rails')).toEqual('ROR')\n  })\n\n  xit('inconsistently cased phrases', () => {\n    expect(parse('HyperText Markup Language')).toEqual('HTML')\n  })\n\n  xit('phrases with punctuation', () => {\n    expect(parse('First In, First Out')).toEqual('FIFO')\n  })\n\n  xit('other phrases with punctuation', () => {\n    expect(parse('PHP: Hypertext Preprocessor')).toEqual('PHP')\n  })\n\n  xit('phrases with punctuation and sentence casing', () => {\n    expect(parse('Complementary metal-oxide semiconductor')).toEqual('CMOS')\n  })\n})\n"
  },
  {
    "path": "exercises/practice/acronym/acronym.ts",
    "content": "export function parse(phrase: unknown): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/acronym/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/acronym/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/acronym/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/acronym/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-acronym\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/acronym/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/acronym/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/all-your-base/.docs/instructions.md",
    "content": "# Instructions\n\nConvert a sequence of digits in one base, representing a number, into a sequence of digits in another base, representing the same number.\n\n~~~~exercism/note\nTry to implement the conversion yourself.\nDo not use something else to perform the conversion for you.\n~~~~\n\n## About [Positional Notation][positional-notation]\n\nIn positional notation, a number in base **b** can be understood as a linear combination of powers of **b**.\n\nThe number 42, _in base 10_, means:\n\n`(4 × 10¹) + (2 × 10⁰)`\n\nThe number 101010, _in base 2_, means:\n\n`(1 × 2⁵) + (0 × 2⁴) + (1 × 2³) + (0 × 2²) + (1 × 2¹) + (0 × 2⁰)`\n\nThe number 1120, _in base 3_, means:\n\n`(1 × 3³) + (1 × 3²) + (2 × 3¹) + (0 × 3⁰)`\n\n_Yes. Those three numbers above are exactly the same. Congratulations!_\n\n[positional-notation]: https://en.wikipedia.org/wiki/Positional_notation\n"
  },
  {
    "path": "exercises/practice/all-your-base/.docs/introduction.md",
    "content": "# Introduction\n\nYou've just been hired as professor of mathematics.\nYour first week went well, but something is off in your second week.\nThe problem is that every answer given by your students is wrong!\nLuckily, your math skills have allowed you to identify the problem: the student answers _are_ correct, but they're all in base 2 (binary)!\nAmazingly, it turns out that each week, the students use a different base.\nTo help you quickly verify the student answers, you'll be building a tool to translate between bases.\n"
  },
  {
    "path": "exercises/practice/all-your-base/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"all-your-base.ts\"\n    ],\n    \"test\": [\n      \"all-your-base.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Convert a number, represented as a sequence of digits in one base, to any other base.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  }\n}\n"
  },
  {
    "path": "exercises/practice/all-your-base/.meta/proof.ci.ts",
    "content": "const isValidBase = (base: number): boolean => {\n  return !base || base < 2 || Math.floor(base) !== base\n}\n\nconst isInputValid = (array: number[], base: number): boolean => {\n  if (!array || !array.length) {\n    return false\n  }\n  const val = base - 1\n  for (let i = 0, n = array.length; i < n; i++) {\n    const tmp = array[i]\n    if (tmp > val || tmp < 0) {\n      return false\n    }\n  }\n  return true\n}\n\nconst convertFromDecimalToBase = (\n  num: number,\n  outputBase: number\n): number[] => {\n  let tmp = num\n  const result = []\n  while (tmp) {\n    result.unshift(tmp % outputBase)\n    tmp = Math.floor(tmp / outputBase)\n  }\n  return result\n}\n\nexport function convert(\n  array: number[],\n  inputBase: number,\n  outputBase: number\n): number[] {\n  if (isValidBase(inputBase)) {\n    throw new Error('Wrong input base')\n  }\n  if (isValidBase(outputBase)) {\n    throw new Error('Wrong output base')\n  }\n  const regexp = new RegExp('^0.', 'g')\n  const str = array.join('')\n  if (str.match(regexp) || !isInputValid(array, inputBase)) {\n    throw new Error('Input has wrong format')\n  }\n  if (str === '0') {\n    return [0]\n  }\n  if (str === '1') {\n    return [1]\n  }\n  const decimalValue = array.reduce(\n    (accumulator, value) => accumulator * inputBase + value,\n    0\n  )\n  return convertFromDecimalToBase(decimalValue, outputBase)\n}\n"
  },
  {
    "path": "exercises/practice/all-your-base/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[5ce422f9-7a4b-4f44-ad29-49c67cb32d2c]\ndescription = \"single bit one to decimal\"\n\n[0cc3fea8-bb79-46ac-a2ab-5a2c93051033]\ndescription = \"binary to single decimal\"\n\n[f12db0f9-0d3d-42c2-b3ba-e38cb375a2b8]\ndescription = \"single decimal to binary\"\n\n[2c45cf54-6da3-4748-9733-5a3c765d925b]\ndescription = \"binary to multiple decimal\"\n\n[65ddb8b4-8899-4fcc-8618-181b2cf0002d]\ndescription = \"decimal to binary\"\n\n[8d418419-02a7-4824-8b7a-352d33c6987e]\ndescription = \"trinary to hexadecimal\"\n\n[d3901c80-8190-41b9-bd86-38d988efa956]\ndescription = \"hexadecimal to trinary\"\n\n[5d42f85e-21ad-41bd-b9be-a3e8e4258bbf]\ndescription = \"15-bit integer\"\n\n[d68788f7-66dd-43f8-a543-f15b6d233f83]\ndescription = \"empty list\"\n\n[5e27e8da-5862-4c5f-b2a9-26c0382b6be7]\ndescription = \"single zero\"\n\n[2e1c2573-77e4-4b9c-8517-6c56c5bcfdf2]\ndescription = \"multiple zeros\"\n\n[3530cd9f-8d6d-43f5-bc6e-b30b1db9629b]\ndescription = \"leading zeros\"\n\n[a6b476a1-1901-4f2a-92c4-4d91917ae023]\ndescription = \"input base is one\"\n\n[e21a693a-7a69-450b-b393-27415c26a016]\ndescription = \"input base is zero\"\n\n[54a23be5-d99e-41cc-88e0-a650ffe5fcc2]\ndescription = \"input base is negative\"\n\n[9eccf60c-dcc9-407b-95d8-c37b8be56bb6]\ndescription = \"negative digit\"\n\n[232fa4a5-e761-4939-ba0c-ed046cd0676a]\ndescription = \"invalid positive digit\"\n\n[14238f95-45da-41dc-95ce-18f860b30ad3]\ndescription = \"output base is one\"\n\n[73dac367-da5c-4a37-95fe-c87fad0a4047]\ndescription = \"output base is zero\"\n\n[13f81f42-ff53-4e24-89d9-37603a48ebd9]\ndescription = \"output base is negative\"\n\n[0e6c895d-8a5d-4868-a345-309d094cfe8d]\ndescription = \"both bases are negative\"\n"
  },
  {
    "path": "exercises/practice/all-your-base/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/all-your-base/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/all-your-base/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/all-your-base/all-your-base.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { convert } from './all-your-base.ts'\n\ndescribe('Converter', () => {\n  it('single bit one to decimal', () => {\n    expect(convert([1], 2, 10)).toEqual([1])\n  })\n\n  xit('binary to single decimal', () => {\n    expect(convert([1, 0, 1], 2, 10)).toEqual([5])\n  })\n\n  xit('single decimal to binary', () => {\n    expect(convert([5], 10, 2)).toEqual([1, 0, 1])\n  })\n\n  xit('binary to multiple decimal', () => {\n    expect(convert([1, 0, 1, 0, 1, 0], 2, 10)).toEqual([4, 2])\n  })\n\n  xit('decimal to binary', () => {\n    expect(convert([4, 2], 10, 2)).toEqual([1, 0, 1, 0, 1, 0])\n  })\n\n  xit('trinary to hexadecimal', () => {\n    expect(convert([1, 1, 2, 0], 3, 16)).toEqual([2, 10])\n  })\n\n  xit('hexadecimal to trinary', () => {\n    expect(convert([2, 10], 16, 3)).toEqual([1, 1, 2, 0])\n  })\n\n  xit('15-bit integer', () => {\n    expect(convert([3, 46, 60], 97, 73)).toEqual([6, 10, 45])\n  })\n\n  xit('empty list', () => {\n    expect(() => {\n      convert([], 2, 10)\n    }).toThrow('Input has wrong format')\n  })\n\n  xit('single zero', () => {\n    expect(convert([0], 10, 2)).toEqual([0])\n  })\n\n  xit('multiple zeros', () => {\n    expect(() => {\n      convert([0, 0, 0], 10, 2)\n    }).toThrow('Input has wrong format')\n  })\n\n  xit('leading zeros', () => {\n    expect(() => {\n      convert([0, 6, 0], 7, 10)\n    }).toThrow('Input has wrong format')\n  })\n\n  xit('negative digit', () => {\n    expect(() => {\n      convert([1, -1, 1, 0, 1, 0], 2, 10)\n    }).toThrow('Input has wrong format')\n  })\n\n  xit('invalid positive digit', () => {\n    expect(() => {\n      convert([1, 2, 1, 0, 1, 0], 2, 10)\n    }).toThrow('Input has wrong format')\n  })\n\n  xit('first base is one', () => {\n    expect(() => {\n      convert([], 1, 10)\n    }).toThrow('Wrong input base')\n  })\n\n  xit('second base is one', () => {\n    expect(() => {\n      convert([1, 0, 1, 0, 1, 0], 2, 1)\n    }).toThrow('Wrong output base')\n  })\n\n  xit('first base is zero', () => {\n    expect(() => {\n      convert([], 0, 10)\n    }).toThrow('Wrong input base')\n  })\n\n  xit('second base is zero', () => {\n    expect(() => {\n      convert([7], 10, 0)\n    }).toThrow('Wrong output base')\n  })\n\n  xit('first base is negative', () => {\n    expect(() => {\n      convert([1], -2, 10)\n    }).toThrow('Wrong input base')\n  })\n\n  xit('second base is negative', () => {\n    expect(() => {\n      convert([1], 2, -7)\n    }).toThrow('Wrong output base')\n  })\n\n  xit('both bases are negative', () => {\n    expect(() => {\n      convert([1], -2, -7)\n    }).toThrow('Wrong input base')\n  })\n\n  xit('wrong output_base base not integer', () => {\n    expect(() => {\n      convert([0], 3, 2.5)\n    }).toThrow('Wrong output base')\n  })\n})\n"
  },
  {
    "path": "exercises/practice/all-your-base/all-your-base.ts",
    "content": "export function convert(\n  digits: unknown,\n  inputBase: unknown,\n  outputBase: unknown\n): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/all-your-base/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/all-your-base/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/all-your-base/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/all-your-base/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-all-your-base\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/all-your-base/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/all-your-base/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/allergies/.docs/instructions.md",
    "content": "# Instructions\n\nGiven a person's allergy score, determine whether or not they're allergic to a given item, and their full list of allergies.\n\nAn allergy test produces a single numeric score which contains the information about all the allergies the person has (that they were tested for).\n\nThe list of items (and their value) that were tested are:\n\n- eggs (1)\n- peanuts (2)\n- shellfish (4)\n- strawberries (8)\n- tomatoes (16)\n- chocolate (32)\n- pollen (64)\n- cats (128)\n\nSo if Tom is allergic to peanuts and chocolate, he gets a score of 34.\n\nNow, given just that score of 34, your program should be able to say:\n\n- Whether Tom is allergic to any one of those allergens listed above.\n- All the allergens Tom is allergic to.\n\nNote: a given score may include allergens **not** listed above (i.e. allergens that score 256, 512, 1024, etc.).\nYour program should ignore those components of the score.\nFor example, if the allergy score is 257, your program should only report the eggs (1) allergy.\n"
  },
  {
    "path": "exercises/practice/allergies/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"allergies.ts\"\n    ],\n    \"test\": [\n      \"allergies.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given a person's allergy score, determine whether or not they're allergic to a given item, and their full list of allergies.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Exercise by the JumpstartLab team for students at The Turing School of Software and Design.\",\n  \"source_url\": \"https://www.turing.edu/\"\n}\n"
  },
  {
    "path": "exercises/practice/allergies/.meta/proof.ci.ts",
    "content": "export class Allergies {\n  private allergenIndex: number\n\n  private possibleAllergies = [\n    'eggs',\n    'peanuts',\n    'shellfish',\n    'strawberries',\n    'tomatoes',\n    'chocolate',\n    'pollen',\n    'cats',\n  ] as const\n\n  constructor(allergenIndex: number) {\n    this.allergenIndex = allergenIndex\n  }\n\n  public allergicTo(food: string): boolean {\n    let isAllergic = false\n\n    const allergyList = this.list()\n    for (const allergy of allergyList) {\n      if (allergy === food) {\n        isAllergic = true\n        break\n      }\n    }\n\n    return isAllergic\n  }\n\n  public list(): string[] {\n    const possibleAllergies = this.possibleAllergies\n    const allergicTo = []\n\n    for (let i = 0; i < possibleAllergies.length; i++) {\n      const allergy = possibleAllergies[i]\n      if (this.allergenIndex & Math.pow(2, i)) {\n        allergicTo.push(allergy)\n      }\n    }\n\n    return allergicTo\n  }\n}\n"
  },
  {
    "path": "exercises/practice/allergies/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[17fc7296-2440-4ac4-ad7b-d07c321bc5a0]\ndescription = \"testing for eggs allergy -> not allergic to anything\"\n\n[07ced27b-1da5-4c2e-8ae2-cb2791437546]\ndescription = \"testing for eggs allergy -> allergic only to eggs\"\n\n[5035b954-b6fa-4b9b-a487-dae69d8c5f96]\ndescription = \"testing for eggs allergy -> allergic to eggs and something else\"\n\n[64a6a83a-5723-4b5b-a896-663307403310]\ndescription = \"testing for eggs allergy -> allergic to something, but not eggs\"\n\n[90c8f484-456b-41c4-82ba-2d08d93231c6]\ndescription = \"testing for eggs allergy -> allergic to everything\"\n\n[d266a59a-fccc-413b-ac53-d57cb1f0db9d]\ndescription = \"testing for peanuts allergy -> not allergic to anything\"\n\n[ea210a98-860d-46b2-a5bf-50d8995b3f2a]\ndescription = \"testing for peanuts allergy -> allergic only to peanuts\"\n\n[eac69ae9-8d14-4291-ac4b-7fd2c73d3a5b]\ndescription = \"testing for peanuts allergy -> allergic to peanuts and something else\"\n\n[9152058c-ce39-4b16-9b1d-283ec6d25085]\ndescription = \"testing for peanuts allergy -> allergic to something, but not peanuts\"\n\n[d2d71fd8-63d5-40f9-a627-fbdaf88caeab]\ndescription = \"testing for peanuts allergy -> allergic to everything\"\n\n[b948b0a1-cbf7-4b28-a244-73ff56687c80]\ndescription = \"testing for shellfish allergy -> not allergic to anything\"\n\n[9ce9a6f3-53e9-4923-85e0-73019047c567]\ndescription = \"testing for shellfish allergy -> allergic only to shellfish\"\n\n[b272fca5-57ba-4b00-bd0c-43a737ab2131]\ndescription = \"testing for shellfish allergy -> allergic to shellfish and something else\"\n\n[21ef8e17-c227-494e-8e78-470a1c59c3d8]\ndescription = \"testing for shellfish allergy -> allergic to something, but not shellfish\"\n\n[cc789c19-2b5e-4c67-b146-625dc8cfa34e]\ndescription = \"testing for shellfish allergy -> allergic to everything\"\n\n[651bde0a-2a74-46c4-ab55-02a0906ca2f5]\ndescription = \"testing for strawberries allergy -> not allergic to anything\"\n\n[b649a750-9703-4f5f-b7f7-91da2c160ece]\ndescription = \"testing for strawberries allergy -> allergic only to strawberries\"\n\n[50f5f8f3-3bac-47e6-8dba-2d94470a4bc6]\ndescription = \"testing for strawberries allergy -> allergic to strawberries and something else\"\n\n[23dd6952-88c9-48d7-a7d5-5d0343deb18d]\ndescription = \"testing for strawberries allergy -> allergic to something, but not strawberries\"\n\n[74afaae2-13b6-43a2-837a-286cd42e7d7e]\ndescription = \"testing for strawberries allergy -> allergic to everything\"\n\n[c49a91ef-6252-415e-907e-a9d26ef61723]\ndescription = \"testing for tomatoes allergy -> not allergic to anything\"\n\n[b69c5131-b7d0-41ad-a32c-e1b2cc632df8]\ndescription = \"testing for tomatoes allergy -> allergic only to tomatoes\"\n\n[1ca50eb1-f042-4ccf-9050-341521b929ec]\ndescription = \"testing for tomatoes allergy -> allergic to tomatoes and something else\"\n\n[e9846baa-456b-4eff-8025-034b9f77bd8e]\ndescription = \"testing for tomatoes allergy -> allergic to something, but not tomatoes\"\n\n[b2414f01-f3ad-4965-8391-e65f54dad35f]\ndescription = \"testing for tomatoes allergy -> allergic to everything\"\n\n[978467ab-bda4-49f7-b004-1d011ead947c]\ndescription = \"testing for chocolate allergy -> not allergic to anything\"\n\n[59cf4e49-06ea-4139-a2c1-d7aad28f8cbc]\ndescription = \"testing for chocolate allergy -> allergic only to chocolate\"\n\n[b0a7c07b-2db7-4f73-a180-565e07040ef1]\ndescription = \"testing for chocolate allergy -> allergic to chocolate and something else\"\n\n[f5506893-f1ae-482a-b516-7532ba5ca9d2]\ndescription = \"testing for chocolate allergy -> allergic to something, but not chocolate\"\n\n[02debb3d-d7e2-4376-a26b-3c974b6595c6]\ndescription = \"testing for chocolate allergy -> allergic to everything\"\n\n[17f4a42b-c91e-41b8-8a76-4797886c2d96]\ndescription = \"testing for pollen allergy -> not allergic to anything\"\n\n[7696eba7-1837-4488-882a-14b7b4e3e399]\ndescription = \"testing for pollen allergy -> allergic only to pollen\"\n\n[9a49aec5-fa1f-405d-889e-4dfc420db2b6]\ndescription = \"testing for pollen allergy -> allergic to pollen and something else\"\n\n[3cb8e79f-d108-4712-b620-aa146b1954a9]\ndescription = \"testing for pollen allergy -> allergic to something, but not pollen\"\n\n[1dc3fe57-7c68-4043-9d51-5457128744b2]\ndescription = \"testing for pollen allergy -> allergic to everything\"\n\n[d3f523d6-3d50-419b-a222-d4dfd62ce314]\ndescription = \"testing for cats allergy -> not allergic to anything\"\n\n[eba541c3-c886-42d3-baef-c048cb7fcd8f]\ndescription = \"testing for cats allergy -> allergic only to cats\"\n\n[ba718376-26e0-40b7-bbbe-060287637ea5]\ndescription = \"testing for cats allergy -> allergic to cats and something else\"\n\n[3c6dbf4a-5277-436f-8b88-15a206f2d6c4]\ndescription = \"testing for cats allergy -> allergic to something, but not cats\"\n\n[1faabb05-2b98-4995-9046-d83e4a48a7c1]\ndescription = \"testing for cats allergy -> allergic to everything\"\n\n[f9c1b8e7-7dc5-4887-aa93-cebdcc29dd8f]\ndescription = \"list when: -> no allergies\"\n\n[9e1a4364-09a6-4d94-990f-541a94a4c1e8]\ndescription = \"list when: -> just eggs\"\n\n[8851c973-805e-4283-9e01-d0c0da0e4695]\ndescription = \"list when: -> just peanuts\"\n\n[2c8943cb-005e-435f-ae11-3e8fb558ea98]\ndescription = \"list when: -> just strawberries\"\n\n[6fa95d26-044c-48a9-8a7b-9ee46ec32c5c]\ndescription = \"list when: -> eggs and peanuts\"\n\n[19890e22-f63f-4c5c-a9fb-fb6eacddfe8e]\ndescription = \"list when: -> more than eggs but not peanuts\"\n\n[4b68f470-067c-44e4-889f-c9fe28917d2f]\ndescription = \"list when: -> lots of stuff\"\n\n[0881b7c5-9efa-4530-91bd-68370d054bc7]\ndescription = \"list when: -> everything\"\n\n[12ce86de-b347-42a0-ab7c-2e0570f0c65b]\ndescription = \"list when: -> no allergen score parts\"\n\n[93c2df3e-4f55-4fed-8116-7513092819cd]\ndescription = \"list when: -> no allergen score parts without highest valid score\"\n"
  },
  {
    "path": "exercises/practice/allergies/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/allergies/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/allergies/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/allergies/allergies.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { Allergies } from './allergies.ts'\n\ndescribe('allergicTo', () => {\n  it('no allergies means not allergic', () => {\n    const allergies = new Allergies(0)\n\n    expect(allergies.allergicTo('peanuts')).toBeFalsy()\n    expect(allergies.allergicTo('cats')).toBeFalsy()\n    expect(allergies.allergicTo('strawberries')).toBeFalsy()\n  })\n\n  xit('is allergic to eggs', () => {\n    const allergies = new Allergies(1)\n\n    expect(allergies.allergicTo('eggs')).toBeTruthy()\n  })\n\n  xit('allergic to eggs in addition to other stuff', () => {\n    const allergies = new Allergies(5)\n\n    expect(allergies.allergicTo('eggs')).toBeTruthy()\n    expect(allergies.allergicTo('shellfish')).toBeTruthy()\n    expect(allergies.allergicTo('strawberries')).toBeFalsy()\n  })\n})\n\ndescribe('list', () => {\n  xit('no allergies at all', () => {\n    const allergies = new Allergies(0)\n    const expected: string[] = []\n\n    expect(allergies.list()).toEqual(expected)\n  })\n\n  xit('allergic to just eggs', () => {\n    const allergies = new Allergies(1)\n    const expected = ['eggs']\n\n    expect(allergies.list()).toEqual(expected)\n  })\n\n  xit('allergic to just peanuts', () => {\n    const allergies = new Allergies(2)\n    const expected = ['peanuts']\n\n    expect(allergies.list()).toEqual(expected)\n  })\n\n  xit('allergic to just strawberries', () => {\n    const allergies = new Allergies(8)\n    const expected = ['strawberries']\n\n    expect(allergies.list()).toEqual(expected)\n  })\n\n  xit('allergic to eggs and peanuts', () => {\n    const allergies = new Allergies(3)\n    const expected = ['eggs', 'peanuts']\n\n    expect(allergies.list()).toEqual(expected)\n  })\n\n  xit('allergic to more than eggs but not peanuts', () => {\n    const allergies = new Allergies(5)\n    const expected = ['eggs', 'shellfish']\n\n    expect(allergies.list()).toEqual(expected)\n  })\n\n  xit('allergic to lots of stuff', () => {\n    const allergies = new Allergies(248)\n    const expected = ['strawberries', 'tomatoes', 'chocolate', 'pollen', 'cats']\n\n    expect(allergies.list()).toEqual(expected)\n  })\n\n  xit('allergic to everything', () => {\n    const allergies = new Allergies(255)\n    const expected = [\n      'eggs',\n      'peanuts',\n      'shellfish',\n      'strawberries',\n      'tomatoes',\n      'chocolate',\n      'pollen',\n      'cats',\n    ]\n\n    expect(allergies.list()).toEqual(expected)\n  })\n\n  xit('ignore non allergen score parts', () => {\n    const allergies = new Allergies(509)\n    const expected = [\n      'eggs',\n      'shellfish',\n      'strawberries',\n      'tomatoes',\n      'chocolate',\n      'pollen',\n      'cats',\n    ]\n\n    expect(allergies.list()).toEqual(expected)\n  })\n\n  xit('ignore non allergen score parts, without highest valid score', () => {\n    const allergies = new Allergies(257)\n    const expected = ['eggs']\n\n    expect(allergies.list()).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/allergies/allergies.ts",
    "content": "export class Allergies {\n  constructor(allergenIndex: unknown) {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public list(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public allergicTo(allergen: unknown): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/allergies/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/allergies/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/allergies/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/allergies/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-allergies\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/allergies/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/allergies/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/alphametics/.docs/instructions.md",
    "content": "# Instructions\n\nGiven an alphametics puzzle, find the correct solution.\n\n[Alphametics][alphametics] is a puzzle where letters in words are replaced with numbers.\n\nFor example `SEND + MORE = MONEY`:\n\n```text\n  S E N D\n  M O R E +\n-----------\nM O N E Y\n```\n\nReplacing these with valid numbers gives:\n\n```text\n  9 5 6 7\n  1 0 8 5 +\n-----------\n1 0 6 5 2\n```\n\nThis is correct because every letter is replaced by a different number and the words, translated into numbers, then make a valid sum.\n\nEach letter must represent a different digit, and the leading digit of a multi-digit number must not be zero.\n\n[alphametics]: https://en.wikipedia.org/wiki/Alphametics\n"
  },
  {
    "path": "exercises/practice/alphametics/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"W0lfw00d\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"alphametics.ts\"\n    ],\n    \"test\": [\n      \"alphametics.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given an alphametics puzzle, find the correct solution.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  }\n}\n"
  },
  {
    "path": "exercises/practice/alphametics/.meta/proof.ci.ts",
    "content": "export function solve(puzzle: string): undefined | { [key: string]: number } {\n  const parts: string[] = puzzle\n    .split(/[+|==]/g)\n    .map((o) => o.trim())\n    .filter((o) => o !== '')\n\n  if (parts.length < 3) {\n    return undefined\n  }\n\n  const uniqueLetters = new Set(parts.join('').split(''))\n  const firstLetters = new Set(parts.map((p) => p[0]))\n\n  const numberCombinations: number[][] = getNumberCombinations(\n    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n    uniqueLetters.size\n  )\n\n  while (numberCombinations.length) {\n    const permutations = generate(\n      Array(uniqueLetters.size)\n        .fill(Array<number>())\n        .map((_, i) => i)\n    )\n    const numberCombination: number[] = numberCombinations.pop() || []\n    for (const permutation of permutations) {\n      const newNumbers = assignNumbers(\n        numberCombination,\n        uniqueLetters,\n        permutation\n      )\n      if (testNumbers(newNumbers, parts, firstLetters)) {\n        return newNumbers\n      }\n    }\n  }\n  return undefined\n}\n\nfunction assignNumbers(\n  numberCombination: number[],\n  uniqueLetters: Set<string>,\n  permutation: number[]\n): { [key: string]: number } {\n  const output: { [key: string]: number } = {}\n  let i = 0\n  for (const letter of uniqueLetters.values()) {\n    output[letter] = numberCombination[permutation[i++]]\n  }\n  return output\n}\n\nfunction testNumbers(\n  numbers: { [key: string]: number },\n  puzzleParts: string[],\n  firstLetters: Set<string>\n): boolean {\n  const keys: string[] = Object.keys(numbers)\n  for (const key of keys) {\n    if (numbers[key] === 0 && firstLetters.has(key)) {\n      return false\n    }\n  }\n  const replaceRegex = new RegExp(`[${keys.join('')}]`, 'g')\n\n  const puzzlePartsNumbers: number[] = puzzleParts\n    .join(',')\n    .replace(replaceRegex, (input) => numbers[input].toString())\n    .split(',')\n    .map((t) => parseInt(t, 10))\n\n  const total = puzzlePartsNumbers.slice(puzzlePartsNumbers.length - 1)[0]\n  return (\n    total ===\n    puzzlePartsNumbers\n      .slice(0, puzzleParts.length - 1)\n      .reduce((acc: number, val: number) => acc + val, 0)\n  )\n}\n\nfunction* generate(A: number[]): IterableIterator<number[]> {\n  const c = []\n  const n = A.length\n  yield A\n  for (let i = 0; i < n; i++) {\n    c[i] = 0\n  }\n  let i = 0\n  while (i < n) {\n    if (c[i] < i) {\n      if (i % 2 === 0) {\n        swap(A, 0, i)\n      } else {\n        swap(A, c[i], i)\n      }\n      yield A\n      c[i] += 1\n      i = 0\n    } else {\n      c[i] = 0\n      i += 1\n    }\n  }\n}\n\nfunction swap(list: number[], x: number, y: number): number[] {\n  const tmp = list[x]\n  list[x] = list[y]\n  list[y] = tmp\n  return list\n}\n\nfunction getNumberCombinations(arr: number[], size: number): number[][] {\n  const len = arr.length\n\n  if (size === len) {\n    return [arr]\n  }\n\n  return arr.reduce((acc: number[][], val: number, i: number) => {\n    const res: number[][] = getNumberCombinations(\n      arr.slice(i + 1),\n      size - 1\n    ).map((comb) => [val].concat(comb))\n\n    return acc.concat(res)\n  }, [])\n}\n"
  },
  {
    "path": "exercises/practice/alphametics/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[e0c08b07-9028-4d5f-91e1-d178fead8e1a]\ndescription = \"puzzle with three letters\"\n\n[a504ee41-cb92-4ec2-9f11-c37e95ab3f25]\ndescription = \"solution must have unique value for each letter\"\n\n[4e3b81d2-be7b-4c5c-9a80-cd72bc6d465a]\ndescription = \"leading zero solution is invalid\"\n\n[8a3e3168-d1ee-4df7-94c7-b9c54845ac3a]\ndescription = \"puzzle with two digits final carry\"\n\n[a9630645-15bd-48b6-a61e-d85c4021cc09]\ndescription = \"puzzle with four letters\"\n\n[3d905a86-5a52-4e4e-bf80-8951535791bd]\ndescription = \"puzzle with six letters\"\n\n[4febca56-e7b7-4789-97b9-530d09ba95f0]\ndescription = \"puzzle with seven letters\"\n\n[12125a75-7284-4f9a-a5fa-191471e0d44f]\ndescription = \"puzzle with eight letters\"\n\n[fb05955f-38dc-477a-a0b6-5ef78969fffa]\ndescription = \"puzzle with ten letters\"\n\n[9a101e81-9216-472b-b458-b513a7adacf7]\ndescription = \"puzzle with ten letters and 199 addends\"\n"
  },
  {
    "path": "exercises/practice/alphametics/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/alphametics/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/alphametics/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/alphametics/alphametics.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { solve } from './alphametics.ts'\n\ndescribe('Solve the alphametics puzzle', () => {\n  it('puzzle with three letters', () => {\n    const puzzle = 'I + BB == ILL'\n    const expected = {\n      I: 1,\n      B: 9,\n      L: 0,\n    }\n    expect(solve(puzzle)).toEqual(expected)\n  })\n\n  xit('solution must have unique value for each letter', () => {\n    const puzzle = 'A == B'\n    expect(solve(puzzle)).toBeUndefined()\n  })\n\n  xit('leading zero solution is invalid', () => {\n    const puzzle = 'ACA + DD == BD'\n    expect(solve(puzzle)).toBeUndefined()\n  })\n\n  xit('puzzle with four letters', () => {\n    const puzzle = 'AS + A == MOM'\n    const expected = {\n      A: 9,\n      S: 2,\n      M: 1,\n      O: 0,\n    }\n    expect(solve(puzzle)).toEqual(expected)\n  })\n\n  xit('puzzle with six letters', () => {\n    const puzzle = 'NO + NO + TOO == LATE'\n    const expected = {\n      N: 7,\n      O: 4,\n      T: 9,\n      L: 1,\n      A: 0,\n      E: 2,\n    }\n    expect(solve(puzzle)).toEqual(expected)\n  })\n\n  xit('puzzle with seven letters', () => {\n    const puzzle = 'HE + SEES + THE == LIGHT'\n    const expected = {\n      E: 4,\n      G: 2,\n      H: 5,\n      I: 0,\n      L: 1,\n      S: 9,\n      T: 7,\n    }\n    expect(solve(puzzle)).toEqual(expected)\n  })\n\n  xit('puzzle with eight letters', () => {\n    const puzzle = 'SEND + MORE == MONEY'\n    const expected = {\n      S: 9,\n      E: 5,\n      N: 6,\n      D: 7,\n      M: 1,\n      O: 0,\n      R: 8,\n      Y: 2,\n    }\n    expect(solve(puzzle)).toEqual(expected)\n  })\n\n  xit('puzzle with ten letters', () => {\n    const puzzle = 'AND + A + STRONG + OFFENSE + AS + A + GOOD == DEFENSE'\n    const expected = {\n      A: 5,\n      D: 3,\n      E: 4,\n      F: 7,\n      G: 8,\n      N: 0,\n      O: 2,\n      R: 1,\n      S: 6,\n      T: 9,\n    }\n    expect(solve(puzzle)).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/alphametics/alphametics.ts",
    "content": "export function solve(puzzle: unknown): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/alphametics/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/alphametics/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/alphametics/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/alphametics/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-alphametics\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/alphametics/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/alphametics/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/anagram/.docs/instructions.append.md",
    "content": "# Instructions Append\n\nThe anagrams can be returned in any order.\n"
  },
  {
    "path": "exercises/practice/anagram/.docs/instructions.md",
    "content": "# Instructions\n\nGiven a target word and one or more candidate words, your task is to find the candidates that are anagrams of the target.\n\nAn anagram is a rearrangement of letters to form a new word: for example `\"owns\"` is an anagram of `\"snow\"`.\nA word is _not_ its own anagram: for example, `\"stop\"` is not an anagram of `\"stop\"`.\n\nThe target word and candidate words are made up of one or more ASCII alphabetic characters (`A`-`Z` and `a`-`z`).\nLowercase and uppercase characters are equivalent: for example, `\"PoTS\"` is an anagram of `\"sTOp\"`, but `\"StoP\"` is not an anagram of `\"sTOp\"`.\nThe words you need to find should be taken from the candidate words, using the same letter case.\n\nGiven the target `\"stone\"` and the candidate words `\"stone\"`, `\"tones\"`, `\"banana\"`, `\"tons\"`, `\"notes\"`, and `\"Seton\"`, the anagram words you need to find are `\"tones\"`, `\"notes\"`, and `\"Seton\"`.\n"
  },
  {
    "path": "exercises/practice/anagram/.docs/introduction.md",
    "content": "# Introduction\n\nAt a garage sale, you find a lovely vintage typewriter at a bargain price!\nExcitedly, you rush home, insert a sheet of paper, and start typing away.\nHowever, your excitement wanes when you examine the output: all words are garbled!\nFor example, it prints \"stop\" instead of \"post\" and \"least\" instead of \"stale.\"\nCarefully, you try again, but now it prints \"spot\" and \"slate.\"\nAfter some experimentation, you find there is a random delay before each letter is printed, which messes up the order.\nYou now understand why they sold it for so little money!\n\nYou realize this quirk allows you to generate anagrams, which are words formed by rearranging the letters of another word.\nPleased with your finding, you spend the rest of the day generating hundreds of anagrams.\n"
  },
  {
    "path": "exercises/practice/anagram/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"masters3d\"\n  ],\n  \"contributors\": [\n    \"CRivasGomez\",\n    \"fredrb\",\n    \"lukaszklis\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"anagram.ts\"\n    ],\n    \"test\": [\n      \"anagram.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given a word and a list of possible anagrams, select the correct sublist.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Inspired by the Extreme Startup game\",\n  \"source_url\": \"https://github.com/rchatley/extreme_startup\"\n}\n"
  },
  {
    "path": "exercises/practice/anagram/.meta/proof.ci.ts",
    "content": "function sort(input: string): string {\n  return input.toString().toLowerCase().split('').sort().join('')\n}\n\nexport class Anagram {\n  private value: string\n  constructor(input: string) {\n    this.value = input\n  }\n\n  public matches(...input: string[]): string[] {\n    const result: string[] = []\n    for (const each of input) {\n      if (sort(each) === sort(this.value)) {\n        if (each.toLowerCase() === this.value.toLowerCase()) {\n          continue\n        }\n        result.push(each)\n      }\n    }\n    return result\n  }\n}\n"
  },
  {
    "path": "exercises/practice/anagram/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[dd40c4d2-3c8b-44e5-992a-f42b393ec373]\ndescription = \"no matches\"\n\n[b3cca662-f50a-489e-ae10-ab8290a09bdc]\ndescription = \"detects two anagrams\"\ninclude = false\n\n[03eb9bbe-8906-4ea0-84fa-ffe711b52c8b]\ndescription = \"detects two anagrams\"\nreimplements = \"b3cca662-f50a-489e-ae10-ab8290a09bdc\"\n\n[a27558ee-9ba0-4552-96b1-ecf665b06556]\ndescription = \"does not detect anagram subsets\"\n\n[64cd4584-fc15-4781-b633-3d814c4941a4]\ndescription = \"detects anagram\"\n\n[99c91beb-838f-4ccd-b123-935139917283]\ndescription = \"detects three anagrams\"\n\n[78487770-e258-4e1f-a646-8ece10950d90]\ndescription = \"detects multiple anagrams with different case\"\n\n[1d0ab8aa-362f-49b7-9902-3d0c668d557b]\ndescription = \"does not detect non-anagrams with identical checksum\"\n\n[9e632c0b-c0b1-4804-8cc1-e295dea6d8a8]\ndescription = \"detects anagrams case-insensitively\"\n\n[b248e49f-0905-48d2-9c8d-bd02d8c3e392]\ndescription = \"detects anagrams using case-insensitive subject\"\n\n[f367325c-78ec-411c-be76-e79047f4bd54]\ndescription = \"detects anagrams using case-insensitive possible matches\"\n\n[7cc195ad-e3c7-44ee-9fd2-d3c344806a2c]\ndescription = \"does not detect an anagram if the original word is repeated\"\ninclude = false\n\n[630abb71-a94e-4715-8395-179ec1df9f91]\ndescription = \"does not detect an anagram if the original word is repeated\"\nreimplements = \"7cc195ad-e3c7-44ee-9fd2-d3c344806a2c\"\n\n[9878a1c9-d6ea-4235-ae51-3ea2befd6842]\ndescription = \"anagrams must use all letters exactly once\"\n\n[85757361-4535-45fd-ac0e-3810d40debc1]\ndescription = \"words are not anagrams of themselves (case-insensitive)\"\ninclude = false\n\n[68934ed0-010b-4ef9-857a-20c9012d1ebf]\ndescription = \"words are not anagrams of themselves\"\nreimplements = \"85757361-4535-45fd-ac0e-3810d40debc1\"\n\n[589384f3-4c8a-4e7d-9edc-51c3e5f0c90e]\ndescription = \"words are not anagrams of themselves even if letter case is partially different\"\nreimplements = \"85757361-4535-45fd-ac0e-3810d40debc1\"\n\n[ba53e423-7e02-41ee-9ae2-71f91e6d18e6]\ndescription = \"words are not anagrams of themselves even if letter case is completely different\"\nreimplements = \"85757361-4535-45fd-ac0e-3810d40debc1\"\n\n[a0705568-628c-4b55-9798-82e4acde51ca]\ndescription = \"words other than themselves can be anagrams\"\ninclude = false\n\n[33d3f67e-fbb9-49d3-a90e-0beb00861da7]\ndescription = \"words other than themselves can be anagrams\"\nreimplements = \"a0705568-628c-4b55-9798-82e4acde51ca\"\n\n[a6854f66-eec1-4afd-a137-62ef2870c051]\ndescription = \"handles case of greek letters\"\n\n[fd3509e5-e3ba-409d-ac3d-a9ac84d13296]\ndescription = \"different characters may have the same bytes\"\n"
  },
  {
    "path": "exercises/practice/anagram/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/anagram/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/anagram/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/anagram/anagram.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { Anagram } from './anagram.ts'\n\nconst areSetsEqual = <T>(setA: Set<T>, setB: Set<T>): boolean =>\n  setA.size === setB.size && [...setA].every((val) => setB.has(val))\n\ndescribe('Anagram', () => {\n  it('no matches', () => {\n    const subject = new Anagram('diaper')\n    const matches = subject.matches('hello', 'world', 'zombies', 'pants')\n    const expected = []\n\n    expect(areSetsEqual(new Set(expected), new Set(matches))).toEqual(true)\n  })\n\n  xit('detects two anagrams', () => {\n    const subject = new Anagram('solemn')\n    const matches = subject.matches('lemons', 'cherry', 'melons')\n    const expected = ['lemons', 'melons']\n\n    expect(areSetsEqual(new Set(expected), new Set(matches))).toEqual(true)\n  })\n\n  xit('does not detect anagram subsets', () => {\n    const subject = new Anagram('good')\n    const matches = subject.matches('dog', 'goody')\n    const expected = []\n\n    expect(areSetsEqual(new Set(expected), new Set(matches))).toEqual(true)\n  })\n\n  xit('detects anagram', () => {\n    const subject = new Anagram('listen')\n    const matches = subject.matches('enlists', 'google', 'inlets', 'banana')\n    const expected = ['inlets']\n\n    expect(areSetsEqual(new Set(expected), new Set(matches))).toEqual(true)\n  })\n\n  xit('detects three anagrams', () => {\n    const subject = new Anagram('allergy')\n    const matches = subject.matches(\n      'gallery',\n      'ballerina',\n      'regally',\n      'clergy',\n      'largely',\n      'leading'\n    )\n    const expected = ['gallery', 'regally', 'largely']\n\n    expect(areSetsEqual(new Set(expected), new Set(matches))).toEqual(true)\n  })\n\n  xit('detects multiple anagrams with different case', () => {\n    const subject = new Anagram('nose')\n    const matches = subject.matches('Eons', 'ONES')\n    const expected = ['Eons', 'ONES']\n\n    expect(areSetsEqual(new Set(expected), new Set(matches))).toEqual(true)\n  })\n\n  xit('does not detect non-anagrams with identical checksum', () => {\n    const subject = new Anagram('mass')\n    const matches = subject.matches('last')\n    const expected = []\n\n    expect(areSetsEqual(new Set(expected), new Set(matches))).toEqual(true)\n  })\n\n  xit('detects anagrams case-insensitively', () => {\n    const subject = new Anagram('Orchestra')\n    const matches = subject.matches('cashregister', 'Carthorse', 'radishes')\n    const expected = ['Carthorse']\n\n    expect(areSetsEqual(new Set(expected), new Set(matches))).toEqual(true)\n  })\n\n  xit('detects anagrams using case-insensitive subject', () => {\n    const subject = new Anagram('Orchestra')\n    const matches = subject.matches('cashregister', 'carthorse', 'radishes')\n    const expected = ['carthorse']\n\n    expect(areSetsEqual(new Set(expected), new Set(matches))).toEqual(true)\n  })\n\n  xit('detects anagrams using case-insensitive possible matches', () => {\n    const subject = new Anagram('orchestra')\n    const matches = subject.matches('cashregister', 'Carthorse', 'radishes')\n    const expected = ['Carthorse']\n\n    expect(areSetsEqual(new Set(expected), new Set(matches))).toEqual(true)\n  })\n\n  xit('does not detect an anagram if the original word is repeated', () => {\n    const subject = new Anagram('go')\n    const matches = subject.matches('goGoGO')\n    const expected = []\n\n    expect(areSetsEqual(new Set(expected), new Set(matches))).toEqual(true)\n  })\n\n  xit('anagrams must use all letters exactly once', () => {\n    const subject = new Anagram('tapper')\n    const matches = subject.matches('patter')\n    const expected = []\n\n    expect(areSetsEqual(new Set(expected), new Set(matches))).toEqual(true)\n  })\n\n  xit('words are not anagrams of themselves', () => {\n    const subject = new Anagram('BANANA')\n    const matches = subject.matches('BANANA')\n    const expected = []\n\n    expect(areSetsEqual(new Set(expected), new Set(matches))).toEqual(true)\n  })\n\n  xit('words are not anagrams of themselves even if letter case is partially different', () => {\n    const subject = new Anagram('BANANA')\n    const matches = subject.matches('Banana')\n    const expected = []\n\n    expect(areSetsEqual(new Set(expected), new Set(matches))).toEqual(true)\n  })\n\n  xit('words are not anagrams of themselves even if letter case is completely different', () => {\n    const subject = new Anagram('BANANA')\n    const matches = subject.matches('Banana')\n    const expected = []\n\n    expect(areSetsEqual(new Set(expected), new Set(matches))).toEqual(true)\n  })\n\n  xit('words other than themselves can be anagrams', () => {\n    const subject = new Anagram('LISTEN')\n    const matches = subject.matches('LISTEN', 'Silent')\n    const expected = ['Silent']\n\n    expect(areSetsEqual(new Set(expected), new Set(matches))).toEqual(true)\n  })\n\n  xit('handles case of greek letters', () => {\n    const subject = new Anagram('ΑΒΓ')\n    const matches = subject.matches('ΒΓΑ', 'ΒΓΔ', 'γβα', 'αβγ')\n    const expected = ['ΒΓΑ', 'γβα']\n\n    expect(areSetsEqual(new Set(expected), new Set(matches))).toEqual(true)\n  })\n\n  xit('different characters may have the same bytes', () => {\n    const subject = new Anagram('a⬂')\n    const matches = subject.matches('€a')\n    const expected = []\n\n    expect(areSetsEqual(new Set(expected), new Set(matches))).toEqual(true)\n  })\n\n  xit('matches() accepts string arguments', () => {\n    const subject = new Anagram('ant')\n    const matches = subject.matches('stand', 'tan', 'at')\n    const expected = ['tan']\n\n    expect(areSetsEqual(new Set(expected), new Set(matches))).toEqual(true)\n  })\n\n  xit('matches() accepts single string argument', () => {\n    const subject = new Anagram('ant')\n    const matches = subject.matches('tan')\n    const expected = ['tan']\n\n    expect(areSetsEqual(new Set(expected), new Set(matches))).toEqual(true)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/anagram/anagram.ts",
    "content": "export class Anagram {\n  constructor(input: unknown) {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public matches(...potentials: unknown[]): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/anagram/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/anagram/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/anagram/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/anagram/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-anagram\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/anagram/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/anagram/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/armstrong-numbers/.docs/instructions.md",
    "content": "# Instructions\n\nAn [Armstrong number][armstrong-number] is a number that is the sum of its own digits each raised to the power of the number of digits.\n\nFor example:\n\n- 9 is an Armstrong number, because `9 = 9^1 = 9`\n- 10 is _not_ an Armstrong number, because `10 != 1^2 + 0^2 = 1`\n- 153 is an Armstrong number, because: `153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153`\n- 154 is _not_ an Armstrong number, because: `154 != 1^3 + 5^3 + 4^3 = 1 + 125 + 64 = 190`\n\nWrite some code to determine whether a number is an Armstrong number.\n\n[armstrong-number]: https://en.wikipedia.org/wiki/Narcissistic_number\n"
  },
  {
    "path": "exercises/practice/armstrong-numbers/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"armstrong-numbers.ts\"\n    ],\n    \"test\": [\n      \"armstrong-numbers.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Determine if a number is an Armstrong number.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Wikipedia\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/Narcissistic_number\"\n}\n"
  },
  {
    "path": "exercises/practice/armstrong-numbers/.meta/proof.ci.ts",
    "content": "export function isArmstrongNumber(input: number | bigint): boolean {\n  const digits = String(input).split('')\n  const sum = digits.reduce((total, current) => {\n    return total + BigInt(parseInt(current, 10)) ** BigInt(digits.length)\n  }, BigInt(0))\n\n  // eslint-disable-next-line eqeqeq\n  return sum == input\n}\n"
  },
  {
    "path": "exercises/practice/armstrong-numbers/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[c1ed103c-258d-45b2-be73-d8c6d9580c7b]\ndescription = \"Zero is an Armstrong number\"\n\n[579e8f03-9659-4b85-a1a2-d64350f6b17a]\ndescription = \"Single-digit numbers are Armstrong numbers\"\n\n[2d6db9dc-5bf8-4976-a90b-b2c2b9feba60]\ndescription = \"There are no two-digit Armstrong numbers\"\n\n[509c087f-e327-4113-a7d2-26a4e9d18283]\ndescription = \"Three-digit number that is an Armstrong number\"\n\n[7154547d-c2ce-468d-b214-4cb953b870cf]\ndescription = \"Three-digit number that is not an Armstrong number\"\n\n[6bac5b7b-42e9-4ecb-a8b0-4832229aa103]\ndescription = \"Four-digit number that is an Armstrong number\"\n\n[eed4b331-af80-45b5-a80b-19c9ea444b2e]\ndescription = \"Four-digit number that is not an Armstrong number\"\n\n[f971ced7-8d68-4758-aea1-d4194900b864]\ndescription = \"Seven-digit number that is an Armstrong number\"\n\n[7ee45d52-5d35-4fbd-b6f1-5c8cd8a67f18]\ndescription = \"Seven-digit number that is not an Armstrong number\"\n\n[5ee2fdf8-334e-4a46-bb8d-e5c19c02c148]\ndescription = \"Armstrong number containing seven zeroes\"\n\n[12ffbf10-307a-434e-b4ad-c925680e1dd4]\ndescription = \"The largest and last Armstrong number\"\n"
  },
  {
    "path": "exercises/practice/armstrong-numbers/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/armstrong-numbers/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/armstrong-numbers/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/armstrong-numbers/armstrong-numbers.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { isArmstrongNumber } from './armstrong-numbers.ts'\n\ndescribe('Armstrong Numbers', () => {\n  it('Single-digit numbers are Armstrong numbers', () => {\n    expect(isArmstrongNumber(5)).toBeTruthy()\n  })\n\n  xit('There are no two-digit Armstrong numbers', () => {\n    expect(isArmstrongNumber(10)).toBeFalsy()\n  })\n\n  xit('Three-digit number that is an Armstrong number', () => {\n    expect(isArmstrongNumber(153)).toBeTruthy()\n  })\n\n  xit('Three-digit number that is not an Armstrong number', () => {\n    expect(isArmstrongNumber(100)).toBeFalsy()\n  })\n\n  xit('Four-digit number that is an Armstrong number', () => {\n    expect(isArmstrongNumber(9474)).toBeTruthy()\n  })\n\n  xit('Four-digit number that is not an Armstrong number', () => {\n    expect(isArmstrongNumber(9475)).toBeFalsy()\n  })\n\n  xit('Seven-digit number that is an Armstrong number', () => {\n    expect(isArmstrongNumber(9926315)).toBeTruthy()\n  })\n\n  xit('Seven-digit number that is not an Armstrong number', () => {\n    expect(isArmstrongNumber(9926314)).toBeFalsy()\n  })\n\n  xit('Armstrong number containing seven zeroes', () => {\n    expect(\n      isArmstrongNumber(BigInt('186709961001538790100634132976990'))\n    ).toBeTruthy()\n  })\n\n  xit('The largest and last Armstrong number', () => {\n    expect(\n      isArmstrongNumber(BigInt('115132219018763992565095597973971522401'))\n    ).toBeTruthy()\n  })\n})\n"
  },
  {
    "path": "exercises/practice/armstrong-numbers/armstrong-numbers.ts",
    "content": "export function isArmstrongNumber(number: unknown): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/armstrong-numbers/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/armstrong-numbers/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/armstrong-numbers/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/armstrong-numbers/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-armstrong-numbers\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/armstrong-numbers/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/armstrong-numbers/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/atbash-cipher/.docs/instructions.md",
    "content": "# Instructions\n\nCreate an implementation of the Atbash cipher, an ancient encryption system created in the Middle East.\n\nThe Atbash cipher is a simple substitution cipher that relies on transposing all the letters in the alphabet such that the resulting alphabet is backwards.\nThe first letter is replaced with the last letter, the second with the second-last, and so on.\n\nAn Atbash cipher for the Latin alphabet would be as follows:\n\n```text\nPlain:  abcdefghijklmnopqrstuvwxyz\nCipher: zyxwvutsrqponmlkjihgfedcba\n```\n\nIt is a very weak cipher because it only has one possible key, and it is a simple mono-alphabetic substitution cipher.\nHowever, this may not have been an issue in the cipher's time.\n\nCiphertext is written out in groups of fixed length, the traditional group size being 5 letters, leaving numbers unchanged, and punctuation is excluded.\nThis is to make it harder to guess things based on word boundaries.\nAll text will be encoded as lowercase letters.\n\n## Examples\n\n- Encoding `test` gives `gvhg`\n- Encoding `x123 yes` gives `c123b vh`\n- Decoding `gvhg` gives `test`\n- Decoding `gsvjf rxpyi ldmul cqfnk hlevi gsvoz abwlt` gives `thequickbrownfoxjumpsoverthelazydog`\n"
  },
  {
    "path": "exercises/practice/atbash-cipher/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"bward\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"Roshanjossey\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"atbash-cipher.ts\"\n    ],\n    \"test\": [\n      \"atbash-cipher.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Create an implementation of the Atbash cipher, an ancient encryption system created in the Middle East.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Wikipedia\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/Atbash\"\n}\n"
  },
  {
    "path": "exercises/practice/atbash-cipher/.meta/proof.ci.ts",
    "content": "const alphabet = 'abcdefghijklmnopqrstuvwxyz'\nconst numbers = '0123456789'\n\nexport function encode(plainText: string): string {\n  const lowerCaseLettersOnly = plainText\n    .toLowerCase()\n    .split('')\n    .filter((char) => alphabet.includes(char) || numbers.includes(char))\n    .join('')\n\n  return decode(lowerCaseLettersOnly)\n    .split('')\n    .reduce((accumulator: string[], _, index, array) => {\n      if (index % 5 === 0) {\n        accumulator.push(array.slice(index, index + 5).join(''))\n      }\n      return accumulator\n    }, [])\n    .join(' ')\n}\n\nexport function decode(cipherText: string): string {\n  return cipherText\n    .split(' ')\n    .join('')\n    .split('')\n    .map((char) =>\n      alphabet.includes(char) ? alphabet[25 - alphabet.indexOf(char)] : char\n    )\n    .join('')\n}\n"
  },
  {
    "path": "exercises/practice/atbash-cipher/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[2f47ebe1-eab9-4d6b-b3c6-627562a31c77]\ndescription = \"encode yes\"\n\n[b4ffe781-ea81-4b74-b268-cc58ba21c739]\ndescription = \"encode no\"\n\n[10e48927-24ab-4c4d-9d3f-3067724ace00]\ndescription = \"encode OMG\"\n\n[d59b8bc3-509a-4a9a-834c-6f501b98750b]\ndescription = \"encode spaces\"\n\n[31d44b11-81b7-4a94-8b43-4af6a2449429]\ndescription = \"encode mindblowingly\"\n\n[d503361a-1433-48c0-aae0-d41b5baa33ff]\ndescription = \"encode numbers\"\n\n[79c8a2d5-0772-42d4-b41b-531d0b5da926]\ndescription = \"encode deep thought\"\n\n[9ca13d23-d32a-4967-a1fd-6100b8742bab]\ndescription = \"encode all the letters\"\n\n[bb50e087-7fdf-48e7-9223-284fe7e69851]\ndescription = \"decode exercism\"\n\n[ac021097-cd5d-4717-8907-b0814b9e292c]\ndescription = \"decode a sentence\"\n\n[18729de3-de74-49b8-b68c-025eaf77f851]\ndescription = \"decode numbers\"\n\n[0f30325f-f53b-415d-ad3e-a7a4f63de034]\ndescription = \"decode all the letters\"\n\n[39640287-30c6-4c8c-9bac-9d613d1a5674]\ndescription = \"decode with too many spaces\"\n\n[b34edf13-34c0-49b5-aa21-0768928000d5]\ndescription = \"decode with no spaces\"\n"
  },
  {
    "path": "exercises/practice/atbash-cipher/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/atbash-cipher/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/atbash-cipher/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/atbash-cipher/atbash-cipher.test.ts",
    "content": "import { describe, xdescribe, it, expect, xit } from '@jest/globals'\nimport { encode, decode } from './atbash-cipher.ts'\n\ndescribe('AtbashCipher', () => {\n  describe('encoding', () => {\n    it('encode yes', () => {\n      const cipherText = encode('yes')\n      expect(cipherText).toEqual('bvh')\n    })\n\n    xit('encode no', () => {\n      const cipherText = encode('no')\n      expect(cipherText).toEqual('ml')\n    })\n\n    xit('encode OMG', () => {\n      const cipherText = encode('OMG')\n      expect(cipherText).toEqual('lnt')\n    })\n\n    xit('encode spaces', () => {\n      const cipherText = encode('O M G')\n      expect(cipherText).toEqual('lnt')\n    })\n\n    xit('encode mindblowingly', () => {\n      const cipherText = encode('mindblowingly')\n      expect(cipherText).toEqual('nrmwy oldrm tob')\n    })\n\n    xit('encode numbers', () => {\n      const cipherText = encode('Testing,1 2 3, testing.')\n      expect(cipherText).toEqual('gvhgr mt123 gvhgr mt')\n    })\n\n    xit('encode deep thought', () => {\n      const cipherText = encode('Truth is fiction.')\n      expect(cipherText).toEqual('gifgs rhurx grlm')\n    })\n\n    xit('encode all the letters', () => {\n      const cipherText = encode('thequickbrownfoxjumpsoverthelazydog')\n      expect(cipherText).toEqual('gsvjf rxpyi ldmul cqfnk hlevi gsvoz abwlt')\n    })\n  })\n\n  xdescribe('decode', () => {\n    xit('decode exercism', () => {\n      const plainText = decode('vcvix rhn')\n      expect(plainText).toEqual('exercism')\n    })\n\n    xit('decode a sentence', () => {\n      const cipherText = decode('zmlyh gzxov rhlug vmzhg vkkrm thglm v')\n      expect(cipherText).toEqual('anobstacleisoftenasteppingstone')\n    })\n\n    xit('decode numbers', () => {\n      const plainText = decode('gvhgr mt123 gvhgr mt')\n      expect(plainText).toEqual('testing123testing')\n    })\n\n    xit('decode all the letters', () => {\n      const cipherText = decode('gsvjf rxpyi ldmul cqfnk hlevi gsvoz abwlt')\n      expect(cipherText).toEqual('thequickbrownfoxjumpsoverthelazydog')\n    })\n  })\n})\n"
  },
  {
    "path": "exercises/practice/atbash-cipher/atbash-cipher.ts",
    "content": "export function encode(plainText: unknown): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n\nexport function decode(cipherText: unknown): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/atbash-cipher/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/atbash-cipher/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/atbash-cipher/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/atbash-cipher/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-atbash-cipher\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/atbash-cipher/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/atbash-cipher/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/bank-account/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to implement bank accounts supporting opening/closing, withdrawals, and deposits of money.\n\nAs bank accounts can be accessed in many different ways (internet, mobile phones, automatic charges), your bank software must allow accounts to be safely accessed from multiple threads/processes (terminology depends on your programming language) in parallel.\nFor example, there may be many deposits and withdrawals occurring in parallel; you need to ensure there are no [race conditions][wikipedia] between when you read the account balance and set the new balance.\n\nIt should be possible to close an account; operations against a closed account must fail.\n\n[wikipedia]: https://en.wikipedia.org/wiki/Race_condition#In_software\n"
  },
  {
    "path": "exercises/practice/bank-account/.docs/introduction.md",
    "content": "# Introduction\n\nAfter years of filling out forms and waiting, you've finally acquired your banking license.\nThis means you are now officially eligible to open your own bank, hurray!\n\nYour first priority is to get the IT systems up and running.\nAfter a day of hard work, you can already open and close accounts, as well as handle withdrawals and deposits.\n\nSince you couldn't be bothered writing tests, you invite some friends to help test the system.\nHowever, after just five minutes, one of your friends claims they've lost money!\nWhile you're confident your code is bug-free, you start looking through the logs to investigate.\n\nAh yes, just as you suspected, your friend is at fault!\nThey shared their test credentials with another friend, and together they conspired to make deposits and withdrawals from the same account _in parallel_.\nWho would do such a thing?\n\nWhile you argue that it's physically _impossible_ for someone to access their account in parallel, your friend smugly notifies you that the banking rules _require_ you to support this.\nThus, no parallel banking support, no go-live signal.\nSighing, you create a mental note to work on this tomorrow.\nThis will set your launch date back at _least_ one more day, but well...\n"
  },
  {
    "path": "exercises/practice/bank-account/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"therealowenrees\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"bank-account.ts\"\n    ],\n    \"test\": [\n      \"bank-account.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Simulate a bank account supporting opening/closing, withdraws, and deposits of money. Watch out for concurrent transactions!\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  }\n}\n"
  },
  {
    "path": "exercises/practice/bank-account/.meta/proof.ci.ts",
    "content": "export class ValueError extends Error {\n  constructor() {\n    super('Bank account error')\n  }\n}\n\nexport class BankAccount {\n  private _isOpen: boolean\n  private _balance: number\n\n  constructor() {\n    this._isOpen = false\n    this._balance = 0\n  }\n\n  open(): void {\n    if (this._isOpen) throw new ValueError()\n    this._isOpen = true\n  }\n\n  close(): void {\n    if (!this._isOpen) throw new ValueError()\n    this._isOpen = false\n    this._balance = 0\n  }\n\n  deposit(amount: number): void {\n    if (!this._isOpen || amount < 0) throw new ValueError()\n    this._balance += amount\n  }\n\n  withdraw(amount: number): void {\n    if (!this._isOpen || amount < 0 || amount > this._balance)\n      throw new ValueError()\n    this._balance -= amount\n  }\n\n  get balance(): number {\n    if (!this._isOpen) throw new ValueError()\n    return this._balance\n  }\n}\n"
  },
  {
    "path": "exercises/practice/bank-account/.meta/solutions/bank-account.ts",
    "content": "export class ValueError extends Error {\n  constructor() {\n    super('Bank account error')\n  }\n}\n\nexport class BankAccount {\n  private _isOpen: boolean\n  private _balance: number\n\n  constructor() {\n    this._isOpen = false\n    this._balance = 0\n  }\n\n  open(): void {\n    if (this._isOpen) throw new ValueError()\n    this._isOpen = true\n  }\n\n  close(): void {\n    if (!this._isOpen) throw new ValueError()\n    this._isOpen = false\n    this._balance = 0\n  }\n\n  deposit(amount: number): void {\n    if (!this._isOpen || amount < 0) throw new ValueError()\n    this._balance += amount\n  }\n\n  withdraw(amount: number): void {\n    if (!this._isOpen || amount < 0 || amount > this._balance)\n      throw new ValueError()\n    this._balance -= amount\n  }\n\n  get balance(): number {\n    if (!this._isOpen) throw new ValueError()\n    return this._balance\n  }\n}\n"
  },
  {
    "path": "exercises/practice/bank-account/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[983a1528-4ceb-45e5-8257-8ce01aceb5ed]\ndescription = \"Newly opened account has zero balance\"\n\n[e88d4ec3-c6bf-4752-8e59-5046c44e3ba7]\ndescription = \"Single deposit\"\n\n[3d9147d4-63f4-4844-8d2b-1fee2e9a2a0d]\ndescription = \"Multiple deposits\"\n\n[08f1af07-27ae-4b38-aa19-770bde558064]\ndescription = \"Withdraw once\"\n\n[6f6d242f-8c31-4ac6-8995-a90d42cad59f]\ndescription = \"Withdraw twice\"\n\n[45161c94-a094-4c77-9cec-998b70429bda]\ndescription = \"Can do multiple operations sequentially\"\n\n[f9facfaa-d824-486e-8381-48832c4bbffd]\ndescription = \"Cannot check balance of closed account\"\n\n[7a65ba52-e35c-4fd2-8159-bda2bde6e59c]\ndescription = \"Cannot deposit into closed account\"\n\n[a0a1835d-faae-4ad4-a6f3-1fcc2121380b]\ndescription = \"Cannot deposit into unopened account\"\n\n[570dfaa5-0532-4c1f-a7d3-0f65c3265608]\ndescription = \"Cannot withdraw from closed account\"\n\n[c396d233-1c49-4272-98dc-7f502dbb9470]\ndescription = \"Cannot close an account that was not opened\"\n\n[c06f534f-bdc2-4a02-a388-1063400684de]\ndescription = \"Cannot open an already opened account\"\n\n[0722d404-6116-4f92-ba3b-da7f88f1669c]\ndescription = \"Reopened account does not retain balance\"\n\n[ec42245f-9361-4341-8231-a22e8d19c52f]\ndescription = \"Cannot withdraw more than deposited\"\n\n[4f381ef8-10ef-4507-8e1d-0631ecc8ee72]\ndescription = \"Cannot withdraw negative\"\n\n[d45df9ea-1db0-47f3-b18c-d365db49d938]\ndescription = \"Cannot deposit negative\"\n\n[ba0c1e0b-0f00-416f-8097-a7dfc97871ff]\ndescription = \"Can handle concurrent transactions\"\n"
  },
  {
    "path": "exercises/practice/bank-account/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/bank-account/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/bank-account/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/bank-account/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/bank-account/bank-account.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { BankAccount, ValueError } from './bank-account.ts'\n\ndescribe('Bank Account', () => {\n  it('newly opened account has zero balance', () => {\n    const account = new BankAccount()\n    account.open()\n    expect(account.balance).toEqual(0)\n  })\n\n  xit('can deposit money', () => {\n    const account = new BankAccount()\n    account.open()\n    account.deposit(100)\n    expect(account.balance).toEqual(100)\n  })\n\n  xit('can deposit money sequentially', () => {\n    const account = new BankAccount()\n    account.open()\n    account.deposit(100)\n    account.deposit(50)\n    expect(account.balance).toEqual(150)\n  })\n\n  xit('can withdraw money', () => {\n    const account = new BankAccount()\n    account.open()\n    account.deposit(100)\n    account.withdraw(50)\n    expect(account.balance).toEqual(50)\n  })\n\n  xit('can withdraw money sequentially', () => {\n    const account = new BankAccount()\n    account.open()\n    account.deposit(100)\n    account.withdraw(20)\n    account.withdraw(80)\n    expect(account.balance).toEqual(0)\n  })\n\n  xit('checking balance of closed account throws error', () => {\n    const account = new BankAccount()\n    account.open()\n    account.close()\n    expect(() => account.balance).toThrow(ValueError)\n  })\n\n  xit('deposit into closed account throws error', () => {\n    const account = new BankAccount()\n    account.open()\n    account.close()\n    expect(() => {\n      account.deposit(50)\n    }).toThrow(ValueError)\n  })\n\n  xit('withdraw from closed account throws error', () => {\n    const account = new BankAccount()\n    account.open()\n    account.close()\n    expect(() => {\n      account.withdraw(50)\n    }).toThrow(ValueError)\n  })\n\n  xit('close already closed account throws error', () => {\n    const account = new BankAccount()\n    expect(() => {\n      account.close()\n    }).toThrow(ValueError)\n  })\n\n  xit('open already opened account throws error', () => {\n    const account = new BankAccount()\n    account.open()\n    expect(() => {\n      account.open()\n    }).toThrow(ValueError)\n  })\n\n  xit('reopened account does not retain balance', () => {\n    const account = new BankAccount()\n    account.open()\n    account.deposit(50)\n    account.close()\n    account.open()\n    expect(account.balance).toEqual(0)\n  })\n\n  xit('cannot withdraw more than deposited', () => {\n    const account = new BankAccount()\n    account.open()\n    account.deposit(25)\n    expect(() => {\n      account.withdraw(50)\n    }).toThrow(ValueError)\n  })\n\n  xit('cannot withdraw negative amount', () => {\n    const account = new BankAccount()\n    account.open()\n    account.deposit(100)\n    expect(() => {\n      account.withdraw(-50)\n    }).toThrow(ValueError)\n  })\n\n  xit('cannot deposit negative amount', () => {\n    const account = new BankAccount()\n    account.open()\n    expect(() => {\n      account.deposit(-50)\n    }).toThrow(ValueError)\n  })\n\n  xit('changing balance directly throws error', () => {\n    const account = new BankAccount()\n    account.open()\n    expect(() => {\n      // @ts-expect-error This is supposed to be a read-only property\n      account.balance = 100\n    }).toThrow(Error)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/bank-account/bank-account.ts",
    "content": "//\n// This is only a SKELETON file for the 'Bank Account' exercise. It's been provided as a\n// convenience to get you started writing code faster.\n//\n\nexport class ValueError extends Error {\n  constructor() {\n    super('Bank account error')\n  }\n}\n\nexport class BankAccount {\n  constructor() {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  open(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  close(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  deposit(_argument: unknown): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  withdraw(_argument: unknown): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  get balance(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/bank-account/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/bank-account/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/bank-account/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-bank-account\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/bank-account/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/bank-account/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/beer-song/.docs/instructions.md",
    "content": "# Instructions\n\nRecite the lyrics to that beloved classic, that field-trip favorite: 99 Bottles of Beer on the Wall.\n\nNote that not all verses are identical.\n\n```text\n99 bottles of beer on the wall, 99 bottles of beer.\nTake one down and pass it around, 98 bottles of beer on the wall.\n\n98 bottles of beer on the wall, 98 bottles of beer.\nTake one down and pass it around, 97 bottles of beer on the wall.\n\n97 bottles of beer on the wall, 97 bottles of beer.\nTake one down and pass it around, 96 bottles of beer on the wall.\n\n96 bottles of beer on the wall, 96 bottles of beer.\nTake one down and pass it around, 95 bottles of beer on the wall.\n\n95 bottles of beer on the wall, 95 bottles of beer.\nTake one down and pass it around, 94 bottles of beer on the wall.\n\n94 bottles of beer on the wall, 94 bottles of beer.\nTake one down and pass it around, 93 bottles of beer on the wall.\n\n93 bottles of beer on the wall, 93 bottles of beer.\nTake one down and pass it around, 92 bottles of beer on the wall.\n\n92 bottles of beer on the wall, 92 bottles of beer.\nTake one down and pass it around, 91 bottles of beer on the wall.\n\n91 bottles of beer on the wall, 91 bottles of beer.\nTake one down and pass it around, 90 bottles of beer on the wall.\n\n90 bottles of beer on the wall, 90 bottles of beer.\nTake one down and pass it around, 89 bottles of beer on the wall.\n\n89 bottles of beer on the wall, 89 bottles of beer.\nTake one down and pass it around, 88 bottles of beer on the wall.\n\n88 bottles of beer on the wall, 88 bottles of beer.\nTake one down and pass it around, 87 bottles of beer on the wall.\n\n87 bottles of beer on the wall, 87 bottles of beer.\nTake one down and pass it around, 86 bottles of beer on the wall.\n\n86 bottles of beer on the wall, 86 bottles of beer.\nTake one down and pass it around, 85 bottles of beer on the wall.\n\n85 bottles of beer on the wall, 85 bottles of beer.\nTake one down and pass it around, 84 bottles of beer on the wall.\n\n84 bottles of beer on the wall, 84 bottles of beer.\nTake one down and pass it around, 83 bottles of beer on the wall.\n\n83 bottles of beer on the wall, 83 bottles of beer.\nTake one down and pass it around, 82 bottles of beer on the wall.\n\n82 bottles of beer on the wall, 82 bottles of beer.\nTake one down and pass it around, 81 bottles of beer on the wall.\n\n81 bottles of beer on the wall, 81 bottles of beer.\nTake one down and pass it around, 80 bottles of beer on the wall.\n\n80 bottles of beer on the wall, 80 bottles of beer.\nTake one down and pass it around, 79 bottles of beer on the wall.\n\n79 bottles of beer on the wall, 79 bottles of beer.\nTake one down and pass it around, 78 bottles of beer on the wall.\n\n78 bottles of beer on the wall, 78 bottles of beer.\nTake one down and pass it around, 77 bottles of beer on the wall.\n\n77 bottles of beer on the wall, 77 bottles of beer.\nTake one down and pass it around, 76 bottles of beer on the wall.\n\n76 bottles of beer on the wall, 76 bottles of beer.\nTake one down and pass it around, 75 bottles of beer on the wall.\n\n75 bottles of beer on the wall, 75 bottles of beer.\nTake one down and pass it around, 74 bottles of beer on the wall.\n\n74 bottles of beer on the wall, 74 bottles of beer.\nTake one down and pass it around, 73 bottles of beer on the wall.\n\n73 bottles of beer on the wall, 73 bottles of beer.\nTake one down and pass it around, 72 bottles of beer on the wall.\n\n72 bottles of beer on the wall, 72 bottles of beer.\nTake one down and pass it around, 71 bottles of beer on the wall.\n\n71 bottles of beer on the wall, 71 bottles of beer.\nTake one down and pass it around, 70 bottles of beer on the wall.\n\n70 bottles of beer on the wall, 70 bottles of beer.\nTake one down and pass it around, 69 bottles of beer on the wall.\n\n69 bottles of beer on the wall, 69 bottles of beer.\nTake one down and pass it around, 68 bottles of beer on the wall.\n\n68 bottles of beer on the wall, 68 bottles of beer.\nTake one down and pass it around, 67 bottles of beer on the wall.\n\n67 bottles of beer on the wall, 67 bottles of beer.\nTake one down and pass it around, 66 bottles of beer on the wall.\n\n66 bottles of beer on the wall, 66 bottles of beer.\nTake one down and pass it around, 65 bottles of beer on the wall.\n\n65 bottles of beer on the wall, 65 bottles of beer.\nTake one down and pass it around, 64 bottles of beer on the wall.\n\n64 bottles of beer on the wall, 64 bottles of beer.\nTake one down and pass it around, 63 bottles of beer on the wall.\n\n63 bottles of beer on the wall, 63 bottles of beer.\nTake one down and pass it around, 62 bottles of beer on the wall.\n\n62 bottles of beer on the wall, 62 bottles of beer.\nTake one down and pass it around, 61 bottles of beer on the wall.\n\n61 bottles of beer on the wall, 61 bottles of beer.\nTake one down and pass it around, 60 bottles of beer on the wall.\n\n60 bottles of beer on the wall, 60 bottles of beer.\nTake one down and pass it around, 59 bottles of beer on the wall.\n\n59 bottles of beer on the wall, 59 bottles of beer.\nTake one down and pass it around, 58 bottles of beer on the wall.\n\n58 bottles of beer on the wall, 58 bottles of beer.\nTake one down and pass it around, 57 bottles of beer on the wall.\n\n57 bottles of beer on the wall, 57 bottles of beer.\nTake one down and pass it around, 56 bottles of beer on the wall.\n\n56 bottles of beer on the wall, 56 bottles of beer.\nTake one down and pass it around, 55 bottles of beer on the wall.\n\n55 bottles of beer on the wall, 55 bottles of beer.\nTake one down and pass it around, 54 bottles of beer on the wall.\n\n54 bottles of beer on the wall, 54 bottles of beer.\nTake one down and pass it around, 53 bottles of beer on the wall.\n\n53 bottles of beer on the wall, 53 bottles of beer.\nTake one down and pass it around, 52 bottles of beer on the wall.\n\n52 bottles of beer on the wall, 52 bottles of beer.\nTake one down and pass it around, 51 bottles of beer on the wall.\n\n51 bottles of beer on the wall, 51 bottles of beer.\nTake one down and pass it around, 50 bottles of beer on the wall.\n\n50 bottles of beer on the wall, 50 bottles of beer.\nTake one down and pass it around, 49 bottles of beer on the wall.\n\n49 bottles of beer on the wall, 49 bottles of beer.\nTake one down and pass it around, 48 bottles of beer on the wall.\n\n48 bottles of beer on the wall, 48 bottles of beer.\nTake one down and pass it around, 47 bottles of beer on the wall.\n\n47 bottles of beer on the wall, 47 bottles of beer.\nTake one down and pass it around, 46 bottles of beer on the wall.\n\n46 bottles of beer on the wall, 46 bottles of beer.\nTake one down and pass it around, 45 bottles of beer on the wall.\n\n45 bottles of beer on the wall, 45 bottles of beer.\nTake one down and pass it around, 44 bottles of beer on the wall.\n\n44 bottles of beer on the wall, 44 bottles of beer.\nTake one down and pass it around, 43 bottles of beer on the wall.\n\n43 bottles of beer on the wall, 43 bottles of beer.\nTake one down and pass it around, 42 bottles of beer on the wall.\n\n42 bottles of beer on the wall, 42 bottles of beer.\nTake one down and pass it around, 41 bottles of beer on the wall.\n\n41 bottles of beer on the wall, 41 bottles of beer.\nTake one down and pass it around, 40 bottles of beer on the wall.\n\n40 bottles of beer on the wall, 40 bottles of beer.\nTake one down and pass it around, 39 bottles of beer on the wall.\n\n39 bottles of beer on the wall, 39 bottles of beer.\nTake one down and pass it around, 38 bottles of beer on the wall.\n\n38 bottles of beer on the wall, 38 bottles of beer.\nTake one down and pass it around, 37 bottles of beer on the wall.\n\n37 bottles of beer on the wall, 37 bottles of beer.\nTake one down and pass it around, 36 bottles of beer on the wall.\n\n36 bottles of beer on the wall, 36 bottles of beer.\nTake one down and pass it around, 35 bottles of beer on the wall.\n\n35 bottles of beer on the wall, 35 bottles of beer.\nTake one down and pass it around, 34 bottles of beer on the wall.\n\n34 bottles of beer on the wall, 34 bottles of beer.\nTake one down and pass it around, 33 bottles of beer on the wall.\n\n33 bottles of beer on the wall, 33 bottles of beer.\nTake one down and pass it around, 32 bottles of beer on the wall.\n\n32 bottles of beer on the wall, 32 bottles of beer.\nTake one down and pass it around, 31 bottles of beer on the wall.\n\n31 bottles of beer on the wall, 31 bottles of beer.\nTake one down and pass it around, 30 bottles of beer on the wall.\n\n30 bottles of beer on the wall, 30 bottles of beer.\nTake one down and pass it around, 29 bottles of beer on the wall.\n\n29 bottles of beer on the wall, 29 bottles of beer.\nTake one down and pass it around, 28 bottles of beer on the wall.\n\n28 bottles of beer on the wall, 28 bottles of beer.\nTake one down and pass it around, 27 bottles of beer on the wall.\n\n27 bottles of beer on the wall, 27 bottles of beer.\nTake one down and pass it around, 26 bottles of beer on the wall.\n\n26 bottles of beer on the wall, 26 bottles of beer.\nTake one down and pass it around, 25 bottles of beer on the wall.\n\n25 bottles of beer on the wall, 25 bottles of beer.\nTake one down and pass it around, 24 bottles of beer on the wall.\n\n24 bottles of beer on the wall, 24 bottles of beer.\nTake one down and pass it around, 23 bottles of beer on the wall.\n\n23 bottles of beer on the wall, 23 bottles of beer.\nTake one down and pass it around, 22 bottles of beer on the wall.\n\n22 bottles of beer on the wall, 22 bottles of beer.\nTake one down and pass it around, 21 bottles of beer on the wall.\n\n21 bottles of beer on the wall, 21 bottles of beer.\nTake one down and pass it around, 20 bottles of beer on the wall.\n\n20 bottles of beer on the wall, 20 bottles of beer.\nTake one down and pass it around, 19 bottles of beer on the wall.\n\n19 bottles of beer on the wall, 19 bottles of beer.\nTake one down and pass it around, 18 bottles of beer on the wall.\n\n18 bottles of beer on the wall, 18 bottles of beer.\nTake one down and pass it around, 17 bottles of beer on the wall.\n\n17 bottles of beer on the wall, 17 bottles of beer.\nTake one down and pass it around, 16 bottles of beer on the wall.\n\n16 bottles of beer on the wall, 16 bottles of beer.\nTake one down and pass it around, 15 bottles of beer on the wall.\n\n15 bottles of beer on the wall, 15 bottles of beer.\nTake one down and pass it around, 14 bottles of beer on the wall.\n\n14 bottles of beer on the wall, 14 bottles of beer.\nTake one down and pass it around, 13 bottles of beer on the wall.\n\n13 bottles of beer on the wall, 13 bottles of beer.\nTake one down and pass it around, 12 bottles of beer on the wall.\n\n12 bottles of beer on the wall, 12 bottles of beer.\nTake one down and pass it around, 11 bottles of beer on the wall.\n\n11 bottles of beer on the wall, 11 bottles of beer.\nTake one down and pass it around, 10 bottles of beer on the wall.\n\n10 bottles of beer on the wall, 10 bottles of beer.\nTake one down and pass it around, 9 bottles of beer on the wall.\n\n9 bottles of beer on the wall, 9 bottles of beer.\nTake one down and pass it around, 8 bottles of beer on the wall.\n\n8 bottles of beer on the wall, 8 bottles of beer.\nTake one down and pass it around, 7 bottles of beer on the wall.\n\n7 bottles of beer on the wall, 7 bottles of beer.\nTake one down and pass it around, 6 bottles of beer on the wall.\n\n6 bottles of beer on the wall, 6 bottles of beer.\nTake one down and pass it around, 5 bottles of beer on the wall.\n\n5 bottles of beer on the wall, 5 bottles of beer.\nTake one down and pass it around, 4 bottles of beer on the wall.\n\n4 bottles of beer on the wall, 4 bottles of beer.\nTake one down and pass it around, 3 bottles of beer on the wall.\n\n3 bottles of beer on the wall, 3 bottles of beer.\nTake one down and pass it around, 2 bottles of beer on the wall.\n\n2 bottles of beer on the wall, 2 bottles of beer.\nTake one down and pass it around, 1 bottle of beer on the wall.\n\n1 bottle of beer on the wall, 1 bottle of beer.\nTake it down and pass it around, no more bottles of beer on the wall.\n\nNo more bottles of beer on the wall, no more bottles of beer.\nGo to the store and buy some more, 99 bottles of beer on the wall.\n```\n"
  },
  {
    "path": "exercises/practice/beer-song/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"masters3d\"\n  ],\n  \"contributors\": [\n    \"lukaszklis\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"beer-song.ts\"\n    ],\n    \"test\": [\n      \"beer-song.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Produce the lyrics to that beloved classic, that field-trip favorite: 99 Bottles of Beer on the Wall.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Learn to Program by Chris Pine\",\n  \"source_url\": \"https://pine.fm/LearnToProgram/?Chapter=06\"\n}\n"
  },
  {
    "path": "exercises/practice/beer-song/.meta/proof.ci.ts",
    "content": "function pluralize(input: number): string {\n  if (input === 0) {\n    return 'o more bottles '\n  }\n\n  return input === 1 ? '1 bottle ' : `${input} bottles `\n}\n\nexport function verse(input: number): string {\n  const wall = 'of beer on the wall'\n  if (input === 0) {\n    return `N${pluralize(0)}${wall}, n${pluralize(0)}of beer.\nGo to the store and buy some more, ${pluralize(99)}${wall}.\n`\n  }\n  if (input === 1) {\n    return `${pluralize(1)}${wall}, ${pluralize(1)}of beer.\nTake it down and pass it around, n${pluralize(0)}${wall}.\n`\n  }\n  return `${pluralize(input)}${wall}, ${pluralize(input)}of beer.\nTake one down and pass it around, ${pluralize(input - 1)}${wall}.\n`\n}\n\nexport function sing(end: number = 99, start: number = 0): string {\n  let temp = ``\n  for (let i: number = end; i >= start; i -= 1) {\n    temp += verse(i)\n    if (i !== start) {\n      temp += '\\n'\n    }\n  }\n  return temp\n}\n"
  },
  {
    "path": "exercises/practice/beer-song/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[5a02fd08-d336-4607-8006-246fe6fa9fb0]\ndescription = \"first generic verse\"\n\n[77299ca6-545e-4217-a9cc-606b342e0187]\ndescription = \"last generic verse\"\n\n[102cbca0-b197-40fd-b548-e99609b06428]\ndescription = \"verse with 2 bottles\"\n\n[b8ef9fce-960e-4d85-a0c9-980a04ec1972]\ndescription = \"verse with 1 bottle\"\n\n[c59d4076-f671-4ee3-baaa-d4966801f90d]\ndescription = \"verse with 0 bottles\"\n\n[7e17c794-402d-4ca6-8f96-4d8f6ee1ec7e]\ndescription = \"first two verses\"\n\n[949868e7-67e8-43d3-9bb4-69277fe020fb]\ndescription = \"last three verses\"\n\n[bc220626-126c-4e72-8df4-fddfc0c3e458]\ndescription = \"all verses\"\n"
  },
  {
    "path": "exercises/practice/beer-song/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/beer-song/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/beer-song/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/beer-song/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/beer-song/beer-song.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { verse, sing } from './beer-song.ts'\n\ndescribe('Beer', () => {\n  it('prints an arbitrary verse', () => {\n    const expected = `8 bottles of beer on the wall, 8 bottles of beer.\nTake one down and pass it around, 7 bottles of beer on the wall.\n`\n\n    expect(verse(8)).toEqual(expected)\n  })\n\n  xit('handles 1 bottle', () => {\n    const expected = `1 bottle of beer on the wall, 1 bottle of beer.\nTake it down and pass it around, no more bottles of beer on the wall.\n`\n    expect(verse(1)).toEqual(expected)\n  })\n\n  xit('handles 0 bottles', () => {\n    const expected = `No more bottles of beer on the wall, no more bottles of beer.\nGo to the store and buy some more, 99 bottles of beer on the wall.\n`\n    expect(verse(0)).toEqual(expected)\n  })\n\n  xit('sings several verses', () => {\n    const expected = `8 bottles of beer on the wall, 8 bottles of beer.\nTake one down and pass it around, 7 bottles of beer on the wall.\n\n7 bottles of beer on the wall, 7 bottles of beer.\nTake one down and pass it around, 6 bottles of beer on the wall.\n\n6 bottles of beer on the wall, 6 bottles of beer.\nTake one down and pass it around, 5 bottles of beer on the wall.\n`\n    expect(sing(8, 6)).toEqual(expected)\n  })\n\n  xit('sings the rest of the verses', () => {\n    const expected = `3 bottles of beer on the wall, 3 bottles of beer.\nTake one down and pass it around, 2 bottles of beer on the wall.\n\n2 bottles of beer on the wall, 2 bottles of beer.\nTake one down and pass it around, 1 bottle of beer on the wall.\n\n1 bottle of beer on the wall, 1 bottle of beer.\nTake it down and pass it around, no more bottles of beer on the wall.\n\nNo more bottles of beer on the wall, no more bottles of beer.\nGo to the store and buy some more, 99 bottles of beer on the wall.\n`\n    expect(sing(3)).toEqual(expected)\n  })\n\n  xit('sings all the verses', () => {\n    const song = sing()\n    expect(song).toEqual(`99 bottles of beer on the wall, 99 bottles of beer.\nTake one down and pass it around, 98 bottles of beer on the wall.\n\n98 bottles of beer on the wall, 98 bottles of beer.\nTake one down and pass it around, 97 bottles of beer on the wall.\n\n97 bottles of beer on the wall, 97 bottles of beer.\nTake one down and pass it around, 96 bottles of beer on the wall.\n\n96 bottles of beer on the wall, 96 bottles of beer.\nTake one down and pass it around, 95 bottles of beer on the wall.\n\n95 bottles of beer on the wall, 95 bottles of beer.\nTake one down and pass it around, 94 bottles of beer on the wall.\n\n94 bottles of beer on the wall, 94 bottles of beer.\nTake one down and pass it around, 93 bottles of beer on the wall.\n\n93 bottles of beer on the wall, 93 bottles of beer.\nTake one down and pass it around, 92 bottles of beer on the wall.\n\n92 bottles of beer on the wall, 92 bottles of beer.\nTake one down and pass it around, 91 bottles of beer on the wall.\n\n91 bottles of beer on the wall, 91 bottles of beer.\nTake one down and pass it around, 90 bottles of beer on the wall.\n\n90 bottles of beer on the wall, 90 bottles of beer.\nTake one down and pass it around, 89 bottles of beer on the wall.\n\n89 bottles of beer on the wall, 89 bottles of beer.\nTake one down and pass it around, 88 bottles of beer on the wall.\n\n88 bottles of beer on the wall, 88 bottles of beer.\nTake one down and pass it around, 87 bottles of beer on the wall.\n\n87 bottles of beer on the wall, 87 bottles of beer.\nTake one down and pass it around, 86 bottles of beer on the wall.\n\n86 bottles of beer on the wall, 86 bottles of beer.\nTake one down and pass it around, 85 bottles of beer on the wall.\n\n85 bottles of beer on the wall, 85 bottles of beer.\nTake one down and pass it around, 84 bottles of beer on the wall.\n\n84 bottles of beer on the wall, 84 bottles of beer.\nTake one down and pass it around, 83 bottles of beer on the wall.\n\n83 bottles of beer on the wall, 83 bottles of beer.\nTake one down and pass it around, 82 bottles of beer on the wall.\n\n82 bottles of beer on the wall, 82 bottles of beer.\nTake one down and pass it around, 81 bottles of beer on the wall.\n\n81 bottles of beer on the wall, 81 bottles of beer.\nTake one down and pass it around, 80 bottles of beer on the wall.\n\n80 bottles of beer on the wall, 80 bottles of beer.\nTake one down and pass it around, 79 bottles of beer on the wall.\n\n79 bottles of beer on the wall, 79 bottles of beer.\nTake one down and pass it around, 78 bottles of beer on the wall.\n\n78 bottles of beer on the wall, 78 bottles of beer.\nTake one down and pass it around, 77 bottles of beer on the wall.\n\n77 bottles of beer on the wall, 77 bottles of beer.\nTake one down and pass it around, 76 bottles of beer on the wall.\n\n76 bottles of beer on the wall, 76 bottles of beer.\nTake one down and pass it around, 75 bottles of beer on the wall.\n\n75 bottles of beer on the wall, 75 bottles of beer.\nTake one down and pass it around, 74 bottles of beer on the wall.\n\n74 bottles of beer on the wall, 74 bottles of beer.\nTake one down and pass it around, 73 bottles of beer on the wall.\n\n73 bottles of beer on the wall, 73 bottles of beer.\nTake one down and pass it around, 72 bottles of beer on the wall.\n\n72 bottles of beer on the wall, 72 bottles of beer.\nTake one down and pass it around, 71 bottles of beer on the wall.\n\n71 bottles of beer on the wall, 71 bottles of beer.\nTake one down and pass it around, 70 bottles of beer on the wall.\n\n70 bottles of beer on the wall, 70 bottles of beer.\nTake one down and pass it around, 69 bottles of beer on the wall.\n\n69 bottles of beer on the wall, 69 bottles of beer.\nTake one down and pass it around, 68 bottles of beer on the wall.\n\n68 bottles of beer on the wall, 68 bottles of beer.\nTake one down and pass it around, 67 bottles of beer on the wall.\n\n67 bottles of beer on the wall, 67 bottles of beer.\nTake one down and pass it around, 66 bottles of beer on the wall.\n\n66 bottles of beer on the wall, 66 bottles of beer.\nTake one down and pass it around, 65 bottles of beer on the wall.\n\n65 bottles of beer on the wall, 65 bottles of beer.\nTake one down and pass it around, 64 bottles of beer on the wall.\n\n64 bottles of beer on the wall, 64 bottles of beer.\nTake one down and pass it around, 63 bottles of beer on the wall.\n\n63 bottles of beer on the wall, 63 bottles of beer.\nTake one down and pass it around, 62 bottles of beer on the wall.\n\n62 bottles of beer on the wall, 62 bottles of beer.\nTake one down and pass it around, 61 bottles of beer on the wall.\n\n61 bottles of beer on the wall, 61 bottles of beer.\nTake one down and pass it around, 60 bottles of beer on the wall.\n\n60 bottles of beer on the wall, 60 bottles of beer.\nTake one down and pass it around, 59 bottles of beer on the wall.\n\n59 bottles of beer on the wall, 59 bottles of beer.\nTake one down and pass it around, 58 bottles of beer on the wall.\n\n58 bottles of beer on the wall, 58 bottles of beer.\nTake one down and pass it around, 57 bottles of beer on the wall.\n\n57 bottles of beer on the wall, 57 bottles of beer.\nTake one down and pass it around, 56 bottles of beer on the wall.\n\n56 bottles of beer on the wall, 56 bottles of beer.\nTake one down and pass it around, 55 bottles of beer on the wall.\n\n55 bottles of beer on the wall, 55 bottles of beer.\nTake one down and pass it around, 54 bottles of beer on the wall.\n\n54 bottles of beer on the wall, 54 bottles of beer.\nTake one down and pass it around, 53 bottles of beer on the wall.\n\n53 bottles of beer on the wall, 53 bottles of beer.\nTake one down and pass it around, 52 bottles of beer on the wall.\n\n52 bottles of beer on the wall, 52 bottles of beer.\nTake one down and pass it around, 51 bottles of beer on the wall.\n\n51 bottles of beer on the wall, 51 bottles of beer.\nTake one down and pass it around, 50 bottles of beer on the wall.\n\n50 bottles of beer on the wall, 50 bottles of beer.\nTake one down and pass it around, 49 bottles of beer on the wall.\n\n49 bottles of beer on the wall, 49 bottles of beer.\nTake one down and pass it around, 48 bottles of beer on the wall.\n\n48 bottles of beer on the wall, 48 bottles of beer.\nTake one down and pass it around, 47 bottles of beer on the wall.\n\n47 bottles of beer on the wall, 47 bottles of beer.\nTake one down and pass it around, 46 bottles of beer on the wall.\n\n46 bottles of beer on the wall, 46 bottles of beer.\nTake one down and pass it around, 45 bottles of beer on the wall.\n\n45 bottles of beer on the wall, 45 bottles of beer.\nTake one down and pass it around, 44 bottles of beer on the wall.\n\n44 bottles of beer on the wall, 44 bottles of beer.\nTake one down and pass it around, 43 bottles of beer on the wall.\n\n43 bottles of beer on the wall, 43 bottles of beer.\nTake one down and pass it around, 42 bottles of beer on the wall.\n\n42 bottles of beer on the wall, 42 bottles of beer.\nTake one down and pass it around, 41 bottles of beer on the wall.\n\n41 bottles of beer on the wall, 41 bottles of beer.\nTake one down and pass it around, 40 bottles of beer on the wall.\n\n40 bottles of beer on the wall, 40 bottles of beer.\nTake one down and pass it around, 39 bottles of beer on the wall.\n\n39 bottles of beer on the wall, 39 bottles of beer.\nTake one down and pass it around, 38 bottles of beer on the wall.\n\n38 bottles of beer on the wall, 38 bottles of beer.\nTake one down and pass it around, 37 bottles of beer on the wall.\n\n37 bottles of beer on the wall, 37 bottles of beer.\nTake one down and pass it around, 36 bottles of beer on the wall.\n\n36 bottles of beer on the wall, 36 bottles of beer.\nTake one down and pass it around, 35 bottles of beer on the wall.\n\n35 bottles of beer on the wall, 35 bottles of beer.\nTake one down and pass it around, 34 bottles of beer on the wall.\n\n34 bottles of beer on the wall, 34 bottles of beer.\nTake one down and pass it around, 33 bottles of beer on the wall.\n\n33 bottles of beer on the wall, 33 bottles of beer.\nTake one down and pass it around, 32 bottles of beer on the wall.\n\n32 bottles of beer on the wall, 32 bottles of beer.\nTake one down and pass it around, 31 bottles of beer on the wall.\n\n31 bottles of beer on the wall, 31 bottles of beer.\nTake one down and pass it around, 30 bottles of beer on the wall.\n\n30 bottles of beer on the wall, 30 bottles of beer.\nTake one down and pass it around, 29 bottles of beer on the wall.\n\n29 bottles of beer on the wall, 29 bottles of beer.\nTake one down and pass it around, 28 bottles of beer on the wall.\n\n28 bottles of beer on the wall, 28 bottles of beer.\nTake one down and pass it around, 27 bottles of beer on the wall.\n\n27 bottles of beer on the wall, 27 bottles of beer.\nTake one down and pass it around, 26 bottles of beer on the wall.\n\n26 bottles of beer on the wall, 26 bottles of beer.\nTake one down and pass it around, 25 bottles of beer on the wall.\n\n25 bottles of beer on the wall, 25 bottles of beer.\nTake one down and pass it around, 24 bottles of beer on the wall.\n\n24 bottles of beer on the wall, 24 bottles of beer.\nTake one down and pass it around, 23 bottles of beer on the wall.\n\n23 bottles of beer on the wall, 23 bottles of beer.\nTake one down and pass it around, 22 bottles of beer on the wall.\n\n22 bottles of beer on the wall, 22 bottles of beer.\nTake one down and pass it around, 21 bottles of beer on the wall.\n\n21 bottles of beer on the wall, 21 bottles of beer.\nTake one down and pass it around, 20 bottles of beer on the wall.\n\n20 bottles of beer on the wall, 20 bottles of beer.\nTake one down and pass it around, 19 bottles of beer on the wall.\n\n19 bottles of beer on the wall, 19 bottles of beer.\nTake one down and pass it around, 18 bottles of beer on the wall.\n\n18 bottles of beer on the wall, 18 bottles of beer.\nTake one down and pass it around, 17 bottles of beer on the wall.\n\n17 bottles of beer on the wall, 17 bottles of beer.\nTake one down and pass it around, 16 bottles of beer on the wall.\n\n16 bottles of beer on the wall, 16 bottles of beer.\nTake one down and pass it around, 15 bottles of beer on the wall.\n\n15 bottles of beer on the wall, 15 bottles of beer.\nTake one down and pass it around, 14 bottles of beer on the wall.\n\n14 bottles of beer on the wall, 14 bottles of beer.\nTake one down and pass it around, 13 bottles of beer on the wall.\n\n13 bottles of beer on the wall, 13 bottles of beer.\nTake one down and pass it around, 12 bottles of beer on the wall.\n\n12 bottles of beer on the wall, 12 bottles of beer.\nTake one down and pass it around, 11 bottles of beer on the wall.\n\n11 bottles of beer on the wall, 11 bottles of beer.\nTake one down and pass it around, 10 bottles of beer on the wall.\n\n10 bottles of beer on the wall, 10 bottles of beer.\nTake one down and pass it around, 9 bottles of beer on the wall.\n\n9 bottles of beer on the wall, 9 bottles of beer.\nTake one down and pass it around, 8 bottles of beer on the wall.\n\n8 bottles of beer on the wall, 8 bottles of beer.\nTake one down and pass it around, 7 bottles of beer on the wall.\n\n7 bottles of beer on the wall, 7 bottles of beer.\nTake one down and pass it around, 6 bottles of beer on the wall.\n\n6 bottles of beer on the wall, 6 bottles of beer.\nTake one down and pass it around, 5 bottles of beer on the wall.\n\n5 bottles of beer on the wall, 5 bottles of beer.\nTake one down and pass it around, 4 bottles of beer on the wall.\n\n4 bottles of beer on the wall, 4 bottles of beer.\nTake one down and pass it around, 3 bottles of beer on the wall.\n\n3 bottles of beer on the wall, 3 bottles of beer.\nTake one down and pass it around, 2 bottles of beer on the wall.\n\n2 bottles of beer on the wall, 2 bottles of beer.\nTake one down and pass it around, 1 bottle of beer on the wall.\n\n1 bottle of beer on the wall, 1 bottle of beer.\nTake it down and pass it around, no more bottles of beer on the wall.\n\nNo more bottles of beer on the wall, no more bottles of beer.\nGo to the store and buy some more, 99 bottles of beer on the wall.\n`)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/beer-song/beer-song.ts",
    "content": "export function verse(index: unknown): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n\nexport function sing(\n  initialBottlesCount?: unknown,\n  takeDownCount?: unknown\n): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/beer-song/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/beer-song/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/beer-song/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-beer-song\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/beer-song/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/beer-song/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/binary-search/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to implement a binary search algorithm.\n\nA binary search algorithm finds an item in a list by repeatedly splitting it in half, only keeping the half which contains the item we're looking for.\nIt allows us to quickly narrow down the possible locations of our item until we find it, or until we've eliminated all possible locations.\n\n~~~~exercism/caution\nBinary search only works when a list has been sorted.\n~~~~\n\nThe algorithm looks like this:\n\n- Find the middle element of a _sorted_ list and compare it with the item we're looking for.\n- If the middle element is our item, then we're done!\n- If the middle element is greater than our item, we can eliminate that element and all the elements **after** it.\n- If the middle element is less than our item, we can eliminate that element and all the elements **before** it.\n- If every element of the list has been eliminated then the item is not in the list.\n- Otherwise, repeat the process on the part of the list that has not been eliminated.\n\nHere's an example:\n\nLet's say we're looking for the number 23 in the following sorted list: `[4, 8, 12, 16, 23, 28, 32]`.\n\n- We start by comparing 23 with the middle element, 16.\n- Since 23 is greater than 16, we can eliminate the left half of the list, leaving us with `[23, 28, 32]`.\n- We then compare 23 with the new middle element, 28.\n- Since 23 is less than 28, we can eliminate the right half of the list: `[23]`.\n- We've found our item.\n"
  },
  {
    "path": "exercises/practice/binary-search/.docs/introduction.md",
    "content": "# Introduction\n\nYou have stumbled upon a group of mathematicians who are also singer-songwriters.\nThey have written a song for each of their favorite numbers, and, as you can imagine, they have a lot of favorite numbers (like [0][zero] or [73][seventy-three] or [6174][kaprekars-constant]).\n\nYou are curious to hear the song for your favorite number, but with so many songs to wade through, finding the right song could take a while.\nFortunately, they have organized their songs in a playlist sorted by the title — which is simply the number that the song is about.\n\nYou realize that you can use a binary search algorithm to quickly find a song given the title.\n\n[zero]: https://en.wikipedia.org/wiki/0\n[seventy-three]: https://en.wikipedia.org/wiki/73_(number)\n[kaprekars-constant]: https://en.wikipedia.org/wiki/6174_(number)\n"
  },
  {
    "path": "exercises/practice/binary-search/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"anuragsoni\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"binary-search.ts\"\n    ],\n    \"test\": [\n      \"binary-search.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Implement a binary search algorithm.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Wikipedia\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/Binary_search_algorithm\"\n}\n"
  },
  {
    "path": "exercises/practice/binary-search/.meta/proof.ci.ts",
    "content": "export function find(array: number[], element: number): number | never {\n  let start = 0\n  let end = array.length - 1\n  let middle: number\n\n  while (start <= end) {\n    middle = Math.floor((start + end) / 2)\n    if (element === array[middle]) {\n      return middle\n    } else if (element < array[middle]) {\n      end = middle - 1\n    } else if (element > array[middle]) {\n      start = middle + 1\n    }\n  }\n\n  throw new Error('Value not in array')\n}\n"
  },
  {
    "path": "exercises/practice/binary-search/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[b55c24a9-a98d-4379-a08c-2adcf8ebeee8]\ndescription = \"finds a value in an array with one element\"\n\n[73469346-b0a0-4011-89bf-989e443d503d]\ndescription = \"finds a value in the middle of an array\"\n\n[327bc482-ab85-424e-a724-fb4658e66ddb]\ndescription = \"finds a value at the beginning of an array\"\n\n[f9f94b16-fe5e-472c-85ea-c513804c7d59]\ndescription = \"finds a value at the end of an array\"\n\n[f0068905-26e3-4342-856d-ad153cadb338]\ndescription = \"finds a value in an array of odd length\"\n\n[fc316b12-c8b3-4f5e-9e89-532b3389de8c]\ndescription = \"finds a value in an array of even length\"\n\n[da7db20a-354f-49f7-a6a1-650a54998aa6]\ndescription = \"identifies that a value is not included in the array\"\n\n[95d869ff-3daf-4c79-b622-6e805c675f97]\ndescription = \"a value smaller than the array's smallest value is not found\"\n\n[8b24ef45-6e51-4a94-9eac-c2bf38fdb0ba]\ndescription = \"a value larger than the array's largest value is not found\"\n\n[f439a0fa-cf42-4262-8ad1-64bf41ce566a]\ndescription = \"nothing is found in an empty array\"\n\n[2c353967-b56d-40b8-acff-ce43115eed64]\ndescription = \"nothing is found when the left and right bounds cross\"\n"
  },
  {
    "path": "exercises/practice/binary-search/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/binary-search/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/binary-search/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/binary-search/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/binary-search/binary-search.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { find } from './binary-search.ts'\n\ndescribe('Binary Search', () => {\n  it('finds a value in an array with one element', () => {\n    expect(find([6], 6)).toEqual(0)\n  })\n\n  xit('finds a value in the middle of an array', () => {\n    const array = [1, 3, 4, 6, 8, 9, 11]\n    expect(find(array, 6)).toEqual(3)\n  })\n\n  xit('finds a value at the beginning of an array', () => {\n    const array = [1, 3, 4, 6, 8, 9, 11]\n    expect(find(array, 1)).toEqual(0)\n  })\n\n  xit('finds a value at the end of an array', () => {\n    const array = [1, 3, 4, 6, 8, 9, 11]\n    expect(find(array, 11)).toEqual(6)\n  })\n\n  xit('finds a value in an array of odd length', () => {\n    const array = [1, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 634]\n    expect(find(array, 144)).toEqual(9)\n  })\n\n  xit('finds a value in an array of even length', () => {\n    const array = [1, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]\n    expect(find(array, 21)).toEqual(5)\n  })\n\n  xit('identifies that a value is not included in the array', () => {\n    const array = [1, 3, 4, 6, 8, 9, 11]\n    expect(() => find(array, 7)).toThrow(new Error('Value not in array'))\n  })\n\n  xit(\"a value smaller than the array's smallest value is not found\", () => {\n    const array = [1, 3, 4, 6, 8, 9, 11]\n    expect(() => find(array, 0)).toThrow(new Error('Value not in array'))\n  })\n\n  xit(\"a value larger than the array's largest value is not found\", () => {\n    const array = [1, 3, 4, 6, 8, 9, 11]\n    expect(() => find(array, 13)).toThrow(new Error('Value not in array'))\n  })\n\n  xit('nothing is found in an empty array', () => {\n    expect(() => find([], 1)).toThrow(new Error('Value not in array'))\n  })\n\n  xit('nothing is found when the left and right bounds cross', () => {\n    expect(() => find([1, 2], 0)).toThrow(new Error('Value not in array'))\n  })\n})\n"
  },
  {
    "path": "exercises/practice/binary-search/binary-search.ts",
    "content": "export function find(haystack: unknown, needle: unknown): number | never {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/binary-search/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/binary-search/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/binary-search/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-binary-search\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/binary-search/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/binary-search/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/binary-search-tree/.docs/instructions.md",
    "content": "# Instructions\n\nInsert and search for numbers in a binary tree.\n\nWhen we need to represent sorted data, an array does not make a good data structure.\n\nSay we have the array `[1, 3, 4, 5]`, and we add 2 to it so it becomes `[1, 3, 4, 5, 2]`.\nNow we must sort the entire array again!\nWe can improve on this by realizing that we only need to make space for the new item `[1, nil, 3, 4, 5]`, and then adding the item in the space we added.\nBut this still requires us to shift many elements down by one.\n\nBinary Search Trees, however, can operate on sorted data much more efficiently.\n\nA binary search tree consists of a series of connected nodes.\nEach node contains a piece of data (e.g. the number 3), a variable named `left`, and a variable named `right`.\nThe `left` and `right` variables point at `nil`, or other nodes.\nSince these other nodes in turn have other nodes beneath them, we say that the left and right variables are pointing at subtrees.\nAll data in the left subtree is less than or equal to the current node's data, and all data in the right subtree is greater than the current node's data.\n\nFor example, if we had a node containing the data 4, and we added the data 2, our tree would look like this:\n\n![A graph with root node 4 and a single child node 2.](https://assets.exercism.org/images/exercises/binary-search-tree/tree-4-2.svg)\n\n```text\n      4\n     /\n    2\n```\n\nIf we then added 6, it would look like this:\n\n![A graph with root node 4 and two child nodes 2 and 6.](https://assets.exercism.org/images/exercises/binary-search-tree/tree-4-2-6.svg)\n\n```text\n      4\n     / \\\n    2   6\n```\n\nIf we then added 3, it would look like this\n\n![A graph with root node 4, two child nodes 2 and 6, and a grandchild node 3.](https://assets.exercism.org/images/exercises/binary-search-tree/tree-4-2-6-3.svg)\n\n```text\n       4\n     /   \\\n    2     6\n     \\\n      3\n```\n\nAnd if we then added 1, 5, and 7, it would look like this\n\n![A graph with root node 4, two child nodes 2 and 6, and four grandchild nodes 1, 3, 5 and 7.](https://assets.exercism.org/images/exercises/binary-search-tree/tree-4-2-6-1-3-5-7.svg)\n\n```text\n          4\n        /   \\\n       /     \\\n      2       6\n     / \\     / \\\n    1   3   5   7\n```\n\n## Credit\n\nThe images were created by [habere-et-dispertire][habere-et-dispertire] using [PGF/TikZ][pgf-tikz] by Till Tantau.\n\n[habere-et-dispertire]: https://exercism.org/profiles/habere-et-dispertire\n[pgf-tikz]: https://en.wikipedia.org/wiki/PGF/TikZ\n"
  },
  {
    "path": "exercises/practice/binary-search-tree/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"Sn0wFox\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"peerreynders\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"binary-search-tree.ts\"\n    ],\n    \"test\": [\n      \"binary-search-tree.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Insert and search for numbers in a binary tree.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Josh Cheek\"\n}\n"
  },
  {
    "path": "exercises/practice/binary-search-tree/.meta/proof.ci.ts",
    "content": "type BinarySearchTreeMaybe = BinarySearchTree | undefined\ntype EachFn = (data: number) => void\n\nexport class BinarySearchTree {\n  private readonly _data: number\n  private _left?: BinarySearchTree\n  private _right?: BinarySearchTree\n\n  constructor(data: number) {\n    this._data = data\n  }\n\n  public insert(value: number): this {\n    if (value <= this._data) {\n      if (this._left) this._left.insert(value)\n      else this._left = new BinarySearchTree(value)\n    } else {\n      if (this._right) this._right.insert(value)\n      else this._right = new BinarySearchTree(value)\n    }\n\n    return this\n  }\n\n  public each(fn: EachFn): void {\n    if (this._left) this._left.each(fn)\n    fn(this._data)\n    if (this._right) this._right.each(fn)\n  }\n\n  public get data(): number {\n    return this._data\n  }\n\n  public get left(): BinarySearchTreeMaybe {\n    return this._left\n  }\n\n  public get right(): BinarySearchTreeMaybe {\n    return this._right\n  }\n}\n"
  },
  {
    "path": "exercises/practice/binary-search-tree/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[e9c93a78-c536-4750-a336-94583d23fafa]\ndescription = \"data is retained\"\n\n[7a95c9e8-69f6-476a-b0c4-4170cb3f7c91]\ndescription = \"smaller number at left node\"\n\n[22b89499-9805-4703-a159-1a6e434c1585]\ndescription = \"same number at left node\"\n\n[2e85fdde-77b1-41ed-b6ac-26ce6b663e34]\ndescription = \"greater number at right node\"\n\n[dd898658-40ab-41d0-965e-7f145bf66e0b]\ndescription = \"can create complex tree\"\n\n[9e0c06ef-aeca-4202-b8e4-97f1ed057d56]\ndescription = \"can sort single number\"\n\n[425e6d07-fceb-4681-a4f4-e46920e380bb]\ndescription = \"can sort if second number is smaller than first\"\n\n[bd7532cc-6988-4259-bac8-1d50140079ab]\ndescription = \"can sort if second number is same as first\"\n\n[b6d1b3a5-9d79-44fd-9013-c83ca92ddd36]\ndescription = \"can sort if second number is greater than first\"\n\n[d00ec9bd-1288-4171-b968-d44d0808c1c8]\ndescription = \"can sort complex tree\"\n"
  },
  {
    "path": "exercises/practice/binary-search-tree/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/binary-search-tree/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/binary-search-tree/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/binary-search-tree/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/binary-search-tree/binary-search-tree.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { BinarySearchTree } from './binary-search-tree.ts'\n\nfunction recordAllData(bst: BinarySearchTree): unknown[] {\n  const out: unknown[] = []\n  bst.each((data) => {\n    out.push(data)\n  })\n  return out\n}\n\ndescribe('BinarySearchTree', () => {\n  it('should retain data', () => {\n    expect(new BinarySearchTree(4).data).toEqual(4)\n  })\n\n  xit('should insert a lesser number to the left', () => {\n    const four = new BinarySearchTree(4)\n    four.insert(2)\n\n    expect(four.data).toEqual(4)\n    expect(four.left!.data).toEqual(2)\n  })\n\n  xit('should insert the same number to the left', () => {\n    const four = new BinarySearchTree(4)\n    four.insert(4)\n\n    expect(four.data).toEqual(4)\n    expect(four.left!.data).toEqual(4)\n  })\n\n  xit('should insert a greater number to the right', () => {\n    const four = new BinarySearchTree(4)\n    four.insert(5)\n\n    expect(four.data).toEqual(4)\n    expect(four.right!.data).toEqual(5)\n  })\n\n  xit('should deal with a complex tree', () => {\n    const four = new BinarySearchTree(4)\n    four.insert(2)\n    four.insert(6)\n    four.insert(1)\n    four.insert(3)\n    four.insert(7)\n    four.insert(5)\n\n    expect(four.data).toEqual(4)\n    expect(four.left!.data).toEqual(2)\n    expect(four.left!.left!.data).toEqual(1)\n    expect(four.left!.right!.data).toEqual(3)\n    expect(four.right!.data).toEqual(6)\n    expect(four.right!.left!.data).toEqual(5)\n    expect(four.right!.right!.data).toEqual(7)\n  })\n\n  xit('should iterate over one element', () => {\n    expect(recordAllData(new BinarySearchTree(4))).toEqual([4])\n  })\n\n  xit('should iterate over smaller element', () => {\n    const four = new BinarySearchTree(4)\n    four.insert(2)\n\n    expect(recordAllData(four)).toEqual([2, 4])\n  })\n\n  xit('should iterate over larger element', () => {\n    const four = new BinarySearchTree(4)\n    four.insert(5)\n\n    expect(recordAllData(four)).toEqual([4, 5])\n  })\n\n  xit('should iterate over complex tree', () => {\n    const four = new BinarySearchTree(4)\n    four.insert(2)\n    four.insert(1)\n    four.insert(3)\n    four.insert(6)\n    four.insert(7)\n    four.insert(5)\n\n    expect(recordAllData(four)).toEqual([1, 2, 3, 4, 5, 6, 7])\n  })\n})\n"
  },
  {
    "path": "exercises/practice/binary-search-tree/binary-search-tree.ts",
    "content": "export class BinarySearchTree {\n  constructor(data: unknown) {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public get data(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public get right(): BinarySearchTree | undefined {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public get left(): BinarySearchTree | undefined {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public insert(item: unknown): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public each(callback: (data: unknown) => unknown): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/binary-search-tree/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/binary-search-tree/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/binary-search-tree/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-binary-search-tree\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/binary-search-tree/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/binary-search-tree/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/bob/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to determine what Bob will reply to someone when they say something to him or ask him a question.\n\nBob only ever answers one of five things:\n\n- **\"Sure.\"**\n  This is his response if you ask him a question, such as \"How are you?\"\n  The convention used for questions is that it ends with a question mark.\n- **\"Whoa, chill out!\"**\n  This is his answer if you YELL AT HIM.\n  The convention used for yelling is ALL CAPITAL LETTERS.\n- **\"Calm down, I know what I'm doing!\"**\n  This is what he says if you yell a question at him.\n- **\"Fine. Be that way!\"**\n  This is how he responds to silence.\n  The convention used for silence is nothing, or various combinations of whitespace characters.\n- **\"Whatever.\"**\n  This is what he answers to anything else.\n"
  },
  {
    "path": "exercises/practice/bob/.docs/introduction.md",
    "content": "# Introduction\n\nBob is a [lackadaisical][] teenager.\nHe likes to think that he's very cool.\nAnd he definitely doesn't get excited about things.\nThat wouldn't be cool.\n\nWhen people talk to him, his responses are pretty limited.\n\n[lackadaisical]: https://www.collinsdictionary.com/dictionary/english/lackadaisical\n"
  },
  {
    "path": "exercises/practice/bob/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"masters3d\"\n  ],\n  \"contributors\": [\n    \"amscotti\",\n    \"DFXLuna\",\n    \"kytrinyx\",\n    \"lukaszklis\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"bob.ts\"\n    ],\n    \"test\": [\n      \"bob.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Bob is a lackadaisical teenager. In conversation, his responses are very limited.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Inspired by the 'Deaf Grandma' exercise in Chris Pine's Learn to Program tutorial.\",\n  \"source_url\": \"https://pine.fm/LearnToProgram/chap_06.html\"\n}\n"
  },
  {
    "path": "exercises/practice/bob/.meta/description.md",
    "content": "# Description\n\nBob is a lackadaisical teenager. In conversation, his responses are very limited.\n\nBob answers 'Sure.' if you ask him a question.\n\nHe answers 'Whoa, chill out!' if you yell at him.\n\nHe says 'Fine. Be that way!' if you address him without actually saying\nanything.\n\nHe answers 'Whatever.' to anything else.\n"
  },
  {
    "path": "exercises/practice/bob/.meta/proof.ci.ts",
    "content": "function isYelling(message: string): boolean {\n  return message.toUpperCase() === message && message.toLowerCase() !== message\n}\n\nfunction isQuestion(message: string): boolean {\n  return message.trim().slice(-1) === '?'\n}\n\nfunction isSilence(message: string): boolean {\n  return message.trim().length === 0\n}\n\nexport function hey(message: string): string {\n  if (isYelling(message) && isQuestion(message)) {\n    return \"Calm down, I know what I'm doing!\"\n  }\n\n  if (isYelling(message)) {\n    return 'Whoa, chill out!'\n  }\n\n  if (isQuestion(message)) {\n    return 'Sure.'\n  }\n\n  if (isSilence(message)) {\n    return 'Fine. Be that way!'\n  }\n\n  return 'Whatever.'\n}\n"
  },
  {
    "path": "exercises/practice/bob/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[e162fead-606f-437a-a166-d051915cea8e]\ndescription = \"stating something\"\n\n[73a966dc-8017-47d6-bb32-cf07d1a5fcd9]\ndescription = \"shouting\"\n\n[d6c98afd-df35-4806-b55e-2c457c3ab748]\ndescription = \"shouting gibberish\"\n\n[8a2e771d-d6f1-4e3f-b6c6-b41495556e37]\ndescription = \"asking a question\"\n\n[81080c62-4e4d-4066-b30a-48d8d76920d9]\ndescription = \"asking a numeric question\"\n\n[2a02716d-685b-4e2e-a804-2adaf281c01e]\ndescription = \"asking gibberish\"\n\n[c02f9179-ab16-4aa7-a8dc-940145c385f7]\ndescription = \"talking forcefully\"\n\n[153c0e25-9bb5-4ec5-966e-598463658bcd]\ndescription = \"using acronyms in regular speech\"\n\n[a5193c61-4a92-4f68-93e2-f554eb385ec6]\ndescription = \"forceful question\"\n\n[a20e0c54-2224-4dde-8b10-bd2cdd4f61bc]\ndescription = \"shouting numbers\"\n\n[f7bc4b92-bdff-421e-a238-ae97f230ccac]\ndescription = \"no letters\"\n\n[bb0011c5-cd52-4a5b-8bfb-a87b6283b0e2]\ndescription = \"question with no letters\"\n\n[496143c8-1c31-4c01-8a08-88427af85c66]\ndescription = \"shouting with special characters\"\n\n[e6793c1c-43bd-4b8d-bc11-499aea73925f]\ndescription = \"shouting with no exclamation mark\"\n\n[aa8097cc-c548-4951-8856-14a404dd236a]\ndescription = \"statement containing question mark\"\n\n[9bfc677d-ea3a-45f2-be44-35bc8fa3753e]\ndescription = \"non-letters with question\"\n\n[8608c508-f7de-4b17-985b-811878b3cf45]\ndescription = \"prattling on\"\n\n[bc39f7c6-f543-41be-9a43-fd1c2f753fc0]\ndescription = \"silence\"\n\n[d6c47565-372b-4b09-b1dd-c40552b8378b]\ndescription = \"prolonged silence\"\n\n[4428f28d-4100-4d85-a902-e5a78cb0ecd3]\ndescription = \"alternate silence\"\n\n[66953780-165b-4e7e-8ce3-4bcb80b6385a]\ndescription = \"multiple line question\"\n\n[5371ef75-d9ea-4103-bcfa-2da973ddec1b]\ndescription = \"starting with whitespace\"\n\n[05b304d6-f83b-46e7-81e0-4cd3ca647900]\ndescription = \"ending with whitespace\"\n\n[72bd5ad3-9b2f-4931-a988-dce1f5771de2]\ndescription = \"other whitespace\"\n\n[12983553-8601-46a8-92fa-fcaa3bc4a2a0]\ndescription = \"non-question ending with whitespace\"\n"
  },
  {
    "path": "exercises/practice/bob/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/bob/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/bob/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/bob/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/bob/bob.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { hey } from './bob.ts'\n\ndescribe('Bob', () => {\n  it('stating something', () => {\n    const result = hey('Tom-ay-to, tom-aaaah-to.')\n    expect(result).toEqual('Whatever.')\n  })\n\n  xit('shouting', () => {\n    const result = hey('WATCH OUT!')\n    expect(result).toEqual('Whoa, chill out!')\n  })\n\n  xit('shouting gibberish', () => {\n    const result = hey('FCECDFCAAB')\n    expect(result).toEqual('Whoa, chill out!')\n  })\n\n  xit('asking a question', () => {\n    const result = hey('Does this cryogenic chamber make me look fat?')\n    expect(result).toEqual('Sure.')\n  })\n\n  xit('asking a numeric question', () => {\n    const result = hey('You are, what, like 15?')\n    expect(result).toEqual('Sure.')\n  })\n\n  xit('asking gibberish', () => {\n    const result = hey('fffbbcbeab?')\n    expect(result).toEqual('Sure.')\n  })\n\n  xit('talking forcefully', () => {\n    const result = hey(\"Let's go make out behind the gym!\")\n    expect(result).toEqual('Whatever.')\n  })\n\n  xit('using acronyms in regular speech', () => {\n    const result = hey(\"It's OK if you don't want to go to the DMV.\")\n    expect(result).toEqual('Whatever.')\n  })\n\n  xit('forceful question', () => {\n    const result = hey('WHAT THE HELL WERE YOU THINKING?')\n    expect(result).toEqual(\"Calm down, I know what I'm doing!\")\n  })\n\n  xit('shouting numbers', () => {\n    const result = hey('1, 2, 3 GO!')\n    expect(result).toEqual('Whoa, chill out!')\n  })\n\n  xit('no letters', () => {\n    const result = hey('1, 2, 3')\n    expect(result).toEqual('Whatever.')\n  })\n\n  xit('question with no letters', () => {\n    const result = hey('4?')\n    expect(result).toEqual('Sure.')\n  })\n\n  xit('shouting with special characters', () => {\n    const result = hey('ZOMG THE %^*@#$(*^ ZOMBIES ARE COMING!!11!!1!')\n    expect(result).toEqual('Whoa, chill out!')\n  })\n\n  xit('shouting with no exclamation mark', () => {\n    const result = hey('I HATE THE DMV')\n    expect(result).toEqual('Whoa, chill out!')\n  })\n\n  xit('statement containing question mark', () => {\n    const result = hey('Ending with ? means a question.')\n    expect(result).toEqual('Whatever.')\n  })\n\n  xit('prattling on', () => {\n    const result = hey('Wait! Hang on.  Are you going to be OK?')\n    expect(result).toEqual('Sure.')\n  })\n\n  xit('silence', () => {\n    const result = hey('')\n    expect(result).toEqual('Fine. Be that way!')\n  })\n\n  xit('prolonged silence', () => {\n    const result = hey('   ')\n    expect(result).toEqual('Fine. Be that way!')\n  })\n\n  xit('alternate silence', () => {\n    const result = hey('\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t')\n    expect(result).toEqual('Fine. Be that way!')\n  })\n\n  xit('multiple line question', () => {\n    const result = hey('\\nDoes this cryogenic chamber make me look fat?\\nNo.')\n    expect(result).toEqual('Whatever.')\n  })\n\n  xit('starting with whitespace', () => {\n    const result = hey('         hmmmmmmm...')\n    expect(result).toEqual('Whatever.')\n  })\n\n  xit('ending with whitespace', () => {\n    const result = hey('Okay if like my  spacebar  quite a bit?   ')\n    expect(result).toEqual('Sure.')\n  })\n\n  xit('other whitespace', () => {\n    const result = hey('\\n\\r \\t')\n    expect(result).toEqual('Fine. Be that way!')\n  })\n\n  xit('non-question ending with whitespace', () => {\n    const result = hey('This is a statement ending with whitespace      ')\n    expect(result).toEqual('Whatever.')\n  })\n})\n"
  },
  {
    "path": "exercises/practice/bob/bob.ts",
    "content": "export function hey(message: unknown): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/bob/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/bob/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/bob/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-bob\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/bob/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/bob/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/bottle-song/.docs/instructions.md",
    "content": "# Instructions\n\nRecite the lyrics to that popular children's repetitive song: Ten Green Bottles.\n\nNote that not all verses are identical.\n\n```text\nTen green bottles hanging on the wall,\nTen green bottles hanging on the wall,\nAnd if one green bottle should accidentally fall,\nThere'll be nine green bottles hanging on the wall.\n\nNine green bottles hanging on the wall,\nNine green bottles hanging on the wall,\nAnd if one green bottle should accidentally fall,\nThere'll be eight green bottles hanging on the wall.\n\nEight green bottles hanging on the wall,\nEight green bottles hanging on the wall,\nAnd if one green bottle should accidentally fall,\nThere'll be seven green bottles hanging on the wall.\n\nSeven green bottles hanging on the wall,\nSeven green bottles hanging on the wall,\nAnd if one green bottle should accidentally fall,\nThere'll be six green bottles hanging on the wall.\n\nSix green bottles hanging on the wall,\nSix green bottles hanging on the wall,\nAnd if one green bottle should accidentally fall,\nThere'll be five green bottles hanging on the wall.\n\nFive green bottles hanging on the wall,\nFive green bottles hanging on the wall,\nAnd if one green bottle should accidentally fall,\nThere'll be four green bottles hanging on the wall.\n\nFour green bottles hanging on the wall,\nFour green bottles hanging on the wall,\nAnd if one green bottle should accidentally fall,\nThere'll be three green bottles hanging on the wall.\n\nThree green bottles hanging on the wall,\nThree green bottles hanging on the wall,\nAnd if one green bottle should accidentally fall,\nThere'll be two green bottles hanging on the wall.\n\nTwo green bottles hanging on the wall,\nTwo green bottles hanging on the wall,\nAnd if one green bottle should accidentally fall,\nThere'll be one green bottle hanging on the wall.\n\nOne green bottle hanging on the wall,\nOne green bottle hanging on the wall,\nAnd if one green bottle should accidentally fall,\nThere'll be no green bottles hanging on the wall.\n```\n"
  },
  {
    "path": "exercises/practice/bottle-song/.meta/config.json",
    "content": "{\n    \"authors\": [\n      \"Budmin\"\n    ],\n    \"files\": {\n      \"solution\": [\n        \"bottle-song.ts\"\n      ],\n      \"test\": [\n        \"bottle-song.test.ts\"\n      ],\n      \"example\": [\n        \".meta/proof.ci.ts\"\n      ]\n    },\n    \"blurb\": \"Produce the lyrics to the popular children's repetitive song: Ten Green Bottles.\",\n    \"source\": \"Wikipedia\",\n    \"source_url\": \"https://en.wikipedia.org/wiki/Ten_Green_Bottles\"\n  }\n  "
  },
  {
    "path": "exercises/practice/bottle-song/.meta/proof.ci.ts",
    "content": "const NUMBERS = [\n  'no',\n  'One',\n  'Two',\n  'Three',\n  'Four',\n  'Five',\n  'Six',\n  'Seven',\n  'Eight',\n  'Nine',\n  'Ten',\n]\n\nexport const recite = (\n  initialBottleCount: number,\n  takeDownCount = 1\n): string[] => {\n  const out: string[] = []\n\n  for (\n    let i = initialBottleCount;\n    i > initialBottleCount - takeDownCount;\n    i--\n  ) {\n    const currentBottles = i === 1 ? 'bottle' : 'bottles'\n    const nextBottles = i - 1 === 1 ? 'bottle' : 'bottles'\n\n    const line = `${NUMBERS[i]} green ${currentBottles} hanging on the wall,`\n    out.push(\n      line,\n      line,\n      `And if one green bottle should accidentally fall,`,\n      `There'll be ${NUMBERS[i - 1].toLowerCase()} green ${nextBottles} hanging on the wall.`\n    )\n\n    if (initialBottleCount - takeDownCount !== i - 1) {\n      out.push('')\n    }\n  }\n\n  return out\n}\n"
  },
  {
    "path": "exercises/practice/bottle-song/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[d4ccf8fc-01dc-48c0-a201-4fbeb30f2d03]\ndescription = \"verse -> single verse -> first generic verse\"\n\n[0f0aded3-472a-4c64-b842-18d4f1f5f030]\ndescription = \"verse -> single verse -> last generic verse\"\n\n[f61f3c97-131f-459e-b40a-7428f3ed99d9]\ndescription = \"verse -> single verse -> verse with 2 bottles\"\n\n[05eadba9-5dbd-401e-a7e8-d17cc9baa8e0]\ndescription = \"verse -> single verse -> verse with 1 bottle\"\n\n[a4a28170-83d6-4dc1-bd8b-319b6abb6a80]\ndescription = \"lyrics -> multiple verses -> first two verses\"\n\n[3185d438-c5ac-4ce6-bcd3-02c9ff1ed8db]\ndescription = \"lyrics -> multiple verses -> last three verses\"\n\n[28c1584a-0e51-4b65-9ae2-fbc0bf4bbb28]\ndescription = \"lyrics -> multiple verses -> all verses\"\n"
  },
  {
    "path": "exercises/practice/bottle-song/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/bottle-song/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/bottle-song/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/bottle-song/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/bottle-song/bottle-song.test.ts",
    "content": "import { describe, expect, it, xit } from '@jest/globals'\nimport { recite } from './bottle-song.ts'\n\ndescribe('Bottle Song', () => {\n  describe('verse', () => {\n    describe('single verse', () => {\n      it('first generic verse', () => {\n        const expected = [\n          `Ten green bottles hanging on the wall,`,\n          `Ten green bottles hanging on the wall,`,\n          `And if one green bottle should accidentally fall,`,\n          `There'll be nine green bottles hanging on the wall.`,\n        ]\n        expect(recite(10, 1)).toEqual(expected)\n      })\n\n      xit('last generic verse', () => {\n        const expected = [\n          `Three green bottles hanging on the wall,`,\n          `Three green bottles hanging on the wall,`,\n          `And if one green bottle should accidentally fall,`,\n          `There'll be two green bottles hanging on the wall.`,\n        ]\n        expect(recite(3, 1)).toEqual(expected)\n      })\n\n      xit('verse with 2 bottles', () => {\n        const expected = [\n          `Two green bottles hanging on the wall,`,\n          `Two green bottles hanging on the wall,`,\n          `And if one green bottle should accidentally fall,`,\n          `There'll be one green bottle hanging on the wall.`,\n        ]\n        expect(recite(2, 1)).toEqual(expected)\n      })\n\n      xit('verse with 1 bottle', () => {\n        const expected = [\n          `One green bottle hanging on the wall,`,\n          `One green bottle hanging on the wall,`,\n          `And if one green bottle should accidentally fall,`,\n          `There'll be no green bottles hanging on the wall.`,\n        ]\n        expect(recite(1, 1)).toEqual(expected)\n      })\n    })\n  })\n\n  describe('lyrics', () => {\n    describe('multiple verses', () => {\n      xit('first two verses', () => {\n        const expected = [\n          `Ten green bottles hanging on the wall,`,\n          `Ten green bottles hanging on the wall,`,\n          `And if one green bottle should accidentally fall,`,\n          `There'll be nine green bottles hanging on the wall.`,\n          ``,\n          `Nine green bottles hanging on the wall,`,\n          `Nine green bottles hanging on the wall,`,\n          `And if one green bottle should accidentally fall,`,\n          `There'll be eight green bottles hanging on the wall.`,\n        ]\n        expect(recite(10, 2)).toEqual(expected)\n      })\n\n      xit('last three verses', () => {\n        const expected = [\n          `Three green bottles hanging on the wall,`,\n          `Three green bottles hanging on the wall,`,\n          `And if one green bottle should accidentally fall,`,\n          `There'll be two green bottles hanging on the wall.`,\n          ``,\n          `Two green bottles hanging on the wall,`,\n          `Two green bottles hanging on the wall,`,\n          `And if one green bottle should accidentally fall,`,\n          `There'll be one green bottle hanging on the wall.`,\n          ``,\n          `One green bottle hanging on the wall,`,\n          `One green bottle hanging on the wall,`,\n          `And if one green bottle should accidentally fall,`,\n          `There'll be no green bottles hanging on the wall.`,\n        ]\n        expect(recite(3, 3)).toEqual(expected)\n      })\n\n      xit('all verses', () => {\n        const expected = [\n          `Ten green bottles hanging on the wall,`,\n          `Ten green bottles hanging on the wall,`,\n          `And if one green bottle should accidentally fall,`,\n          `There'll be nine green bottles hanging on the wall.`,\n          ``,\n          `Nine green bottles hanging on the wall,`,\n          `Nine green bottles hanging on the wall,`,\n          `And if one green bottle should accidentally fall,`,\n          `There'll be eight green bottles hanging on the wall.`,\n          ``,\n          `Eight green bottles hanging on the wall,`,\n          `Eight green bottles hanging on the wall,`,\n          `And if one green bottle should accidentally fall,`,\n          `There'll be seven green bottles hanging on the wall.`,\n          ``,\n          `Seven green bottles hanging on the wall,`,\n          `Seven green bottles hanging on the wall,`,\n          `And if one green bottle should accidentally fall,`,\n          `There'll be six green bottles hanging on the wall.`,\n          ``,\n          `Six green bottles hanging on the wall,`,\n          `Six green bottles hanging on the wall,`,\n          `And if one green bottle should accidentally fall,`,\n          `There'll be five green bottles hanging on the wall.`,\n          ``,\n          `Five green bottles hanging on the wall,`,\n          `Five green bottles hanging on the wall,`,\n          `And if one green bottle should accidentally fall,`,\n          `There'll be four green bottles hanging on the wall.`,\n          ``,\n          `Four green bottles hanging on the wall,`,\n          `Four green bottles hanging on the wall,`,\n          `And if one green bottle should accidentally fall,`,\n          `There'll be three green bottles hanging on the wall.`,\n          ``,\n          `Three green bottles hanging on the wall,`,\n          `Three green bottles hanging on the wall,`,\n          `And if one green bottle should accidentally fall,`,\n          `There'll be two green bottles hanging on the wall.`,\n          ``,\n          `Two green bottles hanging on the wall,`,\n          `Two green bottles hanging on the wall,`,\n          `And if one green bottle should accidentally fall,`,\n          `There'll be one green bottle hanging on the wall.`,\n          ``,\n          `One green bottle hanging on the wall,`,\n          `One green bottle hanging on the wall,`,\n          `And if one green bottle should accidentally fall,`,\n          `There'll be no green bottles hanging on the wall.`,\n        ]\n        expect(recite(10, 10)).toEqual(expected)\n      })\n    })\n  })\n})\n"
  },
  {
    "path": "exercises/practice/bottle-song/bottle-song.ts",
    "content": "export const recite = (\n  initialBottleCount: unknown,\n  takeDownCount: unknown\n): unknown => {\n  throw new Error('Remove this statement and implement this function')\n}\n"
  },
  {
    "path": "exercises/practice/bottle-song/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/bottle-song/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/bottle-song/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-bottle-song\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism practice exercise on bottle-song\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/bottle-song/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/bottle-song/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/bowling/.docs/instructions.md",
    "content": "# Instructions\n\nScore a bowling game.\n\nBowling is a game where players roll a heavy ball to knock down pins arranged in a triangle.\nWrite code to keep track of the score of a game of bowling.\n\n## Scoring Bowling\n\nThe game consists of 10 frames.\nA frame is composed of one or two ball throws with 10 pins standing at frame initialization.\nThere are three cases for the tabulation of a frame.\n\n- An open frame is where a score of less than 10 is recorded for the frame.\n  In this case the score for the frame is the number of pins knocked down.\n\n- A spare is where all ten pins are knocked down by the second throw.\n  The total value of a spare is 10 plus the number of pins knocked down in their next throw.\n\n- A strike is where all ten pins are knocked down by the first throw.\n  The total value of a strike is 10 plus the number of pins knocked down in the next two throws.\n  If a strike is immediately followed by a second strike, then the value of the first strike cannot be determined until the ball is thrown one more time.\n\nHere is a three frame example:\n\n|  Frame 1   |  Frame 2   |     Frame 3      |\n| :--------: | :--------: | :--------------: |\n| X (strike) | 5/ (spare) | 9 0 (open frame) |\n\nFrame 1 is (10 + 5 + 5) = 20\n\nFrame 2 is (5 + 5 + 9) = 19\n\nFrame 3 is (9 + 0) = 9\n\nThis means the current running total is 48.\n\nThe tenth frame in the game is a special case.\nIf someone throws a spare or a strike then they get one or two fill balls respectively.\nFill balls exist to calculate the total of the 10th frame.\nScoring a strike or spare on the fill ball does not give the player more fill balls.\nThe total value of the 10th frame is the total number of pins knocked down.\n\nFor a tenth frame of X1/ (strike and a spare), the total value is 20.\n\nFor a tenth frame of XXX (three strikes), the total value is 30.\n\n## Requirements\n\nWrite code to keep track of the score of a game of bowling.\nIt should support two operations:\n\n- `roll(pins : int)` is called each time the player rolls a ball.\n  The argument is the number of pins knocked down.\n- `score() : int` is called only at the very end of the game.\n  It returns the total score for that game.\n"
  },
  {
    "path": "exercises/practice/bowling/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"bowling.ts\"\n    ],\n    \"test\": [\n      \"bowling.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Score a bowling game.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"The Bowling Game Kata from UncleBob\",\n  \"source_url\": \"https://web.archive.org/web/20221001111000/http://butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata\"\n}\n"
  },
  {
    "path": "exercises/practice/bowling/.meta/proof.ci.ts",
    "content": "type Frame = 'X' | 'S' | number | undefined\n\nexport class Bowling {\n  private readonly maxPins: number\n  private readonly maxFrames: number\n\n  private currentFrame: number\n  private frames: Frame[]\n  private frameScores: number[]\n  private frameRoll: number\n  private remainingPins: number\n\n  constructor() {\n    this.maxPins = 10\n    this.maxFrames = 10\n    this.currentFrame = 0\n\n    this.frames = []\n    this.frameScores = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n\n    this.initializeFrame()\n  }\n\n  private initializeFrame(): void {\n    this.frameRoll = 1\n    this.remainingPins = this.maxPins\n    this.currentFrame = this.currentFrame + 1\n  }\n\n  private incrementFrame(): void {\n    this.frameRoll = this.frameRoll + 1\n  }\n\n  private incrementScore(pins: number): void {\n    if (this.currentFrame > this.maxFrames) return\n    this.frameScores[this.currentFrame - 1] += pins\n  }\n\n  private scoreStrike(): void {\n    this.frames[this.currentFrame - 1] = 'X'\n    this.applyStrikeBonus(this.maxPins)\n    this.applySpareBonus(this.maxPins)\n    this.incrementFrame()\n  }\n\n  private scoreFirstRoll(pins: number): void {\n    this.remainingPins = this.remainingPins - pins\n    this.applySpareBonus(pins)\n    this.applyStrikeBonus(pins)\n    this.incrementFrame()\n  }\n\n  private scoreSpare(pins: number): void {\n    this.frames[this.currentFrame - 1] = 'S'\n    this.applyStrikeBonus(pins)\n    this.incrementFrame()\n  }\n\n  private scoreOpenFrame(pins: number): void {\n    this.frames[this.currentFrame - 1] =\n      this.maxPins - this.remainingPins + pins\n    this.applyStrikeBonus(pins)\n    this.incrementFrame()\n  }\n\n  private applySpareBonus(pins: number): void {\n    // pins on the first roll after a spare are counted twice (on the frame of spare)\n    if (this.frames[this.currentFrame - 2] === 'S') {\n      this.frameScores[this.currentFrame - 2] += pins\n    }\n  }\n\n  private applyStrikeBonus(pins: number): void {\n    // on the two rolls after a strike are counted twice (on the frame of the strike)\n    if (\n      this.frames[this.currentFrame - 3] === 'X' &&\n      this.frames[this.currentFrame - 2] === 'X' &&\n      this.frameRoll === 1 &&\n      this.currentFrame <= this.maxFrames + 2\n    ) {\n      this.frameScores[this.currentFrame - 3] += pins\n    }\n    if (\n      this.frames[this.currentFrame - 2] === 'X' &&\n      this.currentFrame <= this.maxFrames + 1\n    ) {\n      this.frameScores[this.currentFrame - 2] += pins\n    }\n  }\n\n  private isGameOver(): boolean {\n    if (this.currentFrame <= this.maxFrames) return false\n\n    if (\n      this.frames[this.maxFrames - 1] !== 'X' &&\n      this.frames[this.maxFrames - 1] !== 'S'\n    )\n      return true\n\n    // spare in the last frame gets no more than bonus roll\n    if (this.frames[this.maxFrames - 1] === 'S' && this.frameRoll > 1)\n      return true\n\n    // bonus roll after the spare in the last frame may get a strike but then the games ends\n    // without another roll\n    if (\n      this.frames[this.maxFrames - 1] === 'S' &&\n      this.frames[this.maxFrames] === 'X'\n    )\n      return true\n\n    if (this.frames[this.maxFrames - 1] === 'X') {\n      // if the first bonus roll is not a strike then finish the bonus frame\n      if (\n        this.frames[this.maxFrames] !== 'X' &&\n        this.currentFrame > this.maxFrames + 1\n      )\n        return true\n\n      if (this.frames[this.maxFrames] === 'X') {\n        // if the second bonus roll is a strike, but was still used, the game is over\n        if (this.frames[this.maxFrames + 1] !== 'X' && this.frameRoll > 1)\n          return true\n        // if the second bonus roll is a strike the game is over\n        if (this.frames[this.maxFrames + 1] === 'X') return true\n      }\n    }\n    return false\n  }\n\n  public roll(pins: number): void {\n    if (pins < 0) {\n      throw new Error('Negative roll is invalid')\n    }\n\n    if (pins > this.remainingPins) {\n      throw new Error('Pin count exceeds pins on the lane')\n    }\n\n    if (this.isGameOver()) {\n      throw new Error('Cannot roll after game is over')\n    }\n\n    this.incrementScore(pins)\n\n    if (this.frameRoll === 1) {\n      if (pins === this.maxPins) {\n        this.scoreStrike()\n        this.initializeFrame()\n      } else {\n        this.scoreFirstRoll(pins)\n      }\n    } else {\n      if (pins === this.remainingPins) {\n        this.scoreSpare(pins)\n      } else {\n        this.scoreOpenFrame(pins)\n      }\n      this.initializeFrame()\n    }\n  }\n\n  public score(): number {\n    if (!this.isGameOver()) {\n      throw new Error('Score cannot be taken until the end of the game')\n    }\n    return this.frameScores.reduce((total, num) => total + num)\n  }\n}\n"
  },
  {
    "path": "exercises/practice/bowling/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[656ae006-25c2-438c-a549-f338e7ec7441]\ndescription = \"should be able to score a game with all zeros\"\n\n[f85dcc56-cd6b-4875-81b3-e50921e3597b]\ndescription = \"should be able to score a game with no strikes or spares\"\n\n[d1f56305-3ac2-4fe0-8645-0b37e3073e20]\ndescription = \"a spare followed by zeros is worth ten points\"\n\n[0b8c8bb7-764a-4287-801a-f9e9012f8be4]\ndescription = \"points scored in the roll after a spare are counted twice\"\n\n[4d54d502-1565-4691-84cd-f29a09c65bea]\ndescription = \"consecutive spares each get a one roll bonus\"\n\n[e5c9cf3d-abbe-4b74-ad48-34051b2b08c0]\ndescription = \"a spare in the last frame gets a one roll bonus that is counted once\"\n\n[75269642-2b34-4b72-95a4-9be28ab16902]\ndescription = \"a strike earns ten points in a frame with a single roll\"\n\n[037f978c-5d01-4e49-bdeb-9e20a2e6f9a6]\ndescription = \"points scored in the two rolls after a strike are counted twice as a bonus\"\n\n[1635e82b-14ec-4cd1-bce4-4ea14bd13a49]\ndescription = \"consecutive strikes each get the two roll bonus\"\n\n[e483e8b6-cb4b-4959-b310-e3982030d766]\ndescription = \"a strike in the last frame gets a two roll bonus that is counted once\"\n\n[9d5c87db-84bc-4e01-8e95-53350c8af1f8]\ndescription = \"rolling a spare with the two roll bonus does not get a bonus roll\"\n\n[576faac1-7cff-4029-ad72-c16bcada79b5]\ndescription = \"strikes with the two roll bonus do not get bonus rolls\"\n\n[efb426ec-7e15-42e6-9b96-b4fca3ec2359]\ndescription = \"last two strikes followed by only last bonus with non strike points\"\n\n[72e24404-b6c6-46af-b188-875514c0377b]\ndescription = \"a strike with the one roll bonus after a spare in the last frame does not get a bonus\"\n\n[62ee4c72-8ee8-4250-b794-234f1fec17b1]\ndescription = \"all strikes is a perfect game\"\n\n[1245216b-19c6-422c-b34b-6e4012d7459f]\ndescription = \"rolls cannot score negative points\"\n\n[5fcbd206-782c-4faa-8f3a-be5c538ba841]\ndescription = \"a roll cannot score more than 10 points\"\n\n[fb023c31-d842-422d-ad7e-79ce1db23c21]\ndescription = \"two rolls in a frame cannot score more than 10 points\"\n\n[6082d689-d677-4214-80d7-99940189381b]\ndescription = \"bonus roll after a strike in the last frame cannot score more than 10 points\"\n\n[e9565fe6-510a-4675-ba6b-733a56767a45]\ndescription = \"two bonus rolls after a strike in the last frame cannot score more than 10 points\"\n\n[2f6acf99-448e-4282-8103-0b9c7df99c3d]\ndescription = \"two bonus rolls after a strike in the last frame can score more than 10 points if one is a strike\"\n\n[6380495a-8bc4-4cdb-a59f-5f0212dbed01]\ndescription = \"the second bonus rolls after a strike in the last frame cannot be a strike if the first one is not a strike\"\n\n[2b2976ea-446c-47a3-9817-42777f09fe7e]\ndescription = \"second bonus roll after a strike in the last frame cannot score more than 10 points\"\n\n[29220245-ac8d-463d-bc19-98a94cfada8a]\ndescription = \"an unstarted game cannot be scored\"\n\n[4473dc5d-1f86-486f-bf79-426a52ddc955]\ndescription = \"an incomplete game cannot be scored\"\n\n[2ccb8980-1b37-4988-b7d1-e5701c317df3]\ndescription = \"cannot roll if game already has ten frames\"\n\n[4864f09b-9df3-4b65-9924-c595ed236f1b]\ndescription = \"bonus rolls for a strike in the last frame must be rolled before score can be calculated\"\n\n[537f4e37-4b51-4d1c-97e2-986eb37b2ac1]\ndescription = \"both bonus rolls for a strike in the last frame must be rolled before score can be calculated\"\n\n[8134e8c1-4201-4197-bf9f-1431afcde4b9]\ndescription = \"bonus roll for a spare in the last frame must be rolled before score can be calculated\"\n\n[9d4a9a55-134a-4bad-bae8-3babf84bd570]\ndescription = \"cannot roll after bonus roll for spare\"\n\n[d3e02652-a799-4ae3-b53b-68582cc604be]\ndescription = \"cannot roll after bonus rolls for strike\"\n"
  },
  {
    "path": "exercises/practice/bowling/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/bowling/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/bowling/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/bowling/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/bowling/bowling.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { Bowling } from './bowling.ts'\n\ndescribe('Bowling', () => {\n  describe('Check game can be scored correctly.', () => {\n    it('should be able to score a game with all zeros', () => {\n      const rolls = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(bowling.score()).toEqual(0)\n    })\n\n    xit('should be able to score a game with no strikes or spares', () => {\n      const rolls = [3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(bowling.score()).toEqual(90)\n    })\n\n    xit('a spare followed by zeros is worth ten points', () => {\n      const rolls = [6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(bowling.score()).toEqual(10)\n    })\n\n    xit('points scored in the roll after a spare are counted twice', () => {\n      const rolls = [6, 4, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(bowling.score()).toEqual(16)\n    })\n\n    xit('consecutive spares each get a one roll bonus', () => {\n      const rolls = [5, 5, 3, 7, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(bowling.score()).toEqual(31)\n    })\n\n    xit('a spare in the last frame gets a one roll bonus that is counted once', () => {\n      const rolls = [\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 3, 7,\n      ]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(bowling.score()).toEqual(17)\n    })\n\n    xit('a strike earns ten points in a frame with a single roll', () => {\n      const rolls = [10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(bowling.score()).toEqual(10)\n    })\n\n    xit('points scored in the two rolls after a strike are counted twice as a bonus', () => {\n      const rolls = [10, 5, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(bowling.score()).toEqual(26)\n    })\n\n    xit('consecutive strikes each get the two roll bonus', () => {\n      const rolls = [10, 10, 10, 5, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(bowling.score()).toEqual(81)\n    })\n\n    xit('a strike in the last frame gets a two roll bonues that is counted once', () => {\n      const rolls = [\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 7, 1,\n      ]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(bowling.score()).toEqual(18)\n    })\n\n    xit('rolling a spare with the two roll bonus does not get a bonus roll', () => {\n      const rolls = [\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 7, 3,\n      ]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(bowling.score()).toEqual(20)\n    })\n\n    xit('strikes with the two roll bonus do not get bonus rolls', () => {\n      const rolls = [\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10,\n      ]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(bowling.score()).toEqual(30)\n    })\n\n    xit('last two strikes followed by only last bonus with non strike points', () => {\n      const rolls = [\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 1,\n      ]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(bowling.score()).toEqual(31)\n    })\n\n    xit('a strike with the one roll bonus after a spare in the last frame does not get a bonus', () => {\n      const rolls = [\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 3, 10,\n      ]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(bowling.score()).toEqual(20)\n    })\n\n    xit('all strikes is a perfect game', () => {\n      const rolls = [10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(bowling.score()).toEqual(300)\n    })\n  })\n\n  describe('Check game rules.', () => {\n    xit('rolls cannot score negative points', () => {\n      const bowling = new Bowling()\n      expect(() => {\n        bowling.roll(-1)\n      }).toThrow(new Error('Negative roll is invalid'))\n    })\n\n    xit('a roll cannot score more than 10 points', () => {\n      const bowling = new Bowling()\n      expect(() => {\n        bowling.roll(11)\n      }).toThrow(new Error('Pin count exceeds pins on the lane'))\n    })\n\n    xit('two rolls in a frame cannot score more than 10 points', () => {\n      const bowling = new Bowling()\n      bowling.roll(5)\n      expect(() => {\n        bowling.roll(6)\n      }).toThrow(new Error('Pin count exceeds pins on the lane'))\n    })\n\n    xit('bonus roll after a strike in the last frame cannot score more than 10 points', () => {\n      const rolls = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(() => {\n        bowling.roll(11)\n      }).toThrow(new Error('Pin count exceeds pins on the lane'))\n    })\n\n    xit('two bonus rolls after a strike in the last frame cannot score more than 10 points', () => {\n      const rolls = [\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 5,\n      ]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(() => {\n        bowling.roll(6)\n      }).toThrow(new Error('Pin count exceeds pins on the lane'))\n    })\n\n    xit('two bonus rolls after a strike in the last frame can score more than 10 points if one is a strike', () => {\n      const rolls = [\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 6,\n      ]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(bowling.score()).toEqual(26)\n    })\n\n    xit('the second bonus rolls after a strike in the last frame cannot be a strike if the first one is not a strike', () => {\n      const rolls = [\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 6,\n      ]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(() => {\n        bowling.roll(10)\n      }).toThrow(new Error('Pin count exceeds pins on the lane'))\n    })\n\n    xit('second bonus roll after a strike in the last frame cannot score more than 10 points', () => {\n      const rolls = [\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10,\n      ]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(() => {\n        bowling.roll(11)\n      }).toThrow(new Error('Pin count exceeds pins on the lane'))\n    })\n\n    xit('an unstarted game cannot be scored', () => {\n      const bowling = new Bowling()\n      expect(() => {\n        bowling.score()\n      }).toThrow(new Error('Score cannot be taken until the end of the game'))\n    })\n\n    xit('an incomplete game cannot be scored', () => {\n      const rolls = [0, 0]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(() => {\n        bowling.score()\n      }).toThrow(new Error('Score cannot be taken until the end of the game'))\n    })\n\n    xit('cannot roll if game already has ten frames', () => {\n      const rolls = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(() => {\n        bowling.roll(0)\n      }).toThrow(new Error('Cannot roll after game is over'))\n    })\n\n    xit('bonus rolls for a strike in the last frame must be rolled before score can be calculated', () => {\n      const rolls = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(() => {\n        bowling.score()\n      }).toThrow(new Error('Score cannot be taken until the end of the game'))\n    })\n\n    xit('both bonus rolls for a strike in the last frame must be rolled before score can be calculated', () => {\n      const rolls = [\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10,\n      ]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(() => {\n        bowling.score()\n      }).toThrow(new Error('Score cannot be taken until the end of the game'))\n    })\n\n    xit('bonus roll for a spare in the last frame must be rolled before score can be calculated', () => {\n      const rolls = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 3]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(() => {\n        bowling.score()\n      }).toThrow(new Error('Score cannot be taken until the end of the game'))\n    })\n\n    xit('cannot roll after bonus roll for spare', () => {\n      const rolls = [\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 3, 2,\n      ]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(() => {\n        bowling.roll(2)\n      }).toThrow(new Error('Cannot roll after game is over'))\n    })\n\n    xit('cannot roll after bonus rolls for strike', () => {\n      const rolls = [\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 3, 2,\n      ]\n      const bowling = new Bowling()\n      rolls.forEach((roll) => {\n        bowling.roll(roll)\n      })\n      expect(() => {\n        bowling.roll(2)\n      }).toThrow(new Error('Cannot roll after game is over'))\n    })\n  })\n})\n"
  },
  {
    "path": "exercises/practice/bowling/bowling.ts",
    "content": "export class Bowling {\n  public roll(pins: unknown): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public score(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/bowling/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/bowling/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/bowling/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-bowling\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/bowling/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/bowling/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/camicia/.docs/instructions.md",
    "content": "# Instructions\n\nIn this exercise, you will simulate a game very similar to the classic card game **Camicia**.\nYour program will receive the initial configuration of two players' decks and must simulate the game until it ends (or detect that it will never end).\n\n## Rules\n\n- The deck is split between **two players**.\n  The player's cards are read from left to right, where the leftmost card is the top of the deck.\n- A round consists of both players playing at least one card.\n- Players take turns placing the **top card** of their deck onto a central pile.\n- If the card is a **number card** (2-10), play simply passes to the other player.\n- If the card is a **payment card**, a penalty must be paid:\n  - **J** → opponent must pay 1 card\n  - **Q** → opponent must pay 2 cards\n  - **K** → opponent must pay 3 cards\n  - **A** → opponent must pay 4 cards\n- If the player paying a penalty reveals another payment card, that player stops paying the penalty.\n  The other player must then pay a penalty based on the new payment card.\n- If the penalty is fully paid without interruption, the player who placed the **last payment card** collects the central pile and places it at the bottom of their deck.\n  That player then starts the next round.\n- If a player runs out of cards and is unable to play a card (either while paying a penalty or when it is their turn), the other player collects the central pile.\n- The moment when a player collects cards from the central pile is called a **trick**.\n- If a player has all the cards in their possession after a trick, the game **ends**.\n- The game **enters a loop** as soon as the decks are identical to what they were earlier during the game, **not** counting number cards!\n\n## Examples\n\nA small example of a match that ends.\n\n| Round | Player A     | Player B                   | Pile                       | Penalty Due |\n| :---- | :----------- | :------------------------- | :------------------------- | :---------- |\n| 1     | 2 A 7 8 Q 10 | 3 4 5 6 K 9 J              |                            | -           |\n| 1     | A 7 8 Q 10   | 3 4 5 6 K 9 J              | 2                          | -           |\n| 1     | A 7 8 Q 10   | 4 5 6 K 9 J                | 2 3                        | -           |\n| 1     | 7 8 Q 10     | 4 5 6 K 9 J                | 2 3 A                      | Player B: 4 |\n| 1     | 7 8 Q 10     | 5 6 K 9 J                  | 2 3 A 4                    | Player B: 3 |\n| 1     | 7 8 Q 10     | 6 K 9 J                    | 2 3 A 4 5                  | Player B: 2 |\n| 1     | 7 8 Q 10     | K 9 J                      | 2 3 A 4 5 6                | Player B: 1 |\n| 1     | 7 8 Q 10     | 9 J                        | 2 3 A 4 5 6 K              | Player A: 3 |\n| 1     | 8 Q 10       | 9 J                        | 2 3 A 4 5 6 K 7            | Player A: 2 |\n| 1     | Q 10         | 9 J                        | 2 3 A 4 5 6 K 7 8          | Player A: 1 |\n| 1     | 10           | 9 J                        | 2 3 A 4 5 6 K 7 8 Q        | Player B: 2 |\n| 1     | 10           | J                          | 2 3 A 4 5 6 K 7 8 Q 9      | Player B: 1 |\n| 1     | 10           | -                          | 2 3 A 4 5 6 K 7 8 Q 9 J    | Player A: 1 |\n| 1     | -            | -                          | 2 3 A 4 5 6 K 7 8 Q 9 J 10 | -           |\n| 2     | -            | 2 3 A 4 5 6 K 7 8 Q 9 J 10 | -                          | -           |\n\nstatus: `\"finished\"`, cards: 13, tricks: 1\n\nThis is a small example of a match that loops.\n\n| Round | Player A | Player B | Pile  | Penalty Due |\n| :---- | :------- | :------- | :---- | :---------- |\n| 1     | J 2 3    | 4 J 5    | -     | -           |\n| 1     | 2 3      | 4 J 5    | J     | Player B: 1 |\n| 1     | 2 3      | J 5      | J 4   | -           |\n| 2     | 2 3 J 4  | J 5      | -     | -           |\n| 2     | 3 J 4    | J 5      | 2     | -           |\n| 2     | 3 J 4    | 5        | 2 J   | Player A: 1 |\n| 2     | J 4      | 5        | 2 J 3 | -           |\n| 3     | J 4      | 5 2 J 3  | -     | -           |\n| 3     | J 4      | 2 J 3    | 5     | -           |\n| 3     | 4        | 2 J 3    | 5 J   | Player B: 1 |\n| 3     | 4        | J 3      | 5 J 2 | -           |\n| 4     | 4 5 J 2  | J 3      | -     | -           |\n\nThe start of round 4 matches the start of round 2.\nRecall, the value of the number cards does not matter.\n\nstatus: `\"loop\"`, cards: 8, tricks: 3\n\n## Your Task\n\n- Using the input, simulate the game following the rules above.\n- Determine the following information regarding the game:\n  - **Status**: `\"finished\"` or `\"loop\"`\n  - **Cards**: total number of cards played throughout the game\n  - **Tricks**: number of times the central pile was collected\n\n~~~~exercism/advanced\nFor those who want to take on a more exciting challenge, the hunt for other records for the longest game with an end is still open.\nThere are 653,534,134,886,878,245,000 (approximately 654 quintillion) possibilities, and we haven't calculated them all yet!\n~~~~\n"
  },
  {
    "path": "exercises/practice/camicia/.docs/introduction.md",
    "content": "# Introduction\n\nOne rainy afternoon, you sit at the kitchen table playing cards with your grandmother.\nThe game is her take on [Camicia][bmn].\n\nAt first it feels like just another friendly match: cards slapped down, laughter across the table, the occasional victorious grin from Nonna.\nBut as the game stretches on, something strange happens.\nThe same cards keep cycling back.\nYou play card after card, yet the end never seems to come.\n\nYou start to wonder.\n_Will this game ever finish?\nOr could we keep playing forever?_\n\nLater, driven by curiosity, you search online and to your surprise you discover that what happened wasn't just bad luck.\nYou and your grandmother may have stumbled upon one of the longest possible sequences!\nSuddenly, you're hooked.\nWhat began as a casual game has turned into a quest: _how long can such a game really last?_\n_Can you find a sequence even longer than the one you played at the kitchen table?_\n_Perhaps even long enough to set a new world record?_\n\nAnd so, armed with nothing but a deck of cards and some algorithmic ingenuity, you decide to investigate...\n\n[bmn]: https://en.wikipedia.org/wiki/Beggar-my-neighbour\n"
  },
  {
    "path": "exercises/practice/camicia/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"BNAndras\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"camicia.ts\"\n    ],\n    \"test\": [\n      \"camicia.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Simulate the card game and determine whether the match ends or enters an infinite loop.\",\n  \"source\": \"Beggar-My-Neighbour\",\n  \"source_url\": \"https://www.richardpmann.com/beggar-my-neighbour-records.html\"\n}\n"
  },
  {
    "path": "exercises/practice/camicia/.meta/proof.ci.ts",
    "content": "export const simulateGame = (\n  playerA: string[],\n  playerB: string[]\n): { status: string; tricks: number; cards: number } => {\n  const getCardValue = (card: string): number => {\n    if (card === 'J') return 1\n    if (card === 'Q') return 2\n    if (card === 'K') return 3\n    if (card === 'A') return 4\n    return 0\n  }\n\n  const handA = playerA.map(getCardValue)\n  const handB = playerB.map(getCardValue)\n  let turn = 'A'\n  let pile = []\n  const seen = new Set()\n  let totalTricks = 0\n  let cardsPlayed = 0\n  let currentDebt = 0\n\n  while (true) {\n    if (pile.length === 0) {\n      const round = JSON.stringify([handA, handB, turn])\n      if (seen.has(round)) {\n        return { status: 'loop', tricks: totalTricks, cards: cardsPlayed }\n      }\n      seen.add(round)\n    }\n\n    const activeHand = turn === 'A' ? handA : handB\n    const otherHand = turn === 'A' ? handB : handA\n\n    if (activeHand.length === 0) {\n      const extraTrick = pile.length === 0 ? 0 : 1\n      return {\n        status: 'finished',\n        tricks: totalTricks + extraTrick,\n        cards: cardsPlayed,\n      }\n    }\n\n    const cardVal = activeHand.shift()!\n    pile.push(cardVal)\n    cardsPlayed += 1\n\n    // payment card so debt is either forgiven for player or assigned to opponent\n    if (cardVal > 0) {\n      currentDebt = cardVal\n      turn = turn === 'A' ? 'B' : 'A'\n    } else {\n      // time to pay up!\n      if (currentDebt > 0) {\n        currentDebt -= 1\n        if (currentDebt === 0) {\n          // penalty paid off\n          otherHand.push(...pile)\n          pile = []\n          totalTricks += 1\n          currentDebt = 0\n\n          if (handA.length === 0 || handB.length === 0) {\n            return {\n              status: 'finished',\n              tricks: totalTricks,\n              cards: cardsPlayed,\n            }\n          }\n          turn = turn === 'A' ? 'B' : 'A'\n        }\n      } else {\n        turn = turn === 'A' ? 'B' : 'A'\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "exercises/practice/camicia/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[0b7f737c-3ecd-4a55-b34d-e65c62a85c28]\ndescription = \"two cards, one trick\"\n\n[27c19d75-53a5-48e5-b33b-232c3884d4f3]\ndescription = \"three cards, one trick\"\n\n[9b02dd49-efaf-4b71-adca-a05c18a7c5b0]\ndescription = \"four cards, one trick\"\n\n[fa3f4479-466a-4734-a001-ab79bfe27260]\ndescription = \"the ace reigns supreme\"\n\n[07629689-f589-4f54-a6d1-8ce22776ce72]\ndescription = \"the king beats ace\"\n\n[54d4a1c5-76fb-4d1e-8358-0e0296ac0601]\ndescription = \"the queen seduces the king\"\n\n[c875500c-ff3d-47a4-bd1e-b60b90da80aa]\ndescription = \"the jack betrays the queen\"\n\n[436875da-96ca-4149-be22-0b78173b8125]\ndescription = \"the 10 just wants to put on a show\"\n\n[5be39bb6-1b34-4ce6-a1cd-0fcc142bb272]\ndescription = \"simple loop with decks of 3 cards\"\n\n[2795dc21-0a2a-4c38-87c2-5a42e1ff15eb]\ndescription = \"the story is starting to get a bit complicated\"\n\n[6999dfac-3fdc-41e2-b64b-38f4be228712]\ndescription = \"two tricks\"\n\n[83dcd4f3-e089-4d54-855a-73f5346543a3]\ndescription = \"more tricks\"\n\n[3107985a-f43e-486a-9ce8-db51547a9941]\ndescription = \"simple loop with decks of 4 cards\"\n\n[dca32c31-11ed-49f6-b078-79ab912c1f7b]\ndescription = \"easy card combination\"\n\n[1f8488d0-48d3-45ae-b819-59cedad0a5f4]\ndescription = \"easy card combination, inverted decks\"\n\n[98878d35-623a-4d05-b81a-7bdc569eb88d]\ndescription = \"mirrored decks\"\n\n[3e0ba597-ca10-484b-87a3-31a7df7d6da3]\ndescription = \"opposite decks\"\n\n[92334ddb-aaa7-47fa-ab36-e928a8a6a67c]\ndescription = \"random decks #1\"\n\n[30477523-9651-4860-84a3-e1ac461bb7fa]\ndescription = \"random decks #2\"\n\n[20967de8-9e94-4e0e-9010-14bc1c157432]\ndescription = \"Kleber 1999\"\n\n[9f2fdfe8-27f3-4323-816d-6bce98a9c6f7]\ndescription = \"Collins 2006\"\n\n[c90b6f8d-7013-49f3-b5cb-14ea006cca1d]\ndescription = \"Mann and Wu 2007\"\n\n[a3f1fbc5-1d0b-499a-92a5-22932dfc6bc8]\ndescription = \"Nessler 2012\"\n\n[9cefb1ba-e6d1-4ab7-9d8f-76d8e0976d5f]\ndescription = \"Anderson 2013\"\n\n[d37c0318-5be6-48d0-ab72-a7aaaff86179]\ndescription = \"Rucklidge 2014\"\n\n[4305e479-ba87-432f-8a29-cd2bd75d2f05]\ndescription = \"Nessler 2021\"\n\n[252f5cc3-b86d-4251-87ce-f920b7a6a559]\ndescription = \"Nessler 2022\"\n\n[b9efcfa4-842f-4542-8112-8389c714d958]\ndescription = \"Casella 2024, first infinite game found\"\n"
  },
  {
    "path": "exercises/practice/camicia/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/camicia/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/camicia/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/camicia/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/camicia/camicia.test.ts",
    "content": "import { describe, expect, it, xit } from '@jest/globals'\nimport { simulateGame } from './camicia.ts'\n\ndescribe('Camicia', () => {\n  it('two cards, one trick', () => {\n    const playerA = ['2']\n    const playerB = ['3']\n    const expected = { status: 'finished', cards: 2, tricks: 1 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  xit('three cards, one trick', () => {\n    const playerA = ['2', '4']\n    const playerB = ['3']\n    const expected = { status: 'finished', cards: 3, tricks: 1 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  xit('four cards, one trick', () => {\n    const playerA = ['2', '4']\n    const playerB = ['3', '5', '6']\n    const expected = { status: 'finished', cards: 4, tricks: 1 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  xit('the ace reigns supreme', () => {\n    const playerA = ['2', 'A']\n    const playerB = ['3', '4', '5', '6', '7']\n    const expected = { status: 'finished', cards: 7, tricks: 1 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  xit('the king beats ace', () => {\n    const playerA = ['2', 'A']\n    const playerB = ['3', '4', '5', '6', 'K']\n    const expected = { status: 'finished', cards: 7, tricks: 1 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  xit('the queen seduces the king', () => {\n    const playerA = ['2', 'A', '7', '8', 'Q']\n    const playerB = ['3', '4', '5', '6', 'K']\n    const expected = { status: 'finished', cards: 10, tricks: 1 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  xit('the jack betrays the queen', () => {\n    const playerA = ['2', 'A', '7', '8', 'Q']\n    const playerB = ['3', '4', '5', '6', 'K', '9', 'J']\n    const expected = { status: 'finished', cards: 12, tricks: 1 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  xit('the 10 just wants to put on a show', () => {\n    const playerA = ['2', 'A', '7', '8', 'Q', '10']\n    const playerB = ['3', '4', '5', '6', 'K', '9', 'J']\n    const expected = { status: 'finished', cards: 13, tricks: 1 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  xit('simple loop with decks of 3 cards', () => {\n    const playerA = ['J', '2', '3']\n    const playerB = ['4', 'J', '5']\n    const expected = { status: 'loop', cards: 8, tricks: 3 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  // prettier-ignore\n  xit('the story is starting to get a bit complicated', () => {\n    const playerA = [\n      '2', '6', '6', 'J', '4', 'K', 'Q', '10', 'K', 'J',\n      'Q', '2', '3', 'K', '5', '6', 'Q', 'Q', 'A', 'A',\n      '6', '9', 'K', 'A', '8', 'K', '2', 'A', '9', 'A',\n      'Q', '4', 'K', 'K', 'K', '3', '5', 'K', '8', 'Q',\n      '3', 'Q', '7', 'J', 'K', 'J', '9', 'J', '3', '3',\n      'K', 'K', 'Q', 'A', 'K', '7', '10', 'A', 'Q', '7',\n      '10', 'J', '4', '5', 'J', '9', '10', 'Q', 'J', 'J',\n      'K', '6', '10', 'J', '6', 'Q', 'J', '5', 'J', 'Q',\n      'Q', '8', '3', '8', 'A', '2', '6', '9', 'K', '7',\n      'J', 'K', 'K', '8', 'K', 'Q', '6', '10', 'J', '10',\n      'J', 'Q', 'J', '10', '3', '8', 'K', 'A', '6', '9',\n      'K', '2', 'A', 'A', '10', 'J', '6', 'A', '4', 'J',\n      'A', 'J', 'J', '6', '2', 'J', '3', 'K', '2', '5',\n      '9', 'J', '9', '6', 'K', 'A', '5', 'Q', 'J', '2',\n      'Q', 'K', 'A', '3', 'K', 'J', 'K', '2', '5', '6',\n      'Q', 'J', 'Q', 'Q', 'J', '2', 'J', '9', 'Q', '7',\n      '7', 'A', 'Q', '7', 'Q', 'J', 'K', 'J', 'A', '7',\n      '7', '8', 'Q', '10', 'J', '10', 'J', 'J', '9', '2',\n      'A', '2',\n    ]\n    const playerB = [\n      '7', '2', '10', 'K', '8', '2', 'J', '9', 'A', '5',\n      '6', 'J', 'Q', '6', 'K', '6', '5', 'A', '4', 'Q',\n      '7', 'J', '7', '10', '2', 'Q', '8', '2', '2', 'K',\n      'J', 'A', '5', '5', 'A', '4', 'Q', '6', 'Q', 'K',\n      '10', '8', 'Q', '2', '10', 'J', 'A', 'Q', '8', 'Q',\n      'Q', 'J', 'J', 'A', 'A', '9', '10', 'J', 'K', '4',\n      'Q', '10', '10', 'J', 'K', '10', '2', 'J', '7', 'A',\n      'K', 'K', 'J', 'A', 'J', '10', '8', 'K', 'A', '7',\n      'Q', 'Q', 'J', '3', 'Q', '4', 'A', '3', 'A', 'Q',\n      'Q', 'Q', '5', '4', 'K', 'J', '10', 'A', 'Q', 'J',\n      '6', 'J', 'A', '10', 'A', '5', '8', '3', 'K', '5',\n      '9', 'Q', '8', '7', '7', 'J', '7', 'Q', 'Q', 'Q',\n      'A', '7', '8', '9', 'A', 'Q', 'A', 'K', '8', 'A',\n      'A', 'J', '8', '4', '8', 'K', 'J', 'A', '10', 'Q',\n      '8', 'J', '8', '6', '10', 'Q', 'J', 'J', 'A', 'A',\n      'J', '5', 'Q', '6', 'J', 'K', 'Q', '8', 'K', '4',\n      'Q', 'Q', '6', 'J', 'K', '4', '7', 'J', 'J', '9',\n      '9', 'A', 'Q', 'Q', 'K', 'A', '6', '5', 'K',\n    ]\n    const expected = { status: 'finished', cards: 361, tricks: 1 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  xit('two tricks', () => {\n    const playerA = ['J']\n    const playerB = ['3', 'J']\n    const expected = { status: 'finished', cards: 5, tricks: 2 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  xit('more tricks', () => {\n    const playerA = ['J', '2', '4']\n    const playerB = ['3', 'J', 'A']\n    const expected = { status: 'finished', cards: 12, tricks: 4 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  xit('simple loop with decks of 4 cards', () => {\n    const playerA = ['2', '3', 'J', '6']\n    const playerB = ['K', '5', 'J', '7']\n    const expected = { status: 'loop', cards: 16, tricks: 4 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  // prettier-ignore\n  xit('easy card combination', () => {\n    const playerA = [\n      '4', '8', '7', '5', '4', '10', '3', '9', '7', '3',\n      '10', '10', '6', '8', '2', '8', '5', '4', '5', '9',\n      '6', '5', '2', '8', '10', '9',\n    ]\n    const playerB = [\n      '6', '9', '4', '7', '2', '2', '3', '6', '7', '3',\n      'A', 'A', 'A', 'A', 'K', 'K', 'K', 'K', 'Q', 'Q',\n      'Q', 'Q', 'J', 'J', 'J', 'J',\n    ]\n    const expected = { status: 'finished', cards: 40, tricks: 4 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  // prettier-ignore\n  xit('easy card combination, inverted decks', () => {\n    const playerA = [\n      '3', '3', '5', '7', '3', '2', '10', '7', '6', '7',\n      'A', 'A', 'A', 'A', 'K', 'K', 'K', 'K', 'Q', 'Q',\n      'Q', 'Q', 'J', 'J', 'J', 'J',\n    ]\n    const playerB = [\n      '5', '10', '8', '2', '6', '7', '2', '4', '9', '2',\n      '6', '10', '10', '5', '4', '8', '4', '8', '6', '9',\n      '8', '5', '9', '3', '4', '9',\n    ]\n    const expected = { status: 'finished', cards: 40, tricks: 4 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  // prettier-ignore\n  xit('mirrored decks', () => {\n    const playerA = [\n      '2', 'A', '3', 'A', '3', 'K', '4', 'K', '2', 'Q',\n      '2', 'Q', '10', 'J', '5', 'J', '6', '10', '2', '9',\n      '10', '7', '3', '9', '6', '9',\n    ]\n    const playerB = [\n      '6', 'A', '4', 'A', '7', 'K', '4', 'K', '7', 'Q',\n      '7', 'Q', '5', 'J', '8', 'J', '4', '5', '8', '9',\n      '10', '6', '8', '3', '8', '5',\n    ]\n    const expected = { status: 'finished', cards: 59, tricks: 4 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  // prettier-ignore\n  xit('opposite decks', () => {\n    const playerA = [\n      '4', 'A', '9', 'A', '4', 'K', '9', 'K', '6', 'Q',\n      '8', 'Q', '8', 'J', '10', 'J', '9', '8', '4', '6',\n      '3', '6', '5', '2', '4', '3',\n    ]\n    const playerB = [\n      '10', '7', '3', '2', '9', '2', '7', '8', '7', '5',\n      'J', '7', 'J', '10', 'Q', '10', 'Q', '3', 'K', '5',\n      'K', '6', 'A', '2', 'A', '5',\n    ]\n    const expected = { status: 'finished', cards: 151, tricks: 21 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  // prettier-ignore\n  xit('random decks #1', () => {\n    const playerA = [\n      'K', '10', '9', '8', 'J', '8', '6', '9', '7', 'A',\n      'K', '5', '4', '4', 'J', '5', 'J', '4', '3', '5',\n      '8', '6', '7', '7', '4', '9',\n    ]\n    const playerB = [\n      '6', '3', 'K', 'A', 'Q', '10', 'A', '2', 'Q', '8',\n      '2', '10', '10', '2', 'Q', '3', 'K', '9', '7', 'A',\n      '3', 'Q', '5', 'J', '2', '6',\n    ]\n    const expected = { status: 'finished', cards: 542, tricks: 76 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  // prettier-ignore\n  xit('random decks #2', () => {\n    const playerA = [\n      '8', 'A', '4', '8', '5', 'Q', 'J', '2', '6', '2',\n      '9', '7', 'K', 'A', '8', '10', 'K', '8', '10', '9',\n      'K', '6', '7', '3', 'K', '9',\n    ]\n    const playerB = [\n      '10', '5', '2', '6', 'Q', 'J', 'A', '9', '5', '5',\n      '3', '7', '3', 'J', 'A', '2', 'Q', '3', 'J', 'Q',\n      '4', '10', '4', '7', '4', '6',\n    ]\n    const expected = { status: 'finished', cards: 327, tricks: 42 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  // prettier-ignore\n  xit('Kleber 1999', () => {\n    const playerA = [\n      '4', '8', '9', 'J', 'Q', '8', '5', '5', 'K', '2',\n      'A', '9', '8', '5', '10', 'A', '4', 'J', '3', 'K',\n      '6', '9', '2', 'Q', 'K', '7',\n    ]\n    const playerB = [\n      '10', 'J', '3', '2', '4', '10', '4', '7', '5', '3',\n      '6', '6', '7', 'A', 'J', 'Q', 'A', '7', '2', '10',\n      '3', 'K', '9', '6', '8', 'Q',\n    ]\n    const expected = { status: 'finished', cards: 5790, tricks: 805 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  // prettier-ignore\n  xit('Collins 2006', () => {\n    const playerA = [\n      'A', '8', 'Q', 'K', '9', '10', '3', '7', '4', '2',\n      'Q', '3', '2', '10', '9', 'K', 'A', '8', '7', '7',\n      '4', '5', 'J', '9', '2', '10',\n    ]\n    const playerB = [\n      '4', 'J', 'A', 'K', '8', '5', '6', '6', 'A', '6',\n      '5', 'Q', '4', '6', '10', '8', 'J', '2', '5', '7',\n      'Q', 'J', '3', '3', 'K', '9',\n    ]\n    const expected = { status: 'finished', cards: 6913, tricks: 960 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  // prettier-ignore\n  xit('Mann and Wu 2007', () => {\n    const playerA = [\n      'K', '2', 'K', 'K', '3', '3', '6', '10', 'K', '6',\n      'A', '2', '5', '5', '7', '9', 'J', 'A', 'A', '3',\n      '4', 'Q', '4', '8', 'J', '6',\n    ]\n    const playerB = [\n      '4', '5', '2', 'Q', '7', '9', '9', 'Q', '7', 'J',\n      '9', '8', '10', '3', '10', 'J', '4', '10', '8', '6',\n      '8', '7', 'A', 'Q', '5', '2',\n    ]\n    const expected = { status: 'finished', cards: 7157, tricks: 1007 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  // prettier-ignore\n  xit('Nessler 2012', () => {\n    const playerA = [\n      '10', '3', '6', '7', 'Q', '2', '9', '8', '2', '8',\n      '4', 'A', '10', '6', 'K', '2', '10', 'A', '5', 'A',\n      '2', '4', 'Q', 'J', 'K', '4',\n    ]\n    const playerB = [\n      '10', 'Q', '4', '6', 'J', '9', '3', 'J', '9', '3',\n      '3', 'Q', 'K', '5', '9', '5', 'K', '6', '5', '7',\n      '8', 'J', 'A', '7', '8', '7',\n    ]\n    const expected = { status: 'finished', cards: 7207, tricks: 1015 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  // prettier-ignore\n  xit('Anderson 2013', () => {\n    const playerA = [\n      '6', '7', 'A', '3', 'Q', '3', '5', 'J', '3', '2',\n      'J', '7', '4', '5', 'Q', '10', '5', 'A', 'J', '2',\n      'K', '8', '9', '9', 'K', '3',\n    ]\n    const playerB = [\n      '4', 'J', '6', '9', '8', '5', '10', '7', '9', 'Q',\n      '2', '7', '10', '8', '4', '10', 'A', '6', '4', 'A',\n      '6', '8', 'Q', 'K', 'K', '2',\n    ]\n    const expected = { status: 'finished', cards: 7225, tricks: 1016 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  // prettier-ignore\n  xit('Rucklidge 2014', () => {\n    const playerA = [\n      '8', 'J', '2', '9', '4', '4', '5', '8', 'Q', '3',\n      '9', '3', '6', '2', '8', 'A', 'A', 'A', '9', '4',\n      '7', '2', '5', 'Q', 'Q', '3',\n    ]\n    const playerB = [\n      'K', '7', '10', '6', '3', 'J', 'A', '7', '6', '5',\n      '5', '8', '10', '9', '10', '4', '2', '7', 'K', 'Q',\n      '10', 'K', '6', 'J', 'J', 'K',\n    ]\n    const expected = { status: 'finished', cards: 7959, tricks: 1122 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  // prettier-ignore\n  xit('Nessler 2021', () => {\n    const playerA = [\n      '7', '2', '3', '4', 'K', '9', '6', '10', 'A', '8',\n      '9', 'Q', '7', 'A', '4', '8', 'J', 'J', 'A', '4',\n      '3', '2', '5', '6', '6', 'J',\n    ]\n    const playerB = [\n      '3', '10', '8', '9', '8', 'K', 'K', '2', '5', '5',\n      '7', '6', '4', '3', '5', '7', 'A', '9', 'J', 'K',\n      '2', 'Q', '10', 'Q', '10', 'Q',\n    ]\n    const expected = { status: 'finished', cards: 7972, tricks: 1106 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  // prettier-ignore\n  xit('Nessler 2022', () => {\n    const playerA = [\n      '2', '10', '10', 'A', 'J', '3', '8', 'Q', '2', '5',\n      '5', '5', '9', '2', '4', '3', '10', 'Q', 'A', 'K',\n      'Q', 'J', 'J', '9', 'Q', 'K',\n    ]\n    const playerB = [\n      '10', '7', '6', '3', '6', 'A', '8', '9', '4', '3',\n      'K', 'J', '6', 'K', '4', '9', '7', '8', '5', '7',\n      '8', '2', 'A', '7', '4', '6',\n    ]\n    const expected = { status: 'finished', cards: 8344, tricks: 1164 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n\n  // prettier-ignore\n  xit('Casella 2024, first infinite game found', () => {\n    const playerA = [\n      '2', '8', '4', 'K', '5', '2', '3', 'Q', '6', 'K',\n      'Q', 'A', 'J', '3', '5', '9', '8', '3', 'A', 'A',\n      'J', '4', '4', 'J', '7', '5',\n    ]\n    const playerB = [\n      '7', '7', '8', '6', '10', '10', '6', '10', '7', '2',\n      'Q', '6', '3', '2', '4', 'K', 'Q', '10', 'J', '5',\n      '9', '8', '9', '9', 'K', 'A',\n    ]\n    const expected = { status: 'loop', cards: 474, tricks: 66 }\n    expect(simulateGame(playerA, playerB)).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/camicia/camicia.ts",
    "content": "export const simulateGame = (playerA: unknown, playerB: unknown): unknown => {\n  throw new Error('Remove this statement and implement this function')\n}\n"
  },
  {
    "path": "exercises/practice/camicia/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/camicia/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/camicia/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-camicia\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/camicia/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/camicia/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/circular-buffer/.docs/instructions.md",
    "content": "# Instructions\n\nA circular buffer, cyclic buffer or ring buffer is a data structure that uses a single, fixed-size buffer as if it were connected end-to-end.\n\nA circular buffer first starts empty and of some predefined length.\nFor example, this is a 7-element buffer:\n\n```text\n[ ][ ][ ][ ][ ][ ][ ]\n```\n\nAssume that a 1 is written into the middle of the buffer (exact starting location does not matter in a circular buffer):\n\n```text\n[ ][ ][ ][1][ ][ ][ ]\n```\n\nThen assume that two more elements are added — 2 & 3 — which get appended after the 1:\n\n```text\n[ ][ ][ ][1][2][3][ ]\n```\n\nIf two elements are then removed from the buffer, the oldest values inside the buffer are removed.\nThe two elements removed, in this case, are 1 & 2, leaving the buffer with just a 3:\n\n```text\n[ ][ ][ ][ ][ ][3][ ]\n```\n\nIf the buffer has 7 elements then it is completely full:\n\n```text\n[5][6][7][8][9][3][4]\n```\n\nWhen the buffer is full an error will be raised, alerting the client that further writes are blocked until a slot becomes free.\n\nWhen the buffer is full, the client can opt to overwrite the oldest data with a forced write.\nIn this case, two more elements — A & B — are added and they overwrite the 3 & 4:\n\n```text\n[5][6][7][8][9][A][B]\n```\n\n3 & 4 have been replaced by A & B making 5 now the oldest data in the buffer.\nFinally, if two elements are removed then what would be returned is 5 & 6 yielding the buffer:\n\n```text\n[ ][ ][7][8][9][A][B]\n```\n\nBecause there is space available, if the client again uses overwrite to store C & D then the space where 5 & 6 were stored previously will be used not the location of 7 & 8.\n7 is still the oldest element and the buffer is once again full.\n\n```text\n[C][D][7][8][9][A][B]\n```\n"
  },
  {
    "path": "exercises/practice/circular-buffer/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"jspengeman\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"circular-buffer.ts\"\n    ],\n    \"test\": [\n      \"circular-buffer.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"A data structure that uses a single, fixed-size buffer as if it were connected end-to-end.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Wikipedia\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/Circular_buffer\"\n}\n"
  },
  {
    "path": "exercises/practice/circular-buffer/.meta/proof.ci.ts",
    "content": "interface Buffer<T> {\n  read(): T | undefined\n  write(value: T): void\n  clear(): void\n}\n\nexport class BufferFullError extends Error {\n  constructor() {\n    super('Buffer is full.')\n  }\n}\n\nexport class BufferEmptyError extends Error {\n  constructor() {\n    super('Buffer is empty.')\n  }\n}\n\nexport default class CircularBuffer<T> implements Buffer<T> {\n  private capacity: number\n  private buffer: T[] = []\n\n  constructor(capacity: number) {\n    this.capacity = capacity\n  }\n\n  public read(): T | undefined {\n    if (this.buffer.length === 0) {\n      throw new BufferEmptyError()\n    }\n    return this.buffer.shift()\n  }\n\n  public write(value: T): void {\n    if (this.buffer.length + 1 > this.capacity) {\n      throw new BufferFullError()\n    }\n    this.buffer.push(value)\n  }\n\n  public forceWrite(value: T): void {\n    if (this.buffer.length === this.capacity) {\n      this.read()\n    }\n    this.buffer.push(value)\n  }\n\n  public clear(): void {\n    this.buffer = []\n  }\n}\n"
  },
  {
    "path": "exercises/practice/circular-buffer/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[28268ed4-4ff3-45f3-820e-895b44d53dfa]\ndescription = \"reading empty buffer should fail\"\n\n[2e6db04a-58a1-425d-ade8-ac30b5f318f3]\ndescription = \"can read an item just written\"\n\n[90741fe8-a448-45ce-be2b-de009a24c144]\ndescription = \"each item may only be read once\"\n\n[be0e62d5-da9c-47a8-b037-5db21827baa7]\ndescription = \"items are read in the order they are written\"\n\n[2af22046-3e44-4235-bfe6-05ba60439d38]\ndescription = \"full buffer can't be written to\"\n\n[547d192c-bbf0-4369-b8fa-fc37e71f2393]\ndescription = \"a read frees up capacity for another write\"\n\n[04a56659-3a81-4113-816b-6ecb659b4471]\ndescription = \"read position is maintained even across multiple writes\"\n\n[60c3a19a-81a7-43d7-bb0a-f07242b1111f]\ndescription = \"items cleared out of buffer can't be read\"\n\n[45f3ae89-3470-49f3-b50e-362e4b330a59]\ndescription = \"clear frees up capacity for another write\"\n\n[e1ac5170-a026-4725-bfbe-0cf332eddecd]\ndescription = \"clear does nothing on empty buffer\"\n\n[9c2d4f26-3ec7-453f-a895-7e7ff8ae7b5b]\ndescription = \"overwrite acts like write on non-full buffer\"\n\n[880f916b-5039-475c-bd5c-83463c36a147]\ndescription = \"overwrite replaces the oldest item on full buffer\"\n\n[bfecab5b-aca1-4fab-a2b0-cd4af2b053c3]\ndescription = \"overwrite replaces the oldest item remaining in buffer following a read\"\n\n[9cebe63a-c405-437b-8b62-e3fdc1ecec5a]\ndescription = \"initial clear does not affect wrapping around\"\n"
  },
  {
    "path": "exercises/practice/circular-buffer/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/circular-buffer/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/circular-buffer/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/circular-buffer/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/circular-buffer/circular-buffer.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport CircularBuffer, {\n  BufferFullError,\n  BufferEmptyError,\n} from './circular-buffer.ts'\n\ndescribe('CircularBuffer', () => {\n  it('reading an empty buffer throws a BufferEmptyError', () => {\n    const buffer = new CircularBuffer<string>(1)\n    expect(() => buffer.read()).toThrow(BufferEmptyError)\n  })\n\n  xit('write and read back one item', () => {\n    const buffer = new CircularBuffer<string>(1)\n    buffer.write('1')\n    expect(buffer.read()).toBe('1')\n    expect(() => buffer.read()).toThrow(BufferEmptyError)\n  })\n\n  xit('write and read back multiple items', () => {\n    const buffer = new CircularBuffer<string>(2)\n    buffer.write('1')\n    buffer.write('2')\n    expect(buffer.read()).toBe('1')\n    expect(buffer.read()).toBe('2')\n    expect(() => buffer.read()).toThrow(BufferEmptyError)\n  })\n\n  xit('clearing a buffer', () => {\n    const buffer = new CircularBuffer<string>(2)\n    buffer.write('1')\n    buffer.write('2')\n    buffer.clear()\n    expect(() => buffer.read()).toThrow(BufferEmptyError)\n    buffer.write('3')\n    buffer.write('4')\n    expect(buffer.read()).toBe('3')\n    expect(buffer.read()).toBe('4')\n  })\n\n  xit('alternate write and read', () => {\n    const buffer = new CircularBuffer<string>(2)\n    buffer.write('1')\n    expect(buffer.read()).toBe('1')\n    buffer.write('2')\n    expect(buffer.read()).toBe('2')\n  })\n\n  xit('reads back oldest item', () => {\n    const buffer = new CircularBuffer<string>(3)\n    buffer.write('1')\n    buffer.write('2')\n    buffer.read()\n    buffer.write('3')\n    expect(buffer.read()).toBe('2')\n    expect(buffer.read()).toBe('3')\n  })\n\n  xit('writing to a full buffer throws a BufferFullError', () => {\n    const buffer = new CircularBuffer<string>(2)\n    buffer.write('1')\n    buffer.write('2')\n    expect(() => buffer.write('A')).toThrow(BufferFullError)\n  })\n\n  xit('forced writes over write oldest item in a full buffer', () => {\n    const buffer = new CircularBuffer<string>(2)\n    buffer.write('1')\n    buffer.write('2')\n    buffer.forceWrite('A')\n    expect(buffer.read()).toBe('2')\n    expect(buffer.read()).toBe('A')\n    expect(() => buffer.read()).toThrow(BufferEmptyError)\n  })\n\n  xit('forced writes act like write in a non-full buffer', () => {\n    const buffer = new CircularBuffer<string>(2)\n    buffer.write('1')\n    buffer.forceWrite('2')\n    expect(buffer.read()).toBe('1')\n    expect(buffer.read()).toBe('2')\n    expect(() => buffer.read()).toThrow(BufferEmptyError)\n  })\n\n  xit('alternate force write and read into full buffer', () => {\n    const buffer = new CircularBuffer<string>(5)\n    buffer.write('1')\n    buffer.write('2')\n    buffer.write('3')\n    buffer.read()\n    buffer.read()\n    buffer.write('4')\n    buffer.read()\n    buffer.write('5')\n    buffer.write('6')\n    buffer.write('7')\n    buffer.write('8')\n    buffer.forceWrite('A')\n    buffer.forceWrite('B')\n    expect(buffer.read()).toBe('6')\n    expect(buffer.read()).toBe('7')\n    expect(buffer.read()).toBe('8')\n    expect(buffer.read()).toBe('A')\n    expect(buffer.read()).toBe('B')\n    expect(() => buffer.read()).toThrow(BufferEmptyError)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/circular-buffer/circular-buffer.ts",
    "content": "export default class CircularBuffer<T> {\n  constructor(initial: unknown) {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  write(value: unknown): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  read(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  forceWrite(value: unknown): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  clear(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n\nexport class BufferFullError extends Error {\n  constructor() {\n    super()\n    throw new Error('Remove this line and implement the function')\n  }\n}\n\nexport class BufferEmptyError extends Error {\n  constructor() {\n    super()\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/circular-buffer/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/circular-buffer/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/circular-buffer/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-circular-buffer\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/circular-buffer/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/circular-buffer/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/clock/.docs/instructions.md",
    "content": "# Instructions\n\nImplement a clock that handles times without dates.\n\nYou should be able to add and subtract minutes to it.\n\nTwo clocks that represent the same time should be equal to each other.\n"
  },
  {
    "path": "exercises/practice/clock/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"rwaskiewicz\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"clock.ts\"\n    ],\n    \"test\": [\n      \"clock.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Implement a clock that handles times without dates.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Pairing session with Erin Drummond\"\n}\n"
  },
  {
    "path": "exercises/practice/clock/.meta/proof.ci.ts",
    "content": "export class Clock {\n  private hour!: number\n  private minute!: number\n\n  constructor(hour: number, minute: number = 0) {\n    this.reset()\n    const totalMinutes = hour * 60 + minute\n    this.adjustTime(totalMinutes)\n  }\n\n  private reset(): void {\n    this.hour = 0\n    this.minute = 0\n  }\n\n  public getHour(): number {\n    return this.hour\n  }\n\n  public getMinute(): number {\n    return this.minute\n  }\n\n  public toString(): string {\n    return `${this.formatNumber(this.hour)}:${this.formatNumber(this.minute)}`\n  }\n\n  private formatNumber(numberToFormat: number): string {\n    const numberString = numberToFormat.toString()\n    return numberString.length === 1 ? `0${numberString}` : numberString\n  }\n\n  public plus(minutes: number): Clock {\n    this.adjustTime(minutes)\n    return this\n  }\n\n  public minus(minutes: number): Clock {\n    this.adjustTime(-1 * minutes)\n    return this\n  }\n\n  public equals(clock: Clock): boolean {\n    return this.hour === clock.getHour() && this.minute === clock.getMinute()\n  }\n\n  private adjustTime(delta: number): void {\n    const minutesPerDay = 1440\n    const minutesPerHour = 60\n    const hoursPerDay = 24\n\n    delta = Math.abs(delta) >= minutesPerDay ? delta % minutesPerDay : delta\n\n    const currentMinutes = this.hour * minutesPerHour + this.minute\n    let newMinutes = (currentMinutes + delta) % minutesPerDay\n\n    newMinutes = newMinutes < 0 ? (newMinutes += minutesPerDay) : newMinutes\n\n    this.hour = Math.floor(newMinutes / minutesPerHour) % hoursPerDay\n    this.minute = newMinutes - this.hour * minutesPerHour\n  }\n}\n"
  },
  {
    "path": "exercises/practice/clock/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[a577bacc-106b-496e-9792-b3083ea8705e]\ndescription = \"on the hour\"\n\n[b5d0c360-3b88-489b-8e84-68a1c7a4fa23]\ndescription = \"past the hour\"\n\n[473223f4-65f3-46ff-a9f7-7663c7e59440]\ndescription = \"midnight is zero hours\"\n\n[ca95d24a-5924-447d-9a96-b91c8334725c]\ndescription = \"hour rolls over\"\n\n[f3826de0-0925-4d69-8ac8-89aea7e52b78]\ndescription = \"hour rolls over continuously\"\n\n[a02f7edf-dfd4-4b11-b21a-86de3cc6a95c]\ndescription = \"sixty minutes is next hour\"\n\n[8f520df6-b816-444d-b90f-8a477789beb5]\ndescription = \"minutes roll over\"\n\n[c75c091b-47ac-4655-8d40-643767fc4eed]\ndescription = \"minutes roll over continuously\"\n\n[06343ecb-cf39-419d-a3f5-dcbae0cc4c57]\ndescription = \"hour and minutes roll over\"\n\n[be60810e-f5d9-4b58-9351-a9d1e90e660c]\ndescription = \"hour and minutes roll over continuously\"\n\n[1689107b-0b5c-4bea-aad3-65ec9859368a]\ndescription = \"hour and minutes roll over to exactly midnight\"\n\n[d3088ee8-91b7-4446-9e9d-5e2ad6219d91]\ndescription = \"negative hour\"\n\n[77ef6921-f120-4d29-bade-80d54aa43b54]\ndescription = \"negative hour rolls over\"\n\n[359294b5-972f-4546-bb9a-a85559065234]\ndescription = \"negative hour rolls over continuously\"\n\n[509db8b7-ac19-47cc-bd3a-a9d2f30b03c0]\ndescription = \"negative minutes\"\n\n[5d6bb225-130f-4084-84fd-9e0df8996f2a]\ndescription = \"negative minutes roll over\"\n\n[d483ceef-b520-4f0c-b94a-8d2d58cf0484]\ndescription = \"negative minutes roll over continuously\"\n\n[1cd19447-19c6-44bf-9d04-9f8305ccb9ea]\ndescription = \"negative sixty minutes is previous hour\"\n\n[9d3053aa-4f47-4afc-bd45-d67a72cef4dc]\ndescription = \"negative hour and minutes both roll over\"\n\n[51d41fcf-491e-4ca0-9cae-2aa4f0163ad4]\ndescription = \"negative hour and minutes both roll over continuously\"\n\n[d098e723-ad29-4ef9-997a-2693c4c9d89a]\ndescription = \"add minutes\"\n\n[b6ec8f38-e53e-4b22-92a7-60dab1f485f4]\ndescription = \"add no minutes\"\n\n[efd349dd-0785-453e-9ff8-d7452a8e7269]\ndescription = \"add to next hour\"\n\n[749890f7-aba9-4702-acce-87becf4ef9fe]\ndescription = \"add more than one hour\"\n\n[da63e4c1-1584-46e3-8d18-c9dc802c1713]\ndescription = \"add more than two hours with carry\"\n\n[be167a32-3d33-4cec-a8bc-accd47ddbb71]\ndescription = \"add across midnight\"\n\n[6672541e-cdae-46e4-8be7-a820cc3be2a8]\ndescription = \"add more than one day (1500 min = 25 hrs)\"\n\n[1918050d-c79b-4cb7-b707-b607e2745c7e]\ndescription = \"add more than two days\"\n\n[37336cac-5ede-43a5-9026-d426cbe40354]\ndescription = \"subtract minutes\"\n\n[0aafa4d0-3b5f-4b12-b3af-e3a9e09c047b]\ndescription = \"subtract to previous hour\"\n\n[9b4e809c-612f-4b15-aae0-1df0acb801b9]\ndescription = \"subtract more than an hour\"\n\n[8b04bb6a-3d33-4e6c-8de9-f5de6d2c70d6]\ndescription = \"subtract across midnight\"\n\n[07c3bbf7-ce4d-4658-86e8-4a77b7a5ccd9]\ndescription = \"subtract more than two hours\"\n\n[90ac8a1b-761c-4342-9c9c-cdc3ed5db097]\ndescription = \"subtract more than two hours with borrow\"\n\n[2149f985-7136-44ad-9b29-ec023a97a2b7]\ndescription = \"subtract more than one day (1500 min = 25 hrs)\"\n\n[ba11dbf0-ac27-4acb-ada9-3b853ec08c97]\ndescription = \"subtract more than two days\"\n\n[f2fdad51-499f-4c9b-a791-b28c9282e311]\ndescription = \"clocks with same time\"\n\n[5d409d4b-f862-4960-901e-ec430160b768]\ndescription = \"clocks a minute apart\"\n\n[a6045fcf-2b52-4a47-8bb2-ef10a064cba5]\ndescription = \"clocks an hour apart\"\n\n[66b12758-0be5-448b-a13c-6a44bce83527]\ndescription = \"clocks with hour overflow\"\n\n[2b19960c-212e-4a71-9aac-c581592f8111]\ndescription = \"clocks with hour overflow by several days\"\n\n[6f8c6541-afac-4a92-b0c2-b10d4e50269f]\ndescription = \"clocks with negative hour\"\n\n[bb9d5a68-e324-4bf5-a75e-0e9b1f97a90d]\ndescription = \"clocks with negative hour that wraps\"\n\n[56c0326d-565b-4d19-a26f-63b3205778b7]\ndescription = \"clocks with negative hour that wraps multiple times\"\n\n[c90b9de8-ddff-4ffe-9858-da44a40fdbc2]\ndescription = \"clocks with minute overflow\"\n\n[533a3dc5-59a7-491b-b728-a7a34fe325de]\ndescription = \"clocks with minute overflow by several days\"\n\n[fff49e15-f7b7-4692-a204-0f6052d62636]\ndescription = \"clocks with negative minute\"\n\n[605c65bb-21bd-43eb-8f04-878edf508366]\ndescription = \"clocks with negative minute that wraps\"\n\n[b87e64ed-212a-4335-91fd-56da8421d077]\ndescription = \"clocks with negative minute that wraps multiple times\"\n\n[822fbf26-1f3b-4b13-b9bf-c914816b53dd]\ndescription = \"clocks with negative hours and minutes\"\n\n[e787bccd-cf58-4a1d-841c-ff80eaaccfaa]\ndescription = \"clocks with negative hours and minutes that wrap\"\n\n[96969ca8-875a-48a1-86ae-257a528c44f5]\ndescription = \"full clock and zeroed clock\"\n"
  },
  {
    "path": "exercises/practice/clock/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/clock/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/clock/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/clock/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/clock/clock.test.ts",
    "content": "import { describe, xdescribe, it, expect, xit } from '@jest/globals'\nimport { Clock } from './clock.ts'\n\ndescribe('Clock', () => {\n  describe('Creating a new clock with an initial time', () => {\n    it('on the hour', () => {\n      expect(new Clock(8).toString()).toEqual('08:00')\n    })\n\n    xit('past the hour', () => {\n      expect(new Clock(11, 9).toString()).toEqual('11:09')\n    })\n\n    xit('midnight is zero hours', () => {\n      expect(new Clock(24, 0).toString()).toEqual('00:00')\n    })\n\n    xit('hour rolls over', () => {\n      expect(new Clock(25, 0).toString()).toEqual('01:00')\n    })\n\n    xit('hour rolls over continuously', () => {\n      expect(new Clock(100, 0).toString()).toEqual('04:00')\n    })\n\n    xit('sixty minutes is next hour', () => {\n      expect(new Clock(1, 60).toString()).toEqual('02:00')\n    })\n\n    xit('minutes roll over', () => {\n      expect(new Clock(0, 160).toString()).toEqual('02:40')\n    })\n\n    xit('minutes roll over continuously', () => {\n      expect(new Clock(0, 1723).toString()).toEqual('04:43')\n    })\n\n    xit('hour and minutes roll over', () => {\n      expect(new Clock(25, 160).toString()).toEqual('03:40')\n    })\n\n    xit('hour and minutes roll over continuously', () => {\n      expect(new Clock(201, 3001).toString()).toEqual('11:01')\n    })\n\n    xit('hour and minutes roll over to exactly midnight', () => {\n      expect(new Clock(72, 8640).toString()).toEqual('00:00')\n    })\n\n    xit('negative hour', () => {\n      expect(new Clock(-1, 15).toString()).toEqual('23:15')\n    })\n\n    xit('negative hour rolls over', () => {\n      expect(new Clock(-25, 0).toString()).toEqual('23:00')\n    })\n\n    xit('negative hour rolls over continuously', () => {\n      expect(new Clock(-91, 0).toString()).toEqual('05:00')\n    })\n\n    xit('negative minutes', () => {\n      expect(new Clock(1, -40).toString()).toEqual('00:20')\n    })\n\n    xit('negative minutes rolls over', () => {\n      expect(new Clock(1, -160).toString()).toEqual('22:20')\n    })\n\n    xit('negative minutes rolls over continuously', () => {\n      expect(new Clock(1, -4820).toString()).toEqual('16:40')\n    })\n\n    xit('negative hour and minutes both roll over', () => {\n      expect(new Clock(-25, -160).toString()).toEqual('20:20')\n    })\n\n    xit('negative hour and minutes both roll over continuously', () => {\n      expect(new Clock(-121, -5810).toString()).toEqual('22:10')\n    })\n\n    xdescribe('Adding and subtracting minutes', () => {\n      xit('add minutes', () => {\n        expect(new Clock(10, 0).plus(3).toString()).toEqual('10:03')\n      })\n\n      xit('add no minutes', () => {\n        expect(new Clock(6, 41).plus(0).toString()).toEqual('06:41')\n      })\n\n      xit('add to next hour', () => {\n        expect(new Clock(0, 45).plus(40).toString()).toEqual('01:25')\n      })\n\n      xit('add more than one hour', () => {\n        expect(new Clock(10, 0).plus(61).toString()).toEqual('11:01')\n      })\n\n      xit('add more than two hours with carry', () => {\n        expect(new Clock(0, 45).plus(160).toString()).toEqual('03:25')\n      })\n\n      xit('add across midnight', () => {\n        expect(new Clock(23, 59).plus(2).toString()).toEqual('00:01')\n      })\n\n      xit('add more than one day (1500 min = 25 hrs)', () => {\n        expect(new Clock(5, 32).plus(1500).toString()).toEqual('06:32')\n      })\n\n      xit('add more than two days', () => {\n        expect(new Clock(1, 1).plus(3500).toString()).toEqual('11:21')\n      })\n\n      xit('subtract minutes', () => {\n        expect(new Clock(10, 3).minus(3).toString()).toEqual('10:00')\n      })\n\n      xit('subtract to previous hour', () => {\n        expect(new Clock(10, 3).minus(30).toString()).toEqual('09:33')\n      })\n\n      xit('subtract more than an hour', () => {\n        expect(new Clock(10, 3).minus(70).toString()).toEqual('08:53')\n      })\n\n      xit('subtract across midnight', () => {\n        expect(new Clock(0, 3).minus(4).toString()).toEqual('23:59')\n      })\n\n      xit('subtract more than two hours', () => {\n        expect(new Clock(0, 0).minus(160).toString()).toEqual('21:20')\n      })\n\n      xit('subtract more than two hours with borrow', () => {\n        expect(new Clock(6, 15).minus(160).toString()).toEqual('03:35')\n      })\n\n      xit('subtract more than one day (1500 min = 25 hrs)', () => {\n        expect(new Clock(5, 32).minus(1500).toString()).toEqual('04:32')\n      })\n\n      xit('subtract more than two days', () => {\n        expect(new Clock(2, 20).minus(3000).toString()).toEqual('00:20')\n      })\n    })\n\n    xdescribe('Construct two separate clocks, set times, test if they are equal', () => {\n      xit('clocks with same time', () => {\n        expect(new Clock(15, 37).equals(new Clock(15, 37))).toBeTruthy()\n      })\n\n      xit('clocks a minute apart', () => {\n        expect(new Clock(15, 36).equals(new Clock(15, 37))).toBeFalsy()\n      })\n\n      xit('clocks an hour apart', () => {\n        expect(new Clock(14, 37).equals(new Clock(15, 37))).toBeFalsy()\n      })\n\n      xit('clocks with hour overflow', () => {\n        expect(new Clock(10, 37).equals(new Clock(34, 37))).toBeTruthy()\n      })\n\n      xit('clocks with hour overflow by several days', () => {\n        expect(new Clock(3, 11).equals(new Clock(99, 11))).toBeTruthy()\n      })\n\n      xit('clocks with negative hour', () => {\n        expect(new Clock(22, 40).equals(new Clock(-2, 40))).toBeTruthy()\n      })\n\n      xit('clocks with negative hour that wraps', () => {\n        expect(new Clock(17, 3).equals(new Clock(-31, 3))).toBeTruthy()\n      })\n\n      xit('clocks with negative hour that wraps multiple times', () => {\n        expect(new Clock(13, 49).equals(new Clock(-83, 49))).toBeTruthy()\n      })\n\n      xit('clocks with minute overflow', () => {\n        expect(new Clock(0, 1).equals(new Clock(0, 1441))).toBeTruthy()\n      })\n\n      xit('clocks with minute overflow by several days', () => {\n        expect(new Clock(2, 2).equals(new Clock(2, 4322))).toBeTruthy()\n      })\n\n      xit('clocks with negative minute', () => {\n        expect(new Clock(2, 40).equals(new Clock(3, -20))).toBeTruthy()\n      })\n\n      xit('clocks with negative minute that wraps', () => {\n        expect(new Clock(4, 10).equals(new Clock(5, -1490))).toBeTruthy()\n      })\n\n      xit('clocks with negative minute that wraps multiple times', () => {\n        expect(new Clock(6, 15).equals(new Clock(6, -4305))).toBeTruthy()\n      })\n\n      xit('clocks with negative hours and minutes', () => {\n        expect(new Clock(7, 32).equals(new Clock(-12, -268))).toBeTruthy()\n      })\n\n      xit('clocks with negative hours and minutes that wrap', () => {\n        expect(new Clock(18, 7).equals(new Clock(-54, -11513))).toBeTruthy()\n      })\n    })\n  })\n})\n"
  },
  {
    "path": "exercises/practice/clock/clock.ts",
    "content": "export class Clock {\n  constructor(hour: unknown, minute?: unknown) {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public toString(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public plus(minutes: unknown): Clock {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public minus(minutes: unknown): Clock {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public equals(other: unknown): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/clock/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/clock/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/clock/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-clock\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/clock/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/clock/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/collatz-conjecture/.docs/instructions.md",
    "content": "# Instructions\n\nGiven a positive integer, return the number of steps it takes to reach 1 according to the rules of the Collatz Conjecture.\n"
  },
  {
    "path": "exercises/practice/collatz-conjecture/.docs/introduction.md",
    "content": "# Introduction\n\nOne evening, you stumbled upon an old notebook filled with cryptic scribbles, as though someone had been obsessively chasing an idea.\nOn one page, a single question stood out: **Can every number find its way to 1?**\nIt was tied to something called the **Collatz Conjecture**, a puzzle that has baffled thinkers for decades.\n\nThe rules were deceptively simple.\nPick any positive integer.\n\n- If it's even, divide it by 2.\n- If it's odd, multiply it by 3 and add 1.\n\nThen, repeat these steps with the result, continuing indefinitely.\n\nCurious, you picked number 12 to test and began the journey:\n\n12 ➜ 6 ➜ 3 ➜ 10 ➜ 5 ➜ 16 ➜ 8 ➜ 4 ➜ 2 ➜ 1\n\nCounting from the second number (6), it took 9 steps to reach 1, and each time the rules repeated, the number kept changing.\nAt first, the sequence seemed unpredictable — jumping up, down, and all over.\nYet, the conjecture claims that no matter the starting number, we'll always end at 1.\n\nIt was fascinating, but also puzzling.\nWhy does this always seem to work?\nCould there be a number where the process breaks down, looping forever or escaping into infinity?\nThe notebook suggested solving this could reveal something profound — and with it, fame, [fortune][collatz-prize], and a place in history awaits whoever could unlock its secrets.\n\n[collatz-prize]: https://mathprize.net/posts/collatz-conjecture/\n"
  },
  {
    "path": "exercises/practice/collatz-conjecture/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"collatz-conjecture.ts\"\n    ],\n    \"test\": [\n      \"collatz-conjecture.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Calculate the number of steps to reach 1 using the Collatz conjecture.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Wikipedia\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/Collatz_conjecture\"\n}\n"
  },
  {
    "path": "exercises/practice/collatz-conjecture/.meta/proof.ci.ts",
    "content": "export function steps(n: number): number {\n  if (n <= 0 || !Number.isInteger(n)) {\n    throw new Error('Only positive integers are allowed')\n  }\n  return calculateStepsRecursively(n, 0)\n}\n\nfunction calculateStepsRecursively(n: number, count: number): number {\n  if (n === 1) {\n    return count\n  } else if (n % 2 === 0) {\n    return calculateStepsRecursively(n / 2, ++count)\n  } else {\n    return calculateStepsRecursively(n * 3 + 1, ++count)\n  }\n}\n"
  },
  {
    "path": "exercises/practice/collatz-conjecture/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[540a3d51-e7a6-47a5-92a3-4ad1838f0bfd]\ndescription = \"zero steps for one\"\n\n[3d76a0a6-ea84-444a-821a-f7857c2c1859]\ndescription = \"divide if even\"\n\n[754dea81-123c-429e-b8bc-db20b05a87b9]\ndescription = \"even and odd steps\"\n\n[ecfd0210-6f85-44f6-8280-f65534892ff6]\ndescription = \"large number of even and odd steps\"\n\n[7d4750e6-def9-4b86-aec7-9f7eb44f95a3]\ndescription = \"zero is an error\"\ninclude = false\n\n[2187673d-77d6-4543-975e-66df6c50e2da]\ndescription = \"zero is an error\"\nreimplements = \"7d4750e6-def9-4b86-aec7-9f7eb44f95a3\"\n\n[c6c795bf-a288-45e9-86a1-841359ad426d]\ndescription = \"negative value is an error\"\ninclude = false\n\n[ec11f479-56bc-47fd-a434-bcd7a31a7a2e]\ndescription = \"negative value is an error\"\nreimplements = \"c6c795bf-a288-45e9-86a1-841359ad426d\"\n"
  },
  {
    "path": "exercises/practice/collatz-conjecture/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/collatz-conjecture/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/collatz-conjecture/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/collatz-conjecture/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/collatz-conjecture/collatz-conjecture.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { steps } from './collatz-conjecture.ts'\n\ndescribe('CollatzConjecture', () => {\n  it('zero steps for one', () => {\n    const expected = 0\n    expect(steps(1)).toBe(expected)\n  })\n\n  xit('divide if even', () => {\n    const expected = 4\n    expect(steps(16)).toBe(expected)\n  })\n\n  xit('even and odd steps', () => {\n    const expected = 9\n    expect(steps(12)).toBe(expected)\n  })\n\n  xit('Large number of even and odd steps', () => {\n    const expected = 152\n    expect(steps(1000000)).toBe(expected)\n  })\n\n  xit('zero is an error', () => {\n    const expected = 'Only positive integers are allowed'\n    expect(() => {\n      steps(0)\n    }).toThrow(expected)\n  })\n\n  xit('negative value is an error', () => {\n    const expected = 'Only positive integers are allowed'\n    expect(() => {\n      steps(-15)\n    }).toThrow(expected)\n  })\n\n  xit('non-integer value is an error', () => {\n    const expected = 'Only positive integers are allowed'\n    expect(() => {\n      steps(3.1415)\n    }).toThrow(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/collatz-conjecture/collatz-conjecture.ts",
    "content": "export function steps(count: unknown): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/collatz-conjecture/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/collatz-conjecture/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/collatz-conjecture/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-collatz-conjecture\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/collatz-conjecture/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/collatz-conjecture/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/complex-numbers/.docs/instructions.md",
    "content": "# Instructions\n\nA **complex number** is expressed in the form `z = a + b * i`, where:\n\n- `a` is the **real part** (a real number),\n\n- `b` is the **imaginary part** (also a real number), and\n\n- `i` is the **imaginary unit** satisfying `i^2 = -1`.\n\n## Operations on Complex Numbers\n\n### Conjugate\n\nThe conjugate of the complex number `z = a + b * i` is given by:\n\n```text\nzc = a - b * i\n```\n\n### Absolute Value\n\nThe absolute value (or modulus) of `z` is defined as:\n\n```text\n|z| = sqrt(a^2 + b^2)\n```\n\nThe square of the absolute value is computed as the product of `z` and its conjugate `zc`:\n\n```text\n|z|^2 = z * zc = a^2 + b^2\n```\n\n### Addition\n\nThe sum of two complex numbers `z1 = a + b * i` and `z2 = c + d * i` is computed by adding their real and imaginary parts separately:\n\n```text\nz1 + z2 = (a + b * i) + (c + d * i)\n        = (a + c) + (b + d) * i\n```\n\n### Subtraction\n\nThe difference of two complex numbers is obtained by subtracting their respective parts:\n\n```text\nz1 - z2 = (a + b * i) - (c + d * i)\n        = (a - c) + (b - d) * i\n```\n\n### Multiplication\n\nThe product of two complex numbers is defined as:\n\n```text\nz1 * z2 = (a + b * i) * (c + d * i)\n        = (a * c - b * d) + (b * c + a * d) * i\n```\n\n### Reciprocal\n\nThe reciprocal of a non-zero complex number is given by:\n\n```text\n1 / z = 1 / (a + b * i)\n      = a / (a^2 + b^2) - b / (a^2 + b^2) * i\n```\n\n### Division\n\nThe division of one complex number by another is given by:\n\n```text\nz1 / z2 = z1 * (1 / z2)\n        = (a + b * i) / (c + d * i)\n        = (a * c + b * d) / (c^2 + d^2) + (b * c - a * d) / (c^2 + d^2) * i\n```\n\n### Exponentiation\n\nRaising _e_ (the base of the natural logarithm) to a complex exponent can be expressed using Euler's formula:\n\n```text\ne^(a + b * i) = e^a * e^(b * i)\n              = e^a * (cos(b) + i * sin(b))\n```\n\n## Implementation Requirements\n\nGiven that you should not use built-in support for complex numbers, implement the following operations:\n\n- **addition** of two complex numbers\n- **subtraction** of two complex numbers\n- **multiplication** of two complex numbers\n- **division** of two complex numbers\n- **conjugate** of a complex number\n- **absolute value** of a complex number\n- **exponentiation** of _e_ (the base of the natural logarithm) to a complex number\n"
  },
  {
    "path": "exercises/practice/complex-numbers/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"complex-numbers.ts\"\n    ],\n    \"test\": [\n      \"complex-numbers.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Implement complex numbers.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Wikipedia\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/Complex_number\"\n}\n"
  },
  {
    "path": "exercises/practice/complex-numbers/.meta/proof.ci.ts",
    "content": "export class ComplexNumber {\n  public readonly real: number\n  public readonly imag: number\n\n  constructor(real: number, imag: number) {\n    this.real = real\n    this.imag = imag\n  }\n\n  public add(other: ComplexNumber): ComplexNumber {\n    return new ComplexNumber(this.real + other.real, this.imag + other.imag)\n  }\n\n  public sub(other: ComplexNumber): ComplexNumber {\n    return new ComplexNumber(this.real - other.real, this.imag - other.imag)\n  }\n\n  public mul(other: ComplexNumber): ComplexNumber {\n    return new ComplexNumber(\n      this.real * other.real - this.imag * other.imag,\n      this.imag * other.real + this.real * other.imag\n    )\n  }\n\n  public div(other: ComplexNumber): ComplexNumber {\n    return new ComplexNumber(\n      (this.real * other.real + this.imag * other.imag) /\n        (other.real * other.real + other.imag * other.imag),\n      (this.imag * other.real - this.real * other.imag) /\n        (other.real * other.real + other.imag * other.imag)\n    )\n  }\n\n  public get abs(): number {\n    return Math.sqrt(this.real * this.real + this.imag * this.imag)\n  }\n\n  public get conj(): ComplexNumber {\n    return new ComplexNumber(this.real, this.imag !== 0 ? -this.imag : 0)\n  }\n\n  public get exp(): ComplexNumber {\n    return new ComplexNumber(\n      Math.exp(this.real) * Math.cos(this.imag),\n      Math.exp(this.real) * Math.sin(this.imag)\n    )\n  }\n}\n"
  },
  {
    "path": "exercises/practice/complex-numbers/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[9f98e133-eb7f-45b0-9676-cce001cd6f7a]\ndescription = \"Real part of a purely real number\"\n\n[07988e20-f287-4bb7-90cf-b32c4bffe0f3]\ndescription = \"Real part of a purely imaginary number\"\n\n[4a370e86-939e-43de-a895-a00ca32da60a]\ndescription = \"Real part of a number with real and imaginary part\"\n\n[9b3fddef-4c12-4a99-b8f8-e3a42c7ccef6]\ndescription = \"Imaginary part of a purely real number\"\n\n[a8dafedd-535a-4ed3-8a39-fda103a2b01e]\ndescription = \"Imaginary part of a purely imaginary number\"\n\n[0f998f19-69ee-4c64-80ef-01b086feab80]\ndescription = \"Imaginary part of a number with real and imaginary part\"\n\n[a39b7fd6-6527-492f-8c34-609d2c913879]\ndescription = \"Imaginary unit\"\n\n[9a2c8de9-f068-4f6f-b41c-82232cc6c33e]\ndescription = \"Add purely real numbers\"\n\n[657c55e1-b14b-4ba7-bd5c-19db22b7d659]\ndescription = \"Add purely imaginary numbers\"\n\n[4e1395f5-572b-4ce8-bfa9-9a63056888da]\ndescription = \"Add numbers with real and imaginary part\"\n\n[1155dc45-e4f7-44b8-af34-a91aa431475d]\ndescription = \"Subtract purely real numbers\"\n\n[f95e9da8-acd5-4da4-ac7c-c861b02f774b]\ndescription = \"Subtract purely imaginary numbers\"\n\n[f876feb1-f9d1-4d34-b067-b599a8746400]\ndescription = \"Subtract numbers with real and imaginary part\"\n\n[8a0366c0-9e16-431f-9fd7-40ac46ff4ec4]\ndescription = \"Multiply purely real numbers\"\n\n[e560ed2b-0b80-4b4f-90f2-63cefc911aaf]\ndescription = \"Multiply purely imaginary numbers\"\n\n[4d1d10f0-f8d4-48a0-b1d0-f284ada567e6]\ndescription = \"Multiply numbers with real and imaginary part\"\n\n[b0571ddb-9045-412b-9c15-cd1d816d36c1]\ndescription = \"Divide purely real numbers\"\n\n[5bb4c7e4-9934-4237-93cc-5780764fdbdd]\ndescription = \"Divide purely imaginary numbers\"\n\n[c4e7fef5-64ac-4537-91c2-c6529707701f]\ndescription = \"Divide numbers with real and imaginary part\"\n\n[c56a7332-aad2-4437-83a0-b3580ecee843]\ndescription = \"Absolute value of a positive purely real number\"\n\n[cf88d7d3-ee74-4f4e-8a88-a1b0090ecb0c]\ndescription = \"Absolute value of a negative purely real number\"\n\n[bbe26568-86c1-4bb4-ba7a-da5697e2b994]\ndescription = \"Absolute value of a purely imaginary number with positive imaginary part\"\n\n[3b48233d-468e-4276-9f59-70f4ca1f26f3]\ndescription = \"Absolute value of a purely imaginary number with negative imaginary part\"\n\n[fe400a9f-aa22-4b49-af92-51e0f5a2a6d3]\ndescription = \"Absolute value of a number with real and imaginary part\"\n\n[fb2d0792-e55a-4484-9443-df1eddfc84a2]\ndescription = \"Conjugate a purely real number\"\n\n[e37fe7ac-a968-4694-a460-66cb605f8691]\ndescription = \"Conjugate a purely imaginary number\"\n\n[f7704498-d0be-4192-aaf5-a1f3a7f43e68]\ndescription = \"Conjugate a number with real and imaginary part\"\n\n[6d96d4c6-2edb-445b-94a2-7de6d4caaf60]\ndescription = \"Euler's identity/formula\"\n\n[2d2c05a0-4038-4427-a24d-72f6624aa45f]\ndescription = \"Exponential of 0\"\n\n[ed87f1bd-b187-45d6-8ece-7e331232c809]\ndescription = \"Exponential of a purely real number\"\n\n[08eedacc-5a95-44fc-8789-1547b27a8702]\ndescription = \"Exponential of a number with real and imaginary part\"\n"
  },
  {
    "path": "exercises/practice/complex-numbers/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/complex-numbers/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/complex-numbers/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/complex-numbers/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/complex-numbers/complex-numbers.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { ComplexNumber } from './complex-numbers.ts'\n\ndescribe('Complex numbers', () => {\n  it('Real part of a purely real number', () => {\n    const expected = 1\n    const actual = new ComplexNumber(1, 0).real\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Real part of a purely imaginary number', () => {\n    const expected = 0\n    const actual = new ComplexNumber(0, 1).real\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Real part of a number with real and imaginary part', () => {\n    const expected = 1\n    const actual = new ComplexNumber(1, 2).real\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Imaginary part of a purely real number', () => {\n    const expected = 0\n    const actual = new ComplexNumber(1, 0).imag\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Imaginary part of a purely imaginary number', () => {\n    const expected = 1\n    const actual = new ComplexNumber(0, 1).imag\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Imaginary part of a number with real and imaginary part', () => {\n    const expected = 2\n    const actual = new ComplexNumber(1, 2).imag\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Add purely real numbers', () => {\n    const expected = new ComplexNumber(3, 0)\n    const actual = new ComplexNumber(1, 0).add(new ComplexNumber(2, 0))\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Add purely imaginary numbers', () => {\n    const expected = new ComplexNumber(0, 3)\n    const actual = new ComplexNumber(0, 1).add(new ComplexNumber(0, 2))\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Add numbers with real and imaginary part', () => {\n    const expected = new ComplexNumber(4, 6)\n    const actual = new ComplexNumber(1, 2).add(new ComplexNumber(3, 4))\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Subtract purely real numbers', () => {\n    const expected = new ComplexNumber(-1, 0)\n    const actual = new ComplexNumber(1, 0).sub(new ComplexNumber(2, 0))\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Subtract purely imaginary numbers', () => {\n    const expected = new ComplexNumber(0, -1)\n    const actual = new ComplexNumber(0, 1).sub(new ComplexNumber(0, 2))\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Subtract numbers with real and imaginary part', () => {\n    const expected = new ComplexNumber(-2, -2)\n    const actual = new ComplexNumber(1, 2).sub(new ComplexNumber(3, 4))\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Multiply purely real numbers', () => {\n    const expected = new ComplexNumber(2, 0)\n    const actual = new ComplexNumber(1, 0).mul(new ComplexNumber(2, 0))\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Multiply imaginary unit', () => {\n    const expected = new ComplexNumber(-1, 0)\n    const actual = new ComplexNumber(0, 1).mul(new ComplexNumber(0, 1))\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Multiply purely imaginary numbers', () => {\n    const expected = new ComplexNumber(-2, 0)\n    const actual = new ComplexNumber(0, 1).mul(new ComplexNumber(0, 2))\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Multiply numbers with real and imaginary part', () => {\n    const expected = new ComplexNumber(-5, 10)\n    const actual = new ComplexNumber(1, 2).mul(new ComplexNumber(3, 4))\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Divide purely real numbers', () => {\n    const expected = new ComplexNumber(0.5, 0)\n    const actual = new ComplexNumber(1, 0).div(new ComplexNumber(2, 0))\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Divide purely imaginary numbers', () => {\n    const expected = new ComplexNumber(0.5, 0)\n    const actual = new ComplexNumber(0, 1).div(new ComplexNumber(0, 2))\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Divide numbers with real and imaginary part', () => {\n    const expected = new ComplexNumber(0.44, 0.08)\n    const actual = new ComplexNumber(1, 2).div(new ComplexNumber(3, 4))\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Absolute value of a positive purely real number', () => {\n    const expected = 5\n    const actual = new ComplexNumber(5, 0).abs\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Absolute value of a negative purely real number', () => {\n    const expected = 5\n    const actual = new ComplexNumber(-5, 0).abs\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Absolute value of a purely imaginary number with positive imaginary part', () => {\n    const expected = 5\n    const actual = new ComplexNumber(0, 5).abs\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Absolute value of a purely imaginary number with negative imaginary part', () => {\n    const expected = 5\n    const actual = new ComplexNumber(0, -5).abs\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Absolute value of a number with real and imaginary part', () => {\n    const expected = 5\n    const actual = new ComplexNumber(3, 4).abs\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Conjugate a purely real number', () => {\n    const expected = new ComplexNumber(5, 0)\n    const actual = new ComplexNumber(5, 0).conj\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Conjugate a purely imaginary number', () => {\n    const expected = new ComplexNumber(0, -5)\n    const actual = new ComplexNumber(0, 5).conj\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit('Conjugate a number with real and imaginary part', () => {\n    const expected = new ComplexNumber(1, -1)\n    const actual = new ComplexNumber(1, 1).conj\n\n    expect(actual).toEqual(expected)\n  })\n\n  xit(\"Euler's identity/formula\", () => {\n    const expected = new ComplexNumber(-1, 0)\n    const actual = new ComplexNumber(0, Math.PI).exp\n\n    expect(actual.real).toBeCloseTo(expected.real)\n    expect(actual.imag).toBeCloseTo(expected.imag)\n  })\n\n  xit('Exponential of 0', () => {\n    const expected = new ComplexNumber(1, 0)\n    const actual = new ComplexNumber(0, 0).exp\n\n    expect(actual.real).toBeCloseTo(expected.real)\n    expect(actual.imag).toBeCloseTo(expected.imag)\n  })\n\n  xit('Exponential of a purely real number', () => {\n    const expected = new ComplexNumber(Math.E, 0)\n    const actual = new ComplexNumber(1, 0).exp\n\n    expect(actual.real).toBeCloseTo(expected.real)\n    expect(actual.imag).toBeCloseTo(expected.imag)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/complex-numbers/complex-numbers.ts",
    "content": "export class ComplexNumber {\n  constructor(real: unknown, imaginary: unknown) {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public get real(): number {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public get imag(): number {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public add(other: unknown): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public sub(other: unknown): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public div(other: unknown): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public mul(other: unknown): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public get abs(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public get conj(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public get exp(): ComplexNumber {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/complex-numbers/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/complex-numbers/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/complex-numbers/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-complex-numbers\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/complex-numbers/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/complex-numbers/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/connect/.docs/instructions.md",
    "content": "# Instructions\n\nCompute the result for a game of Hex / Polygon.\n\nThe abstract boardgame known as [Hex][hex] / Polygon / CON-TAC-TIX is quite simple in rules, though complex in practice.\nTwo players place stones on a parallelogram with hexagonal fields.\nThe player to connect his/her stones to the opposite side first wins.\nThe four sides of the parallelogram are divided between the two players (i.e. one player gets assigned a side and the side directly opposite it and the other player gets assigned the two other sides).\n\nYour goal is to build a program that given a simple representation of a board computes the winner (or lack thereof).\nNote that all games need not be \"fair\".\n(For example, players may have mismatched piece counts or the game's board might have a different width and height.)\n\nThe boards look like this:\n\n```text\n. O . X .\n . X X O .\n  O O O X .\n   . X O X O\n    X O O O X\n```\n\n\"Player `O`\" plays from top to bottom, \"Player `X`\" plays from left to right.\nIn the above example `O` has made a connection from left to right but nobody has won since `O` didn't connect top and bottom.\n\n[hex]: https://en.wikipedia.org/wiki/Hex_%28board_game%29\n"
  },
  {
    "path": "exercises/practice/connect/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"connect.ts\"\n    ],\n    \"test\": [\n      \"connect.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Compute the result for a game of Hex / Polygon.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  }\n}\n"
  },
  {
    "path": "exercises/practice/connect/.meta/proof.ci.ts",
    "content": "/**\n * \"Player O\" plays from top to bottom, \"Player X\" plays from left to right.\n * @param board\n */\nexport class Board {\n  private board: string[][]\n\n  constructor(board: string[]) {\n    this.board = board.map((b) => [...b])\n  }\n\n  public winner(): '' | 'X' | 'O' {\n    const players = ['X', 'O'] as const\n    for (const player of players) {\n      if (this.checkWin(player)) {\n        return player\n      }\n    }\n    return ''\n  }\n\n  private checkWin(player: 'X' | 'O'): boolean {\n    const positions = this.startPositions(player)\n    for (const position of positions) {\n      if (this.search(position, player, [])) {\n        return true\n      }\n    }\n    return false\n  }\n\n  private search(\n    pos: { x: number; y: number },\n    XorO: 'X' | 'O',\n    checked: Array<{ x: number; y: number }>\n  ): boolean {\n    if (!this.matches(pos, XorO)) {\n      return false\n    }\n    if (this.winningSpot(pos, XorO)) {\n      return true\n    }\n    checked = checked.slice(0)\n    checked.push(pos)\n    const matches = this.neighbors(pos).filter(\n      ({ x, y }) =>\n        this.matches({ x, y }, XorO) &&\n        checked.filter((spot) => spot.x === x && spot.y === y).length === 0\n    )\n    if (matches.length === 0) {\n      return false\n    }\n\n    return matches.filter((spot) => this.search(spot, XorO, checked)).length > 0\n  }\n\n  private neighbors(pos: {\n    x: number\n    y: number\n  }): Array<{ x: number; y: number }> {\n    return [\n      { x: pos.x, y: pos.y + 2 },\n      { x: pos.x, y: pos.y - 2 },\n\n      { x: pos.x + 1, y: pos.y + 1 },\n      { x: pos.x - 1, y: pos.y + 1 },\n\n      { x: pos.x + 1, y: pos.y - 1 },\n      { x: pos.x - 1, y: pos.y - 1 },\n    ]\n  }\n\n  private startPositions(XorO: 'X' | 'O'): Array<{ x: number; y: number }> {\n    return XorO === 'X'\n      ? this.board.map((_, i) => ({ x: i, y: i }))\n      : this.board[0].map((_, i) => ({ x: 0, y: i }))\n  }\n\n  private winningSpot(pos: { x: number; y: number }, XorO: 'X' | 'O'): boolean {\n    return XorO === 'X'\n      ? pos.y === this.board[0].length - 1 + pos.x\n      : pos.x === this.board.length - 1\n  }\n\n  private matches(pos: { x: number; y: number }, XorO: 'X' | 'O'): boolean {\n    return this.board[pos.x] !== undefined && this.board[pos.x][pos.y] === XorO\n  }\n}\n"
  },
  {
    "path": "exercises/practice/connect/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[6eff0df4-3e92-478d-9b54-d3e8b354db56]\ndescription = \"an empty board has no winner\"\n\n[298b94c0-b46d-45d8-b34b-0fa2ea71f0a4]\ndescription = \"X can win on a 1x1 board\"\n\n[763bbae0-cb8f-4f28-bc21-5be16a5722dc]\ndescription = \"O can win on a 1x1 board\"\n\n[819fde60-9ae2-485e-a024-cbb8ea68751b]\ndescription = \"only edges does not make a winner\"\n\n[2c56a0d5-9528-41e5-b92b-499dfe08506c]\ndescription = \"illegal diagonal does not make a winner\"\n\n[41cce3ef-43ca-4963-970a-c05d39aa1cc1]\ndescription = \"nobody wins crossing adjacent angles\"\n\n[cd61c143-92f6-4a8d-84d9-cb2b359e226b]\ndescription = \"X wins crossing from left to right\"\n\n[73d1eda6-16ab-4460-9904-b5f5dd401d0b]\ndescription = \"O wins crossing from top to bottom\"\n\n[c3a2a550-944a-4637-8b3f-1e1bf1340a3d]\ndescription = \"X wins using a convoluted path\"\n\n[17e76fa8-f731-4db7-92ad-ed2a285d31f3]\ndescription = \"X wins using a spiral path\"\n"
  },
  {
    "path": "exercises/practice/connect/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/connect/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/connect/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/connect/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/connect/connect.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { Board } from './connect.ts'\n\ndescribe('Judging a game of connect', () => {\n  it('an empty board has no winner', () => {\n    const board = [\n      '. . . . .',\n      ' . . . . .',\n      '  . . . . .',\n      '   . . . . .',\n      '    . . . . .',\n    ]\n    expect(new Board(board).winner()).toEqual('')\n  })\n\n  xit('X can win on a 1x1 board', () => {\n    const board = ['X']\n    expect(new Board(board).winner()).toEqual('X')\n  })\n\n  xit('O can win on a 1x1 board', () => {\n    const board = ['O']\n    expect(new Board(board).winner()).toEqual('O')\n  })\n\n  xit('only edges does not make a winner', () => {\n    const board = ['O O O X', ' X . . X', '  X . . X', '   X O O O']\n    expect(new Board(board).winner()).toEqual('')\n  })\n\n  xit('illegal diagonal does not make a winner', () => {\n    const board = [\n      'X O . .',\n      ' O X X X',\n      '  O X O .',\n      '   . O X .',\n      '    X X O O',\n    ]\n    expect(new Board(board).winner()).toEqual('')\n  })\n\n  xit('nobody wins crossing adjacent angles', () => {\n    const board = [\n      'X . . .',\n      ' . X O .',\n      '  O . X O',\n      '   . O . X',\n      '    . . O .',\n    ]\n    expect(new Board(board).winner()).toEqual('')\n  })\n\n  xit('X wins crossing from left to right', () => {\n    const board = [\n      '. O . .',\n      ' O X X X',\n      '  O X O .',\n      '   X X O X',\n      '    . O X .',\n    ]\n    expect(new Board(board).winner()).toEqual('X')\n  })\n\n  xit('O wins crossing from top to bottom', () => {\n    const board = [\n      '. O . .',\n      ' O X X X',\n      '  O O O .',\n      '   X X O X',\n      '    . O X .',\n    ]\n    expect(new Board(board).winner()).toEqual('O')\n  })\n\n  xit('X wins using a convoluted path', () => {\n    const board = [\n      '. X X . .',\n      ' X . X . X',\n      '  . X . X .',\n      '   . X X . .',\n      '    O O O O O',\n    ]\n    expect(new Board(board).winner()).toEqual('X')\n  })\n\n  xit('X wins using a spiral path', () => {\n    const board = [\n      'O X X X X X X X X',\n      ' O X O O O O O O O',\n      '  O X O X X X X X O',\n      '   O X O X O O O X O',\n      '    O X O X X X O X O',\n      '     O X O O O X O X O',\n      '      O X X X X X O X O',\n      '       O O O O O O O X O',\n      '        X X X X X X X X O',\n    ]\n    expect(new Board(board).winner()).toEqual('X')\n  })\n})\n"
  },
  {
    "path": "exercises/practice/connect/connect.ts",
    "content": "export class Board {\n  constructor(board: unknown) {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public winner(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/connect/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/connect/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/connect/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-connect\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/connect/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/connect/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/crypto-square/.docs/instructions.md",
    "content": "# Instructions\n\nImplement the classic method for composing secret messages called a square code.\n\nGiven an English text, output the encoded version of that text.\n\nFirst, the input is normalized: the spaces and punctuation are removed from the English text and the message is down-cased.\n\nThen, the normalized characters are broken into rows.\nThese rows can be regarded as forming a rectangle when printed with intervening newlines.\n\nFor example, the sentence\n\n```text\n\"If man was meant to stay on the ground, god would have given us roots.\"\n```\n\nis normalized to:\n\n```text\n\"ifmanwasmeanttostayonthegroundgodwouldhavegivenusroots\"\n```\n\nThe plaintext should be organized into a rectangle as square as possible.\nThe size of the rectangle should be decided by the length of the message.\n\nIf `c` is the number of columns and `r` is the number of rows, then for the rectangle `r` x `c` find the smallest possible integer `c` such that:\n\n- `r * c >= length of message`,\n- and `c >= r`,\n- and `c - r <= 1`.\n\nOur normalized text is 54 characters long, dictating a rectangle with `c = 8` and `r = 7`:\n\n```text\n\"ifmanwas\"\n\"meanttos\"\n\"tayonthe\"\n\"groundgo\"\n\"dwouldha\"\n\"vegivenu\"\n\"sroots  \"\n```\n\nThe coded message is obtained by reading down the columns going left to right.\n\nThe message above is coded as:\n\n```text\n\"imtgdvsfearwermayoogoanouuiontnnlvtwttddesaohghnsseoau\"\n```\n\nOutput the encoded text in chunks that fill perfect rectangles `(r X c)`, with `c` chunks of `r` length, separated by spaces.\nFor phrases that are `n` characters short of the perfect rectangle, pad each of the last `n` chunks with a single trailing space.\n\n```text\n\"imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghn  sseoau \"\n```\n\nNotice that were we to stack these, we could visually decode the ciphertext back in to the original message:\n\n```text\n\"imtgdvs\"\n\"fearwer\"\n\"mayoogo\"\n\"anouuio\"\n\"ntnnlvt\"\n\"wttddes\"\n\"aohghn \"\n\"sseoau \"\n```\n"
  },
  {
    "path": "exercises/practice/crypto-square/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"crypto-square.ts\"\n    ],\n    \"test\": [\n      \"crypto-square.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Implement the classic method for composing secret messages called a square code.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": true,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"J Dalbey's Programming Practice problems\",\n  \"source_url\": \"https://users.csc.calpoly.edu/~jdalbey/103/Projects/ProgrammingPractice.html\"\n}\n"
  },
  {
    "path": "exercises/practice/crypto-square/.meta/proof.ci.ts",
    "content": "export class Crypto {\n  constructor(private readonly input: string) {}\n\n  private get plaintext(): string {\n    return this.input.toLowerCase().replace(/[^a-zA-Z0-9]/g, '')\n  }\n\n  public get ciphertext(): string {\n    const chunkSize = this.size\n    if (chunkSize === 0) {\n      return ''\n    }\n\n    const splitRegex = new RegExp(`.{1,${chunkSize}}`, 'g')\n    return this.ciphertextSegments()\n      .join('')\n      .match(splitRegex)\n      .map((item) => item.padEnd(chunkSize, ' '))\n      .join(' ')\n  }\n\n  public get size(): number {\n    const realLength = Math.sqrt(this.plaintext.length)\n    return Math.ceil(realLength)\n  }\n\n  private ciphertextSegments(): string[] {\n    const textSegments = this.plaintextSegments()\n    const columns: string[][] = []\n    let i: number\n    let j: number\n    let currentSegment: RegExpMatchArray[number]\n    let currentLetter: RegExpMatchArray[number][number]\n\n    for (i = 0; i < this.size; i += 1) {\n      columns.push([])\n    }\n\n    for (i = 0; i < textSegments.length; i += 1) {\n      currentSegment = textSegments[i]\n\n      for (j = 0; j < currentSegment.length; j += 1) {\n        currentLetter = currentSegment[j]\n        columns[j].push(currentLetter)\n      }\n    }\n\n    const result: string[] = []\n    for (i = 0; i < columns.length; i += 1) {\n      result[i] = columns[i].join('')\n    }\n\n    return result\n  }\n\n  private plaintextSegments(): RegExpMatchArray {\n    const plainText = this.plaintext\n    const chunkSize = this.size\n\n    const splitRegex = new RegExp(`.{1,${chunkSize}}`, 'g')\n    return plainText.match(splitRegex)\n  }\n}\n"
  },
  {
    "path": "exercises/practice/crypto-square/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[407c3837-9aa7-4111-ab63-ec54b58e8e9f]\ndescription = \"empty plaintext results in an empty ciphertext\"\n\n[aad04a25-b8bb-4304-888b-581bea8e0040]\ndescription = \"normalization results in empty plaintext\"\n\n[64131d65-6fd9-4f58-bdd8-4a2370fb481d]\ndescription = \"Lowercase\"\n\n[63a4b0ed-1e3c-41ea-a999-f6f26ba447d6]\ndescription = \"Remove spaces\"\n\n[1b5348a1-7893-44c1-8197-42d48d18756c]\ndescription = \"Remove punctuation\"\n\n[8574a1d3-4a08-4cec-a7c7-de93a164f41a]\ndescription = \"9 character plaintext results in 3 chunks of 3 characters\"\n\n[a65d3fa1-9e09-43f9-bcec-7a672aec3eae]\ndescription = \"8 character plaintext results in 3 chunks, the last one with a trailing space\"\n\n[fbcb0c6d-4c39-4a31-83f6-c473baa6af80]\ndescription = \"54 character plaintext results in 7 chunks, the last two with trailing spaces\"\ninclude = false\n\n[33fd914e-fa44-445b-8f38-ff8fbc9fe6e6]\ndescription = \"54 character plaintext results in 8 chunks, the last two with trailing spaces\"\nreimplements = \"fbcb0c6d-4c39-4a31-83f6-c473baa6af80\"\n"
  },
  {
    "path": "exercises/practice/crypto-square/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/crypto-square/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/crypto-square/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/crypto-square/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/crypto-square/crypto-square.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { Crypto } from './crypto-square.ts'\n\ndescribe('Crypto', () => {\n  it('empty plaintext results in an empty ciphertext', () => {\n    const crypto = new Crypto('')\n    expect(crypto.ciphertext).toEqual('')\n  })\n\n  xit('normalization results in empty plaintext', () => {\n    const crypto = new Crypto('... --- ...')\n    expect(crypto.ciphertext).toEqual('')\n  })\n\n  xit('Lowercase', () => {\n    const crypto = new Crypto('A')\n    expect(crypto.ciphertext).toEqual('a')\n  })\n\n  xit('Remove spaces', () => {\n    const crypto = new Crypto('  b ')\n    expect(crypto.ciphertext).toEqual('b')\n  })\n\n  xit('Remove punctuation', () => {\n    const crypto = new Crypto('@1,%!')\n    expect(crypto.ciphertext).toEqual('1')\n  })\n\n  xit('9 character plaintext results in 3 chunks of 3 characters', () => {\n    const crypto = new Crypto('This is fun!')\n    expect(crypto.ciphertext).toEqual('tsf hiu isn')\n  })\n\n  xit('8 character plaintext results in 3 chunks, the last one with a trailing space', () => {\n    const crypto = new Crypto('Chill out.')\n    expect(crypto.ciphertext).toEqual('clu hlt io ')\n  })\n\n  it.skip('54 character plaintext results in 8 chunks, the last two with trailing spaces', () => {\n    const crypto = new Crypto(\n      'If man was meant to stay on the ground, god would have given us roots.'\n    )\n    expect(crypto.ciphertext).toEqual(\n      'imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghn  sseoau '\n    )\n  })\n})\n"
  },
  {
    "path": "exercises/practice/crypto-square/crypto-square.ts",
    "content": "export class Crypto {\n  constructor(plainText: unknown) {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  get ciphertext(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/crypto-square/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/crypto-square/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/crypto-square/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-crypto-square\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/crypto-square/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/crypto-square/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/custom-set/.docs/instructions.md",
    "content": "# Instructions\n\nCreate a custom set type.\n\nSometimes it is necessary to define a custom data structure of some type, like a set.\nIn this exercise you will define your own set.\nHow it works internally doesn't matter, as long as it behaves like a set of unique elements.\n"
  },
  {
    "path": "exercises/practice/custom-set/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"custom-set.ts\"\n    ],\n    \"test\": [\n      \"custom-set.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Create a custom set type.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  }\n}\n"
  },
  {
    "path": "exercises/practice/custom-set/.meta/proof.ci.ts",
    "content": "export class CustomSet<T> {\n  private data: Set<T>\n\n  constructor(data: T[] = []) {\n    this.data = new Set<T>()\n    data.forEach((el) => {\n      this.add(el)\n    })\n  }\n\n  public add(el: T): this {\n    this.data.add(el)\n    return this\n  }\n\n  public delete(el: T): this {\n    this.data.delete(el)\n    return this\n  }\n\n  public size(): number {\n    return this.data.size\n  }\n\n  public empty(): boolean {\n    return this.data.size === 0\n  }\n\n  public contains(el: T): boolean {\n    return this.data.has(el)\n  }\n\n  public eql(other: CustomSet<T>): boolean {\n    if (this.data.size !== other.data.size) {\n      return false\n    }\n    for (const item of this.data) {\n      if (!other.data.has(item)) {\n        return false\n      }\n    }\n    return true\n  }\n\n  public difference(other: CustomSet<T>): CustomSet<T> {\n    const result = new CustomSet<T>()\n    for (const item of this.data) {\n      if (!other.data.has(item)) {\n        result.add(item)\n      }\n    }\n    return result\n  }\n\n  public disjoint(other: CustomSet<T>): boolean {\n    return this.size() === 0 || this.difference(other).size() === this.size()\n  }\n\n  public intersection(other: CustomSet<T>): CustomSet<T> {\n    return this.difference(this.difference(other))\n  }\n\n  public union(other: CustomSet<T>): CustomSet<T> {\n    const result = new CustomSet<T>()\n    for (const item of this.data) {\n      result.add(item)\n    }\n    for (const item of other.data) {\n      result.add(item)\n    }\n    return result\n  }\n\n  public subset(other: CustomSet<T>): boolean {\n    return this.eql(this.intersection(other))\n  }\n\n  public toList(): T[] {\n    return Object.values(this.data) as T[]\n  }\n}\n"
  },
  {
    "path": "exercises/practice/custom-set/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[20c5f855-f83a-44a7-abdd-fe75c6cf022b]\ndescription = \"sets with no elements are empty\"\n\n[d506485d-5706-40db-b7d8-5ceb5acf88d2]\ndescription = \"sets with elements are not empty\"\n\n[759b9740-3417-44c3-8ca3-262b3c281043]\ndescription = \"nothing is contained in an empty set\"\n\n[f83cd2d1-2a85-41bc-b6be-80adbff4be49]\ndescription = \"when the element is in the set\"\n\n[93423fc0-44d0-4bc0-a2ac-376de8d7af34]\ndescription = \"when the element is not in the set\"\n\n[c392923a-637b-4495-b28e-34742cd6157a]\ndescription = \"empty set is a subset of another empty set\"\n\n[5635b113-be8c-4c6f-b9a9-23c485193917]\ndescription = \"empty set is a subset of non-empty set\"\n\n[832eda58-6d6e-44e2-92c2-be8cf0173cee]\ndescription = \"non-empty set is not a subset of empty set\"\n\n[c830c578-8f97-4036-b082-89feda876131]\ndescription = \"set is a subset of set with exact same elements\"\n\n[476a4a1c-0fd1-430f-aa65-5b70cbc810c5]\ndescription = \"set is a subset of larger set with same elements\"\n\n[d2498999-3e46-48e4-9660-1e20c3329d3d]\ndescription = \"set is not a subset of set that does not contain its elements\"\n\n[7d38155e-f472-4a7e-9ad8-5c1f8f95e4cc]\ndescription = \"the empty set is disjoint with itself\"\n\n[7a2b3938-64b6-4b32-901a-fe16891998a6]\ndescription = \"empty set is disjoint with non-empty set\"\n\n[589574a0-8b48-48ea-88b0-b652c5fe476f]\ndescription = \"non-empty set is disjoint with empty set\"\n\n[febeaf4f-f180-4499-91fa-59165955a523]\ndescription = \"sets are not disjoint if they share an element\"\n\n[0de20d2f-c952-468a-88c8-5e056740f020]\ndescription = \"sets are disjoint if they share no elements\"\n\n[4bd24adb-45da-4320-9ff6-38c044e9dff8]\ndescription = \"empty sets are equal\"\n\n[f65c0a0e-6632-4b2d-b82c-b7c6da2ec224]\ndescription = \"empty set is not equal to non-empty set\"\n\n[81e53307-7683-4b1e-a30c-7e49155fe3ca]\ndescription = \"non-empty set is not equal to empty set\"\n\n[d57c5d7c-a7f3-48cc-a162-6b488c0fbbd0]\ndescription = \"sets with the same elements are equal\"\n\n[dd61bafc-6653-42cc-961a-ab071ee0ee85]\ndescription = \"sets with different elements are not equal\"\n\n[06059caf-9bf4-425e-aaff-88966cb3ea14]\ndescription = \"set is not equal to larger set with same elements\"\n\n[8a677c3c-a658-4d39-bb88-5b5b1a9659f4]\ndescription = \"add to empty set\"\n\n[0903dd45-904d-4cf2-bddd-0905e1a8d125]\ndescription = \"add to non-empty set\"\n\n[b0eb7bb7-5e5d-4733-b582-af771476cb99]\ndescription = \"adding an existing element does not change the set\"\n\n[893d5333-33b8-4151-a3d4-8f273358208a]\ndescription = \"intersection of two empty sets is an empty set\"\n\n[d739940e-def2-41ab-a7bb-aaf60f7d782c]\ndescription = \"intersection of an empty set and non-empty set is an empty set\"\n\n[3607d9d8-c895-4d6f-ac16-a14956e0a4b7]\ndescription = \"intersection of a non-empty set and an empty set is an empty set\"\n\n[b5120abf-5b5e-41ab-aede-4de2ad85c34e]\ndescription = \"intersection of two sets with no shared elements is an empty set\"\n\n[af21ca1b-fac9-499c-81c0-92a591653d49]\ndescription = \"intersection of two sets with shared elements is a set of the shared elements\"\n\n[c5e6e2e4-50e9-4bc2-b89f-c518f015b57e]\ndescription = \"difference of two empty sets is an empty set\"\n\n[2024cc92-5c26-44ed-aafd-e6ca27d6fcd2]\ndescription = \"difference of empty set and non-empty set is an empty set\"\n\n[e79edee7-08aa-4c19-9382-f6820974b43e]\ndescription = \"difference of a non-empty set and an empty set is the non-empty set\"\n\n[c5ac673e-d707-4db5-8d69-7082c3a5437e]\ndescription = \"difference of two non-empty sets is a set of elements that are only in the first set\"\n\n[c45aed16-5494-455a-9033-5d4c93589dc6]\ndescription = \"union of empty sets is an empty set\"\n\n[9d258545-33c2-4fcb-a340-9f8aa69e7a41]\ndescription = \"union of an empty set and non-empty set is the non-empty set\"\n\n[3aade50c-80c7-4db8-853d-75bac5818b83]\ndescription = \"union of a non-empty set and empty set is the non-empty set\"\n\n[a00bb91f-c4b4-4844-8f77-c73e2e9df77c]\ndescription = \"union of non-empty sets contains all unique elements\"\n"
  },
  {
    "path": "exercises/practice/custom-set/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/custom-set/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/custom-set/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/custom-set/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/custom-set/custom-set.test.ts",
    "content": "import { describe, xdescribe, it, expect, xit } from '@jest/globals'\nimport { CustomSet } from './custom-set.ts'\n\ndescribe('CustomSet', () => {\n  describe('empty: returns true if the set contains no elements', () => {\n    it('sets with no elements are empty', () => {\n      const actual = new CustomSet().empty()\n      expect(actual).toBeTruthy()\n    })\n\n    xit('sets with elements are not empty', () => {\n      const actual = new CustomSet([1]).empty()\n      expect(actual).toBeFalsy()\n    })\n  })\n\n  xdescribe('contains: sets can report if they contain an element', () => {\n    xit('nothing is contained in an empty set', () => {\n      const actual = new CustomSet().contains(1)\n      expect(actual).toBeFalsy()\n    })\n\n    xit('when the element is in the set', () => {\n      const actual = new CustomSet([1, 2, 3]).contains(1)\n      expect(actual).toBeTruthy()\n    })\n\n    xit('when the element is not in the set', () => {\n      const actual = new CustomSet([1, 2, 3]).contains(4)\n      expect(actual).toBeFalsy()\n    })\n  })\n\n  xdescribe('subset: a set is a subset if all of its elements are contained in the other set', () => {\n    xit('empty set is a subset of another empty set', () => {\n      const actual = new CustomSet().subset(new CustomSet())\n      expect(actual).toBeTruthy()\n    })\n\n    xit('empty set is a subset of non-empty set', () => {\n      const actual = new CustomSet().subset(new CustomSet([1]))\n      expect(actual).toBeTruthy()\n    })\n\n    xit('non-empty set is not a subset of empty set', () => {\n      const actual = new CustomSet([1]).subset(new CustomSet())\n      expect(actual).toBeFalsy()\n    })\n\n    xit('set is a subset of set with exact same elements', () => {\n      const actual = new CustomSet([1, 2, 3]).subset(new CustomSet([1, 2, 3]))\n      expect(actual).toBeTruthy()\n    })\n\n    xit('set is a subset of larger set with same elements', () => {\n      const actual = new CustomSet([1, 2, 3]).subset(\n        new CustomSet([4, 1, 2, 3])\n      )\n      expect(actual).toBeTruthy()\n    })\n\n    xit('set is not a subset of set that does not contain its elements', () => {\n      const actual = new CustomSet([1, 2, 3]).subset(new CustomSet([4, 1, 3]))\n      expect(actual).toBeFalsy()\n    })\n  })\n\n  xdescribe('disjoint: sets are disjoint if they share no elements', () => {\n    xit('the empty set is disjoint with itself', () => {\n      const actual = new CustomSet().disjoint(new CustomSet([]))\n      expect(actual).toBeTruthy()\n    })\n\n    xit('empty set is disjoint with non-empty set', () => {\n      const actual = new CustomSet().disjoint(new CustomSet([1]))\n      expect(actual).toBeTruthy()\n    })\n\n    xit('non-empty set is disjoint with empty set', () => {\n      const actual = new CustomSet([1]).disjoint(new CustomSet([]))\n      expect(actual).toBeTruthy()\n    })\n\n    xit('sets are not disjoint if they share an element', () => {\n      const actual = new CustomSet([1, 2]).disjoint(new CustomSet([2, 3]))\n      expect(actual).toBeFalsy()\n    })\n\n    xit('sets are disjoint if they share no elements', () => {\n      const actual = new CustomSet([1, 2]).disjoint(new CustomSet([3, 4]))\n      expect(actual).toBeTruthy()\n    })\n  })\n\n  xdescribe('eql: sets with the same elements are equal', () => {\n    xit('empty sets are equal', () => {\n      const actual = new CustomSet().eql(new CustomSet())\n      expect(actual).toBeTruthy()\n    })\n\n    xit('empty set is not equal to non-empty set', () => {\n      const actual = new CustomSet().eql(new CustomSet([1, 2, 3]))\n      expect(actual).toBeFalsy()\n    })\n\n    xit('non-empty set is not equal to empty set', () => {\n      const actual = new CustomSet([1, 2, 3]).eql(new CustomSet())\n      expect(actual).toBeFalsy()\n    })\n\n    xit('sets with the same elements are equal', () => {\n      const actual = new CustomSet([1, 2]).eql(new CustomSet([2, 1]))\n      expect(actual).toBeTruthy()\n    })\n\n    xit('sets with different elements are not equal', () => {\n      const actual = new CustomSet([1, 2, 3]).eql(new CustomSet([1, 2, 4]))\n      expect(actual).toBeFalsy()\n    })\n  })\n\n  xdescribe('add: unique elements can be added to a set', () => {\n    xit('add to empty set', () => {\n      const actual = new CustomSet().add(3)\n      const expected = new CustomSet([3])\n      expect(actual.eql(expected)).toBeTruthy()\n    })\n\n    xit('add to non-empty set', () => {\n      const actual = new CustomSet([1, 2, 4]).add(3)\n      const expected = new CustomSet([1, 2, 3, 4])\n      expect(actual.eql(expected)).toBeTruthy()\n    })\n\n    xit('adding an existing element does not change the set', () => {\n      const actual = new CustomSet([1, 2, 3]).add(3)\n      const expected = new CustomSet([1, 2, 3])\n      expect(actual.eql(expected)).toBeTruthy()\n    })\n  })\n\n  xdescribe('intersection: returns a set of all shared elements', () => {\n    xit('intersection of two empty sets is an empty set', () => {\n      const actual = new CustomSet().intersection(new CustomSet())\n      const expected = new CustomSet()\n      expect(actual.eql(expected)).toBeTruthy()\n    })\n\n    xit('intersection of an empty set and non-empty set is an empty set', () => {\n      const actual = new CustomSet().intersection(new CustomSet([3, 2, 5]))\n      const expected = new CustomSet([])\n      expect(actual.eql(expected)).toBeTruthy()\n    })\n\n    xit('intersection of a non-empty set and an empty set is an empty set', () => {\n      const actual = new CustomSet([1, 2, 3, 4]).intersection(new CustomSet([]))\n      const expected = new CustomSet([])\n      expect(actual.eql(expected)).toBeTruthy()\n    })\n\n    xit('intersection of two sets with no shared elements is an empty set', () => {\n      const actual = new CustomSet([1, 2, 3]).intersection(\n        new CustomSet([4, 5, 6])\n      )\n      const expected = new CustomSet([])\n      expect(actual.eql(expected)).toBeTruthy()\n    })\n\n    xit('intersection of two sets with shared elements is a set of the shared elements', () => {\n      const actual = new CustomSet([1, 2, 3, 4]).intersection(\n        new CustomSet([3, 2, 5])\n      )\n      const expected = new CustomSet([2, 3])\n      expect(actual.eql(expected)).toBeTruthy()\n    })\n  })\n\n  xdescribe('difference of a set is a set of all elements that are only in the first set', () => {\n    xit('difference of two empty sets is an empty set', () => {\n      const actual = new CustomSet().difference(new CustomSet())\n      const expected = new CustomSet()\n      expect(actual.eql(expected)).toBeTruthy()\n    })\n\n    xit('difference of empty set and non-empty set is an empty set', () => {\n      const actual = new CustomSet().difference(new CustomSet([3, 2, 5]))\n      const expected = new CustomSet()\n      expect(actual.eql(expected)).toBeTruthy()\n    })\n\n    xit('difference of a non-empty set and an empty set is the non-empty set', () => {\n      const actual = new CustomSet([1, 2, 3, 4]).difference(new CustomSet())\n      const expected = new CustomSet([1, 2, 3, 4])\n      expect(actual.eql(expected)).toBeTruthy()\n    })\n\n    xit('difference of two non-empty sets is a set of elements that are only in the first set', () => {\n      const actual = new CustomSet([3, 2, 1]).difference(new CustomSet([2, 4]))\n      const expected = new CustomSet([1, 3])\n      expect(actual.eql(expected)).toBeTruthy()\n    })\n  })\n\n  xdescribe('union: returns a set of all elements in either set', () => {\n    xit('union of empty sets is an empty set', () => {\n      const actual = new CustomSet().union(new CustomSet())\n      const expected = new CustomSet()\n      expect(actual.eql(expected)).toBeTruthy()\n    })\n\n    xit('union of an empty set and non-empty set is the non-empty set', () => {\n      const actual = new CustomSet().union(new CustomSet([2]))\n      const expected = new CustomSet([2])\n      expect(actual.eql(expected)).toBeTruthy()\n    })\n\n    xit('union of a non-empty set and empty set is the non-empty set', () => {\n      const actual = new CustomSet([1, 3]).union(new CustomSet())\n      const expected = new CustomSet([1, 3])\n      expect(actual.eql(expected)).toBeTruthy()\n    })\n\n    xit('union of non-empty sets contains all unique elements', () => {\n      const actual = new CustomSet([1, 3]).union(new CustomSet([2, 3]))\n      const expected = new CustomSet([1, 2, 3])\n      expect(actual.eql(expected)).toBeTruthy()\n    })\n  })\n})\n"
  },
  {
    "path": "exercises/practice/custom-set/custom-set.ts",
    "content": "export class CustomSet {\n  constructor(initial?: unknown) {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  empty(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  contains(element: unknown): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  add(element: unknown): CustomSet {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  subset(other: unknown): CustomSet {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  disjoint(other: unknown): CustomSet {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  eql(other: unknown): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  union(other: unknown): CustomSet {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  intersection(other: unknown): CustomSet {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  difference(other: unknown): CustomSet {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/custom-set/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/custom-set/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/custom-set/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-custom-set\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/custom-set/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/custom-set/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/darts/.docs/instructions.md",
    "content": "# Instructions\n\nCalculate the points scored in a single toss of a Darts game.\n\n[Darts][darts] is a game where players throw darts at a [target][darts-target].\n\nIn our particular instance of the game, the target rewards 4 different amounts of points, depending on where the dart lands:\n\n![Our dart scoreboard with values from a complete miss to a bullseye](https://assets.exercism.org/images/exercises/darts/darts-scoreboard.svg)\n\n- If the dart lands outside the target, player earns no points (0 points).\n- If the dart lands in the outer circle of the target, player earns 1 point.\n- If the dart lands in the middle circle of the target, player earns 5 points.\n- If the dart lands in the inner circle of the target, player earns 10 points.\n\nThe outer circle has a radius of 10 units (this is equivalent to the total radius for the entire target), the middle circle a radius of 5 units, and the inner circle a radius of 1.\nOf course, they are all centered at the same point — that is, the circles are [concentric][] defined by the coordinates (0, 0).\n\nGiven a point in the target (defined by its [Cartesian coordinates][cartesian-coordinates] `x` and `y`, where `x` and `y` are [real][real-numbers]), calculate the correct score earned by a dart landing at that point.\n\n## Credit\n\nThe scoreboard image was created by [habere-et-dispertire][habere-et-dispertire] using [Inkscape][inkscape].\n\n[darts]: https://en.wikipedia.org/wiki/Darts\n[darts-target]: https://en.wikipedia.org/wiki/Darts#/media/File:Darts_in_a_dartboard.jpg\n[concentric]: https://mathworld.wolfram.com/ConcentricCircles.html\n[cartesian-coordinates]: https://www.mathsisfun.com/data/cartesian-coordinates.html\n[real-numbers]: https://www.mathsisfun.com/numbers/real-numbers.html\n[habere-et-dispertire]: https://exercism.org/profiles/habere-et-dispertire\n[inkscape]: https://en.wikipedia.org/wiki/Inkscape\n"
  },
  {
    "path": "exercises/practice/darts/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"angelikatyborska\"\n  ],\n  \"contributors\": [\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"darts.ts\"\n    ],\n    \"test\": [\n      \"darts.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Calculate the points scored in a single toss of a Darts game.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Inspired by an exercise created by a professor Della Paolera in Argentina\"\n}\n"
  },
  {
    "path": "exercises/practice/darts/.meta/proof.ci.ts",
    "content": "export function score(x: number, y: number): number {\n  // Use euclidean distance\n  const distanceToDart = Math.sqrt(x * x + y * y)\n\n  // Define points for each section of the target\n  if (distanceToDart > 10) {\n    return 0\n  }\n\n  if (distanceToDart > 5) {\n    return 1\n  }\n\n  if (distanceToDart > 1) {\n    return 5\n  }\n  return 10\n}\n"
  },
  {
    "path": "exercises/practice/darts/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[9033f731-0a3a-4d9c-b1c0-34a1c8362afb]\ndescription = \"Missed target\"\n\n[4c9f6ff4-c489-45fd-be8a-1fcb08b4d0ba]\ndescription = \"On the outer circle\"\n\n[14378687-ee58-4c9b-a323-b089d5274be8]\ndescription = \"On the middle circle\"\n\n[849e2e63-85bd-4fed-bc3b-781ae962e2c9]\ndescription = \"On the inner circle\"\n\n[1c5ffd9f-ea66-462f-9f06-a1303de5a226]\ndescription = \"Exactly on center\"\n\n[b65abce3-a679-4550-8115-4b74bda06088]\ndescription = \"Near the center\"\n\n[66c29c1d-44f5-40cf-9927-e09a1305b399]\ndescription = \"Just within the inner circle\"\n\n[d1012f63-c97c-4394-b944-7beb3d0b141a]\ndescription = \"Just outside the inner circle\"\n\n[ab2b5666-b0b4-49c3-9b27-205e790ed945]\ndescription = \"Just within the middle circle\"\n\n[70f1424e-d690-4860-8caf-9740a52c0161]\ndescription = \"Just outside the middle circle\"\n\n[a7dbf8db-419c-4712-8a7f-67602b69b293]\ndescription = \"Just within the outer circle\"\n\n[e0f39315-9f9a-4546-96e4-a9475b885aa7]\ndescription = \"Just outside the outer circle\"\n\n[045d7d18-d863-4229-818e-b50828c75d19]\ndescription = \"Asymmetric position between the inner and middle circles\"\n"
  },
  {
    "path": "exercises/practice/darts/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/darts/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/darts/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/darts/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/darts/darts.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { score } from './darts.ts'\n\ndescribe('Darts', () => {\n  it('Missed target', () => {\n    expect(score(-9, 9)).toEqual(0)\n  })\n\n  xit('On the outer circle', () => {\n    expect(score(0, 10)).toEqual(1)\n  })\n\n  xit('On the middle circle', () => {\n    expect(score(-5, 0)).toEqual(5)\n  })\n\n  xit('On the inner circle', () => {\n    expect(score(0, -1)).toEqual(10)\n  })\n\n  xit('Exactly on centre', () => {\n    expect(score(0, 0)).toEqual(10)\n  })\n\n  xit('Near the centre', () => {\n    expect(score(-0.1, -0.1)).toEqual(10)\n  })\n\n  xit('Just within the inner circle', () => {\n    expect(score(0.7, 0.7)).toEqual(10)\n  })\n\n  xit('Just outside the inner circle', () => {\n    expect(score(0.8, -0.8)).toEqual(5)\n  })\n\n  xit('Just within the middle circle', () => {\n    expect(score(-3.5, 3.5)).toEqual(5)\n  })\n\n  xit('Just outside the middle circle', () => {\n    expect(score(-3.6, -3.6)).toEqual(1)\n  })\n\n  xit('Just within the outer circle', () => {\n    expect(score(-7.0, 7.0)).toEqual(1)\n  })\n\n  xit('Just outside the outer circle', () => {\n    expect(score(7.1, -7.1)).toEqual(0)\n  })\n\n  xit('Asymmetric position between the inner and middle circles', () => {\n    expect(score(0.5, -4)).toEqual(5)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/darts/darts.ts",
    "content": "export function score(x: unknown, y: unknown): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/darts/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/darts/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/darts/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-darts\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/darts/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/darts/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/diamond/.docs/instructions.md",
    "content": "# Instructions\n\nThe diamond kata takes as its input a letter, and outputs it in a diamond shape.\nGiven a letter, it prints a diamond starting with 'A', with the supplied letter at the widest point.\n\n## Requirements\n\n- The first row contains one 'A'.\n- The last row contains one 'A'.\n- All rows, except the first and last, have exactly two identical letters.\n- All rows have as many trailing spaces as leading spaces. (This might be 0).\n- The diamond is horizontally symmetric.\n- The diamond is vertically symmetric.\n- The diamond has a square shape (width equals height).\n- The letters form a diamond shape.\n- The top half has the letters in ascending order.\n- The bottom half has the letters in descending order.\n- The four corners (containing the spaces) are triangles.\n\n## Examples\n\nIn the following examples, spaces are indicated by `·` characters.\n\nDiamond for letter 'A':\n\n```text\nA\n```\n\nDiamond for letter 'C':\n\n```text\n··A··\n·B·B·\nC···C\n·B·B·\n··A··\n```\n\nDiamond for letter 'E':\n\n```text\n····A····\n···B·B···\n··C···C··\n·D·····D·\nE·······E\n·D·····D·\n··C···C··\n···B·B···\n····A····\n```\n"
  },
  {
    "path": "exercises/practice/diamond/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"njgingrich\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"diamond.ts\"\n    ],\n    \"test\": [\n      \"diamond.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given a letter, print a diamond starting with 'A' with the supplied letter at the widest point.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Seb Rose\",\n  \"source_url\": \"https://web.archive.org/web/20220807163751/http://claysnow.co.uk/recycling-tests-in-tdd/\"\n}\n"
  },
  {
    "path": "exercises/practice/diamond/.meta/proof.ci.ts",
    "content": "export function makeDiamond(input: string): string {\n  // A = 0, Z = 25\n  const inputIx = input.charCodeAt(0) - 65\n  const lines = []\n  for (let i = 0; i <= inputIx; i++) {\n    lines.push(getLine(inputIx, i))\n  }\n  for (let i = inputIx - 1; i >= 0; i--) {\n    lines.push(lines[i])\n  }\n  return lines.join('\\n') + '\\n'\n}\n\nfunction getAlphaString(index: number): string {\n  if (index === 0) {\n    return `A`\n  }\n  const char = String.fromCharCode(index + 65)\n  const padding = ' '.repeat((index - 1) * 2 + 1)\n  return `${char}${padding}${char}`\n}\n\nfunction getLine(inputIx: number, index: number): string {\n  const difference = inputIx - index\n  const alphaStr = getAlphaString(index)\n  return `${padString(alphaStr, difference)}`\n}\n\nfunction padString(str: string, times: number): string {\n  const spaces = ' '.repeat(times)\n  return `${spaces}${str}${spaces}`\n}\n\n/*\nex: D ->\nloop:\n  A: D=3, A=0 -> 3 spaces, A, 3 spaces (special case)\n  B: D=3, B=1 -> 2 spaces, B, 1 space, B, 2 spaces\n  C: D=3, C=2 -> 1 space, C, 3 spaces, C, 1 space\n  D: D=3, D=3 -> 0 spaces, D, 5 spaces, D, 0 spaces\n   A\n  B B\n C   C\nD     D\n C   C\n  B B\n   A\n*/\n"
  },
  {
    "path": "exercises/practice/diamond/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[202fb4cc-6a38-4883-9193-a29d5cb92076]\ndescription = \"Degenerate case with a single 'A' row\"\n\n[bd6a6d78-9302-42e9-8f60-ac1461e9abae]\ndescription = \"Degenerate case with no row containing 3 distinct groups of spaces\"\n\n[af8efb49-14ed-447f-8944-4cc59ce3fd76]\ndescription = \"Smallest non-degenerate case with odd diamond side length\"\n\n[e0c19a95-9888-4d05-86a0-fa81b9e70d1d]\ndescription = \"Smallest non-degenerate case with even diamond side length\"\n\n[82ea9aa9-4c0e-442a-b07e-40204e925944]\ndescription = \"Largest possible diamond\"\n"
  },
  {
    "path": "exercises/practice/diamond/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/diamond/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/diamond/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/diamond/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/diamond/diamond.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { makeDiamond } from './diamond.ts'\n\nfunction diamondify(parts: TemplateStringsArray): string {\n  // prettier-ignore\n  return (\n    parts[0]\n      .trim()                   // Remove leading and trailing whitespace\n      .split('\\n')              // Consider each row\n      .map((line) => {\n        return line\n          .trim()               // Remove whitespace at start (and end)\n          .replace(/·/g, ' ')   // Use spaces instead of ·\n      })\n      .filter(Boolean)          // Remove empty rows (if any)\n      .join('\\n') +             // Turn back into a single string\n    '\\n'                        // Should have a final newline\n  )\n}\n\ndescribe('Make diamond function', () => {\n  it('test letter A', () => {\n    const result = 'A\\n'\n    expect(makeDiamond('A')).toEqual(result)\n  })\n\n  xit('test letter C', () => {\n    const result = diamondify`\n      ··A··\n      ·B·B·\n      C···C\n      ·B·B·\n      ··A··\n    `\n    expect(makeDiamond('C')).toEqual(result)\n  })\n\n  xit('test letter E', () => {\n    const result = diamondify`\n      ····A····\n      ···B·B···\n      ··C···C··\n      ·D·····D·\n      E·······E\n      ·D·····D·\n      ··C···C··\n      ···B·B···\n      ····A····\n    `\n    expect(makeDiamond('E')).toEqual(result)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/diamond/diamond.ts",
    "content": "export function makeDiamond(character: unknown): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/diamond/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/diamond/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/diamond/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-diamond\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/diamond/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/diamond/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/difference-of-squares/.docs/instructions.md",
    "content": "# Instructions\n\nFind the difference between the square of the sum and the sum of the squares of the first N natural numbers.\n\nThe square of the sum of the first ten natural numbers is\n(1 + 2 + ... + 10)² = 55² = 3025.\n\nThe sum of the squares of the first ten natural numbers is\n1² + 2² + ... + 10² = 385.\n\nHence the difference between the square of the sum of the first ten natural numbers and the sum of the squares of the first ten natural numbers is 3025 - 385 = 2640.\n\nYou are not expected to discover an efficient solution to this yourself from first principles; research is allowed, indeed, encouraged.\nFinding the best algorithm for the problem is a key skill in software engineering.\n"
  },
  {
    "path": "exercises/practice/difference-of-squares/.meta/config.json",
    "content": "{\n  \"authors\": [],\n  \"contributors\": [\n    \"masters3d\",\n    \"Scientifica96\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"difference-of-squares.ts\"\n    ],\n    \"test\": [\n      \"difference-of-squares.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Find the difference between the square of the sum and the sum of the squares of the first N natural numbers.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Problem 6 at Project Euler\",\n  \"source_url\": \"https://projecteuler.net/problem=6\"\n}\n"
  },
  {
    "path": "exercises/practice/difference-of-squares/.meta/proof.ci.ts",
    "content": "export class Squares {\n  public readonly squareOfSum: number\n  public readonly sumOfSquares: number\n  public readonly difference: number\n\n  constructor(int: number) {\n    this.squareOfSum = this._squareOfSum(int)\n    this.sumOfSquares = this._sumOfSquares(int)\n    this.difference = this._difference()\n  }\n\n  private _squareOfSum(int: number): number {\n    let sum = 0\n    let i = 1\n\n    while (i <= int) {\n      sum += i\n      i++\n    }\n\n    return sum * sum\n  }\n\n  private _sumOfSquares(int: number): number {\n    let sum = 0\n    let i = 1\n\n    while (i <= int) {\n      sum += i * i\n      i++\n    }\n\n    return sum\n  }\n\n  private _difference(): number {\n    return this.squareOfSum - this.sumOfSquares\n  }\n}\n"
  },
  {
    "path": "exercises/practice/difference-of-squares/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[e46c542b-31fc-4506-bcae-6b62b3268537]\ndescription = \"square of sum 1\"\n\n[9b3f96cb-638d-41ee-99b7-b4f9c0622948]\ndescription = \"square of sum 5\"\n\n[54ba043f-3c35-4d43-86ff-3a41625d5e86]\ndescription = \"square of sum 100\"\n\n[01d84507-b03e-4238-9395-dd61d03074b5]\ndescription = \"sum of squares 1\"\n\n[c93900cd-8cc2-4ca4-917b-dd3027023499]\ndescription = \"sum of squares 5\"\n\n[94807386-73e4-4d9e-8dec-69eb135b19e4]\ndescription = \"sum of squares 100\"\n\n[44f72ae6-31a7-437f-858d-2c0837adabb6]\ndescription = \"difference of squares 1\"\n\n[005cb2bf-a0c8-46f3-ae25-924029f8b00b]\ndescription = \"difference of squares 5\"\n\n[b1bf19de-9a16-41c0-a62b-1f02ecc0b036]\ndescription = \"difference of squares 100\"\n"
  },
  {
    "path": "exercises/practice/difference-of-squares/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/difference-of-squares/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/difference-of-squares/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/difference-of-squares/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/difference-of-squares/difference-of-squares.test.ts",
    "content": "import { describe, xdescribe, it, expect, xit } from '@jest/globals'\nimport { Squares } from './difference-of-squares.ts'\n\ndescribe('Squares', () => {\n  describe('up to 5', () => {\n    const squares = new Squares(5)\n\n    it('gets the square of sum', () => {\n      expect(squares.squareOfSum).toBe(225)\n    })\n\n    xit('gets the sum of squares', () => {\n      expect(squares.sumOfSquares).toBe(55)\n    })\n\n    xit('gets the difference', () => {\n      expect(squares.difference).toBe(170)\n    })\n  })\n\n  xdescribe('up to 10', () => {\n    const squares = new Squares(10)\n\n    xit('gets the square of sum', () => {\n      expect(squares.squareOfSum).toBe(3025)\n    })\n\n    xit('gets the sum of squares', () => {\n      expect(squares.sumOfSquares).toBe(385)\n    })\n\n    xit('gets the difference', () => {\n      expect(squares.difference).toBe(2640)\n    })\n  })\n\n  xdescribe('up to 100', () => {\n    const squares = new Squares(100)\n\n    xit('gets the square of sum', () => {\n      expect(squares.squareOfSum).toBe(25502500)\n    })\n\n    xit('gets the sum of squares', () => {\n      expect(squares.sumOfSquares).toBe(338350)\n    })\n\n    xit('gets the difference', () => {\n      expect(squares.difference).toBe(25164150)\n    })\n  })\n})\n"
  },
  {
    "path": "exercises/practice/difference-of-squares/difference-of-squares.ts",
    "content": "export class Squares {\n  constructor(count: unknown) {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  get sumOfSquares(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  get squareOfSum(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  get difference(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/difference-of-squares/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/difference-of-squares/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/difference-of-squares/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-difference-of-squares\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/difference-of-squares/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/difference-of-squares/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/diffie-hellman/.docs/instructions.md",
    "content": "# Instructions\n\nDiffie-Hellman key exchange.\n\nAlice and Bob use Diffie-Hellman key exchange to share secrets.\nThey start with prime numbers, pick private keys, generate and share public keys, and then generate a shared secret key.\n\n## Step 0\n\nThe test program supplies prime numbers p and g.\n\n## Step 1\n\nAlice picks a private key, a, greater than 1 and less than p.\nBob does the same to pick a private key b.\n\n## Step 2\n\nAlice calculates a public key A.\n\n    A = gᵃ mod p\n\nUsing the same p and g, Bob similarly calculates a public key B from his private key b.\n\n## Step 3\n\nAlice and Bob exchange public keys.\nAlice calculates secret key s.\n\n    s = Bᵃ mod p\n\nBob calculates\n\n    s = Aᵇ mod p\n\nThe calculations produce the same result!\nAlice and Bob now share secret s.\n"
  },
  {
    "path": "exercises/practice/diffie-hellman/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"diffie-hellman.ts\"\n    ],\n    \"test\": [\n      \"diffie-hellman.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Diffie-Hellman key exchange.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Wikipedia, 1024 bit key from www.cryptopp.com/wiki.\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange\"\n}\n"
  },
  {
    "path": "exercises/practice/diffie-hellman/.meta/proof.ci.ts",
    "content": "// array of first 1000 primes.\n// prettier-ignore\nconst PRIMES = [\n  2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71,\n  73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151,\n  157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233,\n  239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317,\n  331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419,\n  421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503,\n  509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607,\n  613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701,\n  709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811,\n  821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911,\n  919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019,\n  1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097,\n  1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201,\n  1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291,\n  1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409,\n  1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487,\n  1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579,\n  1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667,\n  1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777,\n  1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877,\n  1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993,\n  1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083,\n  2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179,\n  2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287,\n  2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381,\n  2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473,\n  2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609,\n  2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693,\n  2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789,\n  2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887,\n  2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001,\n  3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119,\n  3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229,\n  3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331,\n  3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457,\n  3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541,\n  3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637,\n  3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739,\n  3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853,\n  3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947,\n  3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073,\n  4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177,\n  4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273,\n  4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409,\n  4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517,\n  4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639,\n  4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733,\n  4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871,\n  4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969,\n  4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077,\n  5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189,\n  5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309,\n  5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431,\n  5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521,\n  5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651,\n  5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743,\n  5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851,\n  5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981,\n  5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091,\n  6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211,\n  6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311,\n  6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397,\n  6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553,\n  6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673,\n  6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781,\n  6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883,\n  6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991,\n  6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121,\n  7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237,\n  7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369,\n  7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507,\n  7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589,\n  7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699,\n  7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829,\n  7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919,\n]\n\nexport class DiffieHellman {\n  constructor(\n    private readonly p: number,\n    private readonly g: number\n  ) {\n    if (!DiffieHellman.validateInitialArguments(p, g)) {\n      throw Error('Constructor arguments are out of range or non-prime!')\n    }\n  }\n\n  public getPublicKey(privateKey: number): number {\n    if (privateKey <= 1 || privateKey > this.p - 1) {\n      throw Error(\n        'Private key a must be greater than one but less than modulus parameter p!'\n      )\n    }\n    return this.g ** privateKey % this.p\n  }\n\n  public getSecret(theirPublicKey: number, ourPrivateKey: number): number {\n    return theirPublicKey ** ourPrivateKey % this.p\n  }\n\n  private static validateInitialArguments(p: number, g: number): boolean {\n    const BIGGEST_PRIME = PRIMES[PRIMES.length - 1]\n\n    return (\n      p >= 2 &&\n      g >= 2 &&\n      p <= BIGGEST_PRIME &&\n      g <= BIGGEST_PRIME &&\n      PRIMES.includes(p) &&\n      PRIMES.includes(g)\n    )\n  }\n}\n"
  },
  {
    "path": "exercises/practice/diffie-hellman/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[1b97bf38-4307-418e-bfd2-446ffc77588d]\ndescription = \"private key is greater than 1 and less than p\"\n\n[68b2a5f7-7755-44c3-97b2-d28d21f014a9]\ndescription = \"private key is random\"\n\n[b4161d8e-53a1-4241-ae8f-48cc86527f22]\ndescription = \"can calculate public key using private key\"\n\n[0d25f8d7-4897-4338-a033-2d3d7a9af688]\ndescription = \"can calculate public key when given a different private key\"\n\n[cd02ad45-3f52-4510-99cc-5161dad948a8]\ndescription = \"can calculate secret using other party's public key\"\n\n[17f13c61-a111-4075-9a1f-c2d4636dfa60]\ndescription = \"key exchange\"\n"
  },
  {
    "path": "exercises/practice/diffie-hellman/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/diffie-hellman/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/diffie-hellman/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/diffie-hellman/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/diffie-hellman/diffie-hellman.test.ts",
    "content": "import { describe, xdescribe, it, expect, xit } from '@jest/globals'\nimport { DiffieHellman } from './diffie-hellman.ts'\n\ndescribe('diffie-hellman', () => {\n  it('throws an error if the constructor arguments are out of range', () => {\n    expect(() => {\n      new DiffieHellman(0, 9999)\n    }).toThrow()\n  })\n\n  xit('throws an error if the constructor arguments are not prime', () => {\n    expect(() => {\n      new DiffieHellman(10, 13)\n    }).toThrow()\n  })\n\n  xdescribe('input validation', () => {\n    const p = 23\n    const g = 5\n    const diffieHellman = new DiffieHellman(p, g)\n\n    xit('throws an error if private key is negative', () => {\n      expect(() => {\n        diffieHellman.getPublicKey(-1)\n      }).toThrow()\n    })\n\n    xit('throws an error if private key is zero', () => {\n      expect(() => {\n        diffieHellman.getPublicKey(0)\n      }).toThrow()\n    })\n\n    xit('throws an error if private key is one', () => {\n      expect(() => {\n        diffieHellman.getPublicKey(1)\n      }).toThrow()\n    })\n\n    xit('throws an error if private key equals the modulus parameter p', () => {\n      expect(() => {\n        diffieHellman.getPublicKey(p)\n      }).toThrow()\n    })\n\n    xit('throws an error if private key is greater than the modulus parameter p', () => {\n      expect(() => {\n        diffieHellman.getPublicKey(p + 1)\n      }).toThrow()\n    })\n  })\n\n  xdescribe('stateless calculation', () => {\n    const diffieHellman = new DiffieHellman(23, 5)\n\n    const alicePrivateKey = 6\n    const alicePublicKey = 8\n\n    const bobPrivateKey = 15\n    const bobPublicKey = 19\n\n    xit('can calculate public key using private key', () => {\n      expect(diffieHellman.getPublicKey(alicePrivateKey)).toEqual(\n        alicePublicKey\n      )\n    })\n\n    xit('can calculate public key when given a different private key', () => {\n      expect(diffieHellman.getPublicKey(bobPrivateKey)).toEqual(bobPublicKey)\n    })\n  })\n\n  xit(\"can calculate secret using other party's public key\", () => {\n    expect(new DiffieHellman(23, 5).getSecret(19, 6)).toEqual(2)\n  })\n\n  xit('key exchange', () => {\n    const diffieHellman = new DiffieHellman(23, 5)\n\n    const alicePrivateKey = 6\n    const bobPrivateKey = 15\n    const alicePublicKey = diffieHellman.getPublicKey(alicePrivateKey)\n    const bobPublicKey = diffieHellman.getPublicKey(bobPrivateKey)\n\n    const secretA = diffieHellman.getSecret(bobPublicKey, alicePrivateKey)\n    const secretB = diffieHellman.getSecret(alicePublicKey, bobPrivateKey)\n\n    expect(secretA).toEqual(secretB)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/diffie-hellman/diffie-hellman.ts",
    "content": "export class DiffieHellman {\n  constructor(p: unknown, g: unknown) {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public getPublicKey(privateKey: unknown): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public getSecret(theirPublicKey: unknown, myPrivateKey: unknown): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/diffie-hellman/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/diffie-hellman/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/diffie-hellman/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-diffie-hellman\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/diffie-hellman/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/diffie-hellman/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/dnd-character/.docs/instructions.md",
    "content": "# Instructions\n\nFor a game of [Dungeons & Dragons][dnd], each player starts by generating a character they can play with.\nThis character has, among other things, six abilities; strength, dexterity, constitution, intelligence, wisdom and charisma.\nThese six abilities have scores that are determined randomly.\nYou do this by rolling four 6-sided dice and recording the sum of the largest three dice.\nYou do this six times, once for each ability.\n\nYour character's initial hitpoints are 10 + your character's constitution modifier.\nYou find your character's constitution modifier by subtracting 10 from your character's constitution, divide by 2 and round down.\n\nWrite a random character generator that follows the above rules.\n\nFor example, the six throws of four dice may look like:\n\n- 5, 3, 1, 6: You discard the 1 and sum 5 + 3 + 6 = 14, which you assign to strength.\n- 3, 2, 5, 3: You discard the 2 and sum 3 + 5 + 3 = 11, which you assign to dexterity.\n- 1, 1, 1, 1: You discard the 1 and sum 1 + 1 + 1 = 3, which you assign to constitution.\n- 2, 1, 6, 6: You discard the 1 and sum 2 + 6 + 6 = 14, which you assign to intelligence.\n- 3, 5, 3, 4: You discard the 3 and sum 5 + 3 + 4 = 12, which you assign to wisdom.\n- 6, 6, 6, 6: You discard the 6 and sum 6 + 6 + 6 = 18, which you assign to charisma.\n\nBecause constitution is 3, the constitution modifier is -4 and the hitpoints are 6.\n\n~~~~exercism/note\nMost programming languages feature (pseudo-)random generators, but few programming languages are designed to roll dice.\nOne such language is [Troll][troll].\n\n[troll]: https://di.ku.dk/Ansatte/?pure=da%2Fpublications%2Ftroll-a-language-for-specifying-dicerolls(84a45ff0-068b-11df-825d-000ea68e967b)%2Fexport.html\n~~~~\n\n[dnd]: https://en.wikipedia.org/wiki/Dungeons_%26_Dragons\n"
  },
  {
    "path": "exercises/practice/dnd-character/.docs/introduction.md",
    "content": "# Introduction\n\nAfter weeks of anticipation, you and your friends get together for your very first game of [Dungeons & Dragons][dnd] (D&D).\nSince this is the first session of the game, each player has to generate a character to play with.\nThe character's abilities are determined by rolling 6-sided dice, but where _are_ the dice?\nWith a shock, you realize that your friends are waiting for _you_ to produce the dice; after all it was your idea to play D&D!\nPanicking, you realize you forgot to bring the dice, which would mean no D&D game.\nAs you have some basic coding skills, you quickly come up with a solution: you'll write a program to simulate dice rolls.\n\n[dnd]: https://en.wikipedia.org/wiki/Dungeons_%26_Dragons\n"
  },
  {
    "path": "exercises/practice/dnd-character/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"JoshiRaez\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"dnd-character.ts\"\n    ],\n    \"test\": [\n      \"dnd-character.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Randomly generate Dungeons & Dragons characters.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Simon Shine, Erik Schierboom\",\n  \"source_url\": \"https://github.com/exercism/problem-specifications/issues/616#issuecomment-437358945\"\n}\n"
  },
  {
    "path": "exercises/practice/dnd-character/.meta/proof.ci.ts",
    "content": "export class DnDCharacter {\n  public readonly hitpoints: number\n\n  public readonly strength: number\n  public readonly dexterity: number\n  public readonly constitution: number\n  public readonly intelligence: number\n  public readonly wisdom: number\n  public readonly charisma: number\n\n  constructor() {\n    this.strength = DnDCharacter.generateAbilityScore()\n    this.dexterity = DnDCharacter.generateAbilityScore()\n    this.constitution = DnDCharacter.generateAbilityScore()\n    this.intelligence = DnDCharacter.generateAbilityScore()\n    this.wisdom = DnDCharacter.generateAbilityScore()\n    this.charisma = DnDCharacter.generateAbilityScore()\n\n    this.hitpoints = 10 + DnDCharacter.getModifierFor(this.constitution)\n  }\n\n  public static generateAbilityScore(): number {\n    return this.rollDice(4)\n      .sort()\n      .slice(1, 4)\n      .reduce((acu, act) => acu + act, 0)\n  }\n\n  public static getModifierFor(abilityValue: number): number {\n    return Math.floor((abilityValue - 10) / 2)\n  }\n\n  private static rollDice(quantity: number): number[] {\n    return new Array<number>(quantity).fill(0).map(() => this.rollDie())\n  }\n\n  private static rollDie(): number {\n    return Math.floor(Math.random() * 6) + 1\n  }\n}\n"
  },
  {
    "path": "exercises/practice/dnd-character/.meta/tests.toml",
    "content": "[1e9ae1dc-35bd-43ba-aa08-e4b94c20fa37]\ndescription = \"Ability modifier for score 3 is -4\"\ninclude = true\n\n[cc9bb24e-56b8-4e9e-989d-a0d1a29ebb9c]\ndescription = \"Ability modifier for score 4 is -3\"\ninclude = true\n\n[5b519fcd-6946-41ee-91fe-34b4f9808326]\ndescription = \"Ability modifier for score 5 is -3\"\ninclude = true\n\n[dc2913bd-6d7a-402e-b1e2-6d568b1cbe21]\ndescription = \"Ability modifier for score 6 is -2\"\ninclude = true\n\n[099440f5-0d66-4b1a-8a10-8f3a03cc499f]\ndescription = \"Ability modifier for score 7 is -2\"\ninclude = true\n\n[cfda6e5c-3489-42f0-b22b-4acb47084df0]\ndescription = \"Ability modifier for score 8 is -1\"\ninclude = true\n\n[c70f0507-fa7e-4228-8463-858bfbba1754]\ndescription = \"Ability modifier for score 9 is -1\"\ninclude = true\n\n[6f4e6c88-1cd9-46a0-92b8-db4a99b372f7]\ndescription = \"Ability modifier for score 10 is 0\"\ninclude = true\n\n[e00d9e5c-63c8-413f-879d-cd9be9697097]\ndescription = \"Ability modifier for score 11 is 0\"\ninclude = true\n\n[eea06f3c-8de0-45e7-9d9d-b8cab4179715]\ndescription = \"Ability modifier for score 12 is 1\"\ninclude = true\n\n[9c51f6be-db72-4af7-92ac-b293a02c0dcd]\ndescription = \"Ability modifier for score 13 is 1\"\ninclude = true\n\n[94053a5d-53b6-4efc-b669-a8b5098f7762]\ndescription = \"Ability modifier for score 14 is 2\"\ninclude = true\n\n[8c33e7ca-3f9f-4820-8ab3-65f2c9e2f0e2]\ndescription = \"Ability modifier for score 15 is 2\"\ninclude = true\n\n[c3ec871e-1791-44d0-b3cc-77e5fb4cd33d]\ndescription = \"Ability modifier for score 16 is 3\"\ninclude = true\n\n[3d053cee-2888-4616-b9fd-602a3b1efff4]\ndescription = \"Ability modifier for score 17 is 3\"\ninclude = true\n\n[bafd997a-e852-4e56-9f65-14b60261faee]\ndescription = \"Ability modifier for score 18 is 4\"\ninclude = true\n\n[4f28f19c-2e47-4453-a46a-c0d365259c14]\ndescription = \"Random ability is within range\"\ninclude = true\n\n[385d7e72-864f-4e88-8279-81a7d75b04ad]\ndescription = \"Random character is valid\"\ninclude = true\n\n[2ca77b9b-c099-46c3-a02c-0d0f68ffa0fe]\ndescription = \"Each ability is only calculated once\"\ninclude = true\n\n"
  },
  {
    "path": "exercises/practice/dnd-character/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/dnd-character/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/dnd-character/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/dnd-character/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/dnd-character/dnd-character.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { DnDCharacter } from './dnd-character.ts'\n\ndescribe('Ability modifier', () => {\n  it('Ability modifier for score 3 is -4', () => {\n    expect(DnDCharacter.getModifierFor(3)).toEqual(-4)\n  })\n\n  xit('Ability modifier for score 4 is -3', () => {\n    expect(DnDCharacter.getModifierFor(4)).toEqual(-3)\n  })\n\n  xit('Ability modifier for score 5 is -3', () => {\n    expect(DnDCharacter.getModifierFor(5)).toEqual(-3)\n  })\n\n  xit('Ability modifier for score 6 is -2', () => {\n    expect(DnDCharacter.getModifierFor(6)).toEqual(-2)\n  })\n\n  xit('Ability modifier for score 7 is -2', () => {\n    expect(DnDCharacter.getModifierFor(7)).toEqual(-2)\n  })\n\n  xit('Ability modifier for score 8 is -1', () => {\n    expect(DnDCharacter.getModifierFor(8)).toEqual(-1)\n  })\n\n  xit('Ability modifier for score 9 is -1', () => {\n    expect(DnDCharacter.getModifierFor(9)).toEqual(-1)\n  })\n\n  xit('Ability modifier for score 10 is 0', () => {\n    expect(DnDCharacter.getModifierFor(10)).toEqual(0)\n  })\n\n  xit('Ability modifier for score 11 is 0', () => {\n    expect(DnDCharacter.getModifierFor(11)).toEqual(0)\n  })\n\n  xit('Ability modifier for score 12 is 1', () => {\n    expect(DnDCharacter.getModifierFor(12)).toEqual(1)\n  })\n\n  xit('Ability modifier for score 13 is 1', () => {\n    expect(DnDCharacter.getModifierFor(13)).toEqual(1)\n  })\n\n  xit('Ability modifier for score 14 is 2', () => {\n    expect(DnDCharacter.getModifierFor(14)).toEqual(2)\n  })\n\n  xit('Ability modifier for score 15 is 2', () => {\n    expect(DnDCharacter.getModifierFor(15)).toEqual(2)\n  })\n\n  xit('Ability modifier for score 16 is 3', () => {\n    expect(DnDCharacter.getModifierFor(16)).toEqual(3)\n  })\n\n  xit('Ability modifier for score 17 is 3', () => {\n    expect(DnDCharacter.getModifierFor(17)).toEqual(3)\n  })\n\n  xit('Ability modifier for score 18 is 4', () => {\n    expect(DnDCharacter.getModifierFor(18)).toEqual(4)\n  })\n})\n\ndescribe('Ability generator', () => {\n  xit('Random ability is within range', () => {\n    const abilityScore = DnDCharacter.generateAbilityScore()\n    expect(abilityScore).toBeGreaterThanOrEqual(3)\n    expect(abilityScore).toBeLessThanOrEqual(18)\n  })\n})\n\ndescribe('Character creation', () => {\n  xit('Random character is valid - hitpoints', () => {\n    const character = new DnDCharacter()\n\n    expect(character.hitpoints).toEqual(\n      10 + DnDCharacter.getModifierFor(character.constitution)\n    )\n  })\n\n  xit('Random character is valid - strength', () => {\n    const character = new DnDCharacter()\n\n    expect(character.strength).toBeGreaterThanOrEqual(3)\n    expect(character.strength).toBeLessThanOrEqual(18)\n  })\n\n  xit('Random character is valid - dexterity', () => {\n    const character = new DnDCharacter()\n\n    expect(character.dexterity).toBeGreaterThanOrEqual(3)\n    expect(character.dexterity).toBeLessThanOrEqual(18)\n  })\n\n  xit('Random character is valid - constitution', () => {\n    const character = new DnDCharacter()\n\n    expect(character.constitution).toBeGreaterThanOrEqual(3)\n    expect(character.constitution).toBeLessThanOrEqual(18)\n  })\n\n  xit('Random character is valid - intelligence', () => {\n    const character = new DnDCharacter()\n\n    expect(character.intelligence).toBeGreaterThanOrEqual(3)\n    expect(character.intelligence).toBeLessThanOrEqual(18)\n  })\n\n  xit('Random character is valid - wisdom', () => {\n    const character = new DnDCharacter()\n\n    expect(character.wisdom).toBeGreaterThanOrEqual(3)\n    expect(character.wisdom).toBeLessThanOrEqual(18)\n  })\n\n  xit('Random character is valid - charisma', () => {\n    const character = new DnDCharacter()\n\n    expect(character.charisma).toBeGreaterThanOrEqual(3)\n    expect(character.charisma).toBeLessThanOrEqual(18)\n  })\n\n  xit('Each ability is only calculated once', () => {\n    const character = new DnDCharacter()\n\n    expect(character.strength === character.strength).toBeTruthy()\n  })\n})\n"
  },
  {
    "path": "exercises/practice/dnd-character/dnd-character.ts",
    "content": "export class DnDCharacter {\n  public static generateAbilityScore(): number {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public static getModifierFor(abilityValue: number): number {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/dnd-character/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/dnd-character/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/dnd-character/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-dnd-character\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism practice exercise on dnd-character\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/dnd-character/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/dnd-character/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/eliuds-eggs/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to count the number of 1 bits in the binary representation of a number.\n\n## Restrictions\n\nKeep your hands off that bit-count functionality provided by your standard library!\nSolve this one yourself using other basic tools instead.\n"
  },
  {
    "path": "exercises/practice/eliuds-eggs/.docs/introduction.md",
    "content": "# Introduction\n\nYour friend Eliud inherited a farm from her grandma Tigist.\nHer granny was an inventor and had a tendency to build things in an overly complicated manner.\nThe chicken coop has a digital display showing an encoded number representing the positions of all eggs that could be picked up.\n\nEliud is asking you to write a program that shows the actual number of eggs in the coop.\n\nThe position information encoding is calculated as follows:\n\n1. Scan the potential egg-laying spots and mark down a `1` for an existing egg or a `0` for an empty spot.\n2. Convert the number from binary to decimal.\n3. Show the result on the display.\n\n## Example 1\n\n![Seven individual nest boxes arranged in a row whose first, third, fourth and seventh nests each have a single egg.](https://assets.exercism.org/images/exercises/eliuds-eggs/example-1-coop.svg)\n\n```text\n _ _ _ _ _ _ _\n|E| |E|E| | |E|\n```\n\n### Resulting Binary\n\n![1011001](https://assets.exercism.org/images/exercises/eliuds-eggs/example-1-binary.svg)\n\n```text\n _ _ _ _ _ _ _\n|1|0|1|1|0|0|1|\n```\n\n### Decimal number on the display\n\n89\n\n### Actual eggs in the coop\n\n4\n\n## Example 2\n\n![Seven individual nest boxes arranged in a row where only the fourth nest has an egg.](https://assets.exercism.org/images/exercises/eliuds-eggs/example-2-coop.svg)\n\n```text\n _ _ _ _ _ _ _\n| | | |E| | | |\n```\n\n### Resulting Binary\n\n![0001000](https://assets.exercism.org/images/exercises/eliuds-eggs/example-2-binary.svg)\n\n```text\n _ _ _ _ _ _ _\n|0|0|0|1|0|0|0|\n```\n\n### Decimal number on the display\n\n8\n\n### Actual eggs in the coop\n\n1\n"
  },
  {
    "path": "exercises/practice/eliuds-eggs/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"therealowenrees\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"eliuds-eggs.ts\"\n    ],\n    \"test\": [\n      \"eliuds-eggs.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Help Eliud count the number of eggs in her chicken coop by counting the number of 1 bits in a binary representation.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Christian Willner, Eric Willigers\",\n  \"source_url\": \"https://forum.exercism.org/t/new-exercise-suggestion-pop-count/7632/5\"\n}\n"
  },
  {
    "path": "exercises/practice/eliuds-eggs/.meta/proof.ci.ts",
    "content": "export const eggCount = (displayValue: number): number => {\n  let count = 0\n\n  while (displayValue !== 0) {\n    count += displayValue & 1\n    displayValue >>= 1\n  }\n\n  return count\n}\n"
  },
  {
    "path": "exercises/practice/eliuds-eggs/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[559e789d-07d1-4422-9004-3b699f83bca3]\ndescription = \"0 eggs\"\n\n[97223282-f71e-490c-92f0-b3ec9e275aba]\ndescription = \"1 egg\"\n\n[1f8fd18f-26e9-4144-9a0e-57cdfc4f4ff5]\ndescription = \"4 eggs\"\n\n[0c18be92-a498-4ef2-bcbb-28ac4b06cb81]\ndescription = \"13 eggs\"\n"
  },
  {
    "path": "exercises/practice/eliuds-eggs/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/eliuds-eggs/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/eliuds-eggs/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/eliuds-eggs/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/eliuds-eggs/eliuds-eggs.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { eggCount } from './eliuds-eggs.ts'\n\ndescribe('EliudsEggs', () => {\n  it('0 eggs', () => {\n    const expected = 0\n    const actual = eggCount(0)\n    expect(actual).toEqual(expected)\n  })\n\n  xit('1 egg', () => {\n    const expected = 1\n    const actual = eggCount(16)\n    expect(actual).toEqual(expected)\n  })\n\n  xit('4 eggs', () => {\n    const expected = 4\n    const actual = eggCount(89)\n    expect(actual).toEqual(expected)\n  })\n\n  xit('13 eggs', () => {\n    const expected = 13\n    const actual = eggCount(2000000000)\n    expect(actual).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/eliuds-eggs/eliuds-eggs.ts",
    "content": "//\n// This is only a SKELETON file for the 'Pop Count' exercise. It's been provided as a\n// convenience to get you started writing code faster.\n//\n\nexport const eggCount = (displayValue: unknown): unknown => {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/eliuds-eggs/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/eliuds-eggs/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/eliuds-eggs/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-eliuds-eggs\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/eliuds-eggs/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/eliuds-eggs/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/etl/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to change the data format of letters and their point values in the game.\n\nCurrently, letters are stored in groups based on their score, in a one-to-many mapping.\n\n- 1 point: \"A\", \"E\", \"I\", \"O\", \"U\", \"L\", \"N\", \"R\", \"S\", \"T\",\n- 2 points: \"D\", \"G\",\n- 3 points: \"B\", \"C\", \"M\", \"P\",\n- 4 points: \"F\", \"H\", \"V\", \"W\", \"Y\",\n- 5 points: \"K\",\n- 8 points: \"J\", \"X\",\n- 10 points: \"Q\", \"Z\",\n\nThis needs to be changed to store each individual letter with its score in a one-to-one mapping.\n\n- \"a\" is worth 1 point.\n- \"b\" is worth 3 points.\n- \"c\" is worth 3 points.\n- \"d\" is worth 2 points.\n- etc.\n\nAs part of this change, the team has also decided to change the letters to be lower-case rather than upper-case.\n\n~~~~exercism/note\nIf you want to look at how the data was previously structured and how it needs to change, take a look at the examples in the test suite.\n~~~~\n"
  },
  {
    "path": "exercises/practice/etl/.docs/introduction.md",
    "content": "# Introduction\n\nYou work for a company that makes an online multiplayer game called Lexiconia.\n\nTo play the game, each player is given 13 letters, which they must rearrange to create words.\nDifferent letters have different point values, since it's easier to create words with some letters than others.\n\nThe game was originally launched in English, but it is very popular, and now the company wants to expand to other languages as well.\n\nDifferent languages need to support different point values for letters.\nThe point values are determined by how often letters are used, compared to other letters in that language.\n\nFor example, the letter 'C' is quite common in English, and is only worth 3 points.\nBut in Norwegian it's a very rare letter, and is worth 10 points.\n\nTo make it easier to add new languages, your team needs to change the way letters and their point values are stored in the game.\n"
  },
  {
    "path": "exercises/practice/etl/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"masters3d\"\n  ],\n  \"contributors\": [\n    \"lukaszklis\",\n    \"pranasziaukas\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"etl.ts\"\n    ],\n    \"test\": [\n      \"etl.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Change the data format for scoring a game to more easily add other languages.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Based on an exercise by the JumpstartLab team for students at The Turing School of Software and Design.\",\n  \"source_url\": \"https://www.turing.edu/\"\n}\n"
  },
  {
    "path": "exercises/practice/etl/.meta/proof.ci.ts",
    "content": "export function transform(input: { [key: string]: string[] }): {\n  [key: string]: number\n} {\n  const phase1: { [key: string]: number } = {}\n\n  for (const key in input) {\n    if (Object.prototype.hasOwnProperty.call(input, key)) {\n      const value = input[key]\n      for (const each of value) {\n        phase1[each.toLowerCase()] = Number.parseInt(key, 10)\n      }\n    }\n  }\n  return phase1\n}\n"
  },
  {
    "path": "exercises/practice/etl/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[78a7a9f9-4490-4a47-8ee9-5a38bb47d28f]\ndescription = \"single letter\"\n\n[60dbd000-451d-44c7-bdbb-97c73ac1f497]\ndescription = \"single score with multiple letters\"\n\n[f5c5de0c-301f-4fdd-a0e5-df97d4214f54]\ndescription = \"multiple scores with multiple letters\"\n\n[5db8ea89-ecb4-4dcd-902f-2b418cc87b9d]\ndescription = \"multiple scores with differing numbers of letters\"\n"
  },
  {
    "path": "exercises/practice/etl/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/etl/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/etl/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/etl/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/etl/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/etl/etl.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { transform } from './etl.ts'\n\ndescribe('Transform', () => {\n  it('transforms one value', () => {\n    const old: { [key: string]: string[] } = { 1: ['A'] }\n    const expected: { [key: string]: number } = { a: 1 }\n\n    expect(transform(old)).toEqual(expected)\n  })\n\n  xit('transforms more values', () => {\n    const old = { 1: ['A', 'E', 'I', 'O', 'U'] }\n    const expected = { a: 1, e: 1, i: 1, o: 1, u: 1 }\n\n    expect(transform(old)).toEqual(expected)\n  })\n\n  xit('transforms more keys', () => {\n    const old = { 1: ['A', 'E'], 2: ['D', 'G'] }\n    const expected = { a: 1, e: 1, d: 2, g: 2 }\n\n    expect(transform(old)).toEqual(expected)\n  })\n\n  xit('transforms a full dataset', () => {\n    const old = {\n      1: ['A', 'E', 'I', 'O', 'U', 'L', 'N', 'R', 'S', 'T'],\n      2: ['D', 'G'],\n      3: ['B', 'C', 'M', 'P'],\n      4: ['F', 'H', 'V', 'W', 'Y'],\n      5: ['K'],\n      8: ['J', 'X'],\n      10: ['Q', 'Z'],\n    }\n    const expected = {\n      a: 1,\n      b: 3,\n      c: 3,\n      d: 2,\n      e: 1,\n      f: 4,\n      g: 2,\n      h: 4,\n      i: 1,\n      j: 8,\n      k: 5,\n      l: 1,\n      m: 3,\n      n: 1,\n      o: 1,\n      p: 3,\n      q: 10,\n      r: 1,\n      s: 1,\n      t: 1,\n      u: 1,\n      v: 4,\n      w: 4,\n      x: 8,\n      y: 4,\n      z: 10,\n    }\n\n    expect(transform(old)).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/etl/etl.ts",
    "content": "export function transform(/* Parameters go here */) {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/etl/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/etl/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-etl\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/etl/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/etl/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/flatten-array/.docs/instructions.md",
    "content": "# Instructions\n\nTake a nested array of any depth and return a fully flattened array.\n\nNote that some language tracks may include null-like values in the input array, and the way these values are represented varies by track.\nSuch values should be excluded from the flattened array.\n\nAdditionally, the input may be of a different data type and contain different types, depending on the track.\n\nCheck the test suite for details.\n\n## Example\n\ninput: `[1, [2, 6, null], [[null, [4]], 5]]`\n\noutput: `[1, 2, 6, 4, 5]`\n"
  },
  {
    "path": "exercises/practice/flatten-array/.docs/introduction.md",
    "content": "# Introduction\n\nA shipment of emergency supplies has arrived, but there's a problem.\nTo protect from damage, the items — flashlights, first-aid kits, blankets — are packed inside boxes, and some of those boxes are nested several layers deep inside other boxes!\n\nTo be prepared for an emergency, everything must be easily accessible in one box.\nCan you unpack all the supplies and place them into a single box, so they're ready when needed most?\n"
  },
  {
    "path": "exercises/practice/flatten-array/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"flatten-array.ts\"\n    ],\n    \"test\": [\n      \"flatten-array.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Take a nested list and return a single list with all values except nil/null.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Interview Question\",\n  \"source_url\": \"https://reference.wolfram.com/language/ref/Flatten.html\"\n}\n"
  },
  {
    "path": "exercises/practice/flatten-array/.meta/proof.ci.ts",
    "content": "export function flatten<A, T extends Array<A | A[]>>(arr: T): A[] {\n  return arr\n    .reduce(\n      (acc: A[], el) =>\n        Array.isArray(el) ? acc.concat(flatten(el)) : acc.concat(el),\n      []\n    )\n    .filter((el: A) => el !== null && el !== undefined)\n}\n"
  },
  {
    "path": "exercises/practice/flatten-array/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[8c71dabd-da60-422d-a290-4a571471fb14]\ndescription = \"empty\"\n\n[d268b919-963c-442d-9f07-82b93f1b518c]\ndescription = \"no nesting\"\n\n[3f15bede-c856-479e-bb71-1684b20c6a30]\ndescription = \"flattens a nested array\"\n\n[c84440cc-bb3a-48a6-862c-94cf23f2815d]\ndescription = \"flattens array with just integers present\"\n\n[d3d99d39-6be5-44f5-a31d-6037d92ba34f]\ndescription = \"5 level nesting\"\n\n[d572bdba-c127-43ed-bdcd-6222ac83d9f7]\ndescription = \"6 level nesting\"\n\n[0705a8e5-dc86-4cec-8909-150c5e54fa9c]\ndescription = \"null values are omitted from the final result\"\n\n[c6cf26de-8ccd-4410-84bd-b9efd88fd2bc]\ndescription = \"consecutive null values at the front of the list are omitted from the final result\"\ninclude = false\n\n[bc72da10-5f55-4ada-baf3-50e4da02ec8e]\ndescription = \"consecutive null values at the front of the array are omitted from the final result\"\nreimplements = \"c6cf26de-8ccd-4410-84bd-b9efd88fd2bc\"\n\n[382c5242-587e-4577-b8ce-a5fb51e385a1]\ndescription = \"consecutive null values in the middle of the list are omitted from the final result\"\ninclude = false\n\n[6991836d-0d9b-4703-80a0-3f1f23eb5981]\ndescription = \"consecutive null values in the middle of the array are omitted from the final result\"\nreimplements = \"382c5242-587e-4577-b8ce-a5fb51e385a1\"\n\n[ef1d4790-1b1e-4939-a179-51ace0829dbd]\ndescription = \"6 level nest list with null values\"\ninclude = false\n\n[dc90a09c-5376-449c-a7b3-c2d20d540069]\ndescription = \"6 level nested array with null values\"\nreimplements = \"ef1d4790-1b1e-4939-a179-51ace0829dbd\"\n\n[85721643-705a-4150-93ab-7ae398e2942d]\ndescription = \"all values in nested list are null\"\ninclude = false\n\n[51f5d9af-8f7f-4fb5-a156-69e8282cb275]\ndescription = \"all values in nested array are null\"\nreimplements = \"85721643-705a-4150-93ab-7ae398e2942d\"\n"
  },
  {
    "path": "exercises/practice/flatten-array/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/flatten-array/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/flatten-array/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/flatten-array/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/flatten-array/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/flatten-array/flatten-array.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { flatten } from './flatten-array.ts'\n\ndescribe('Flatten Array', () => {\n  it('empty', () => {\n    const arr = []\n    const expected = []\n    expect(flatten(arr)).toEqual(expected)\n  })\n\n  xit('no nesting', () => {\n    const arr = [0, 1, 2]\n    const expected = [0, 1, 2]\n    expect(flatten(arr)).toEqual(expected)\n  })\n\n  xit('flattens a nested array', () => {\n    const arr = [[[]]]\n    const expected = []\n    expect(flatten(arr)).toEqual(expected)\n  })\n\n  xit('flattens array with just integers present', () => {\n    const arr = [1, [2, 3, 4, 5, 6, 7], 8]\n    const expected = [1, 2, 3, 4, 5, 6, 7, 8]\n    expect(flatten(arr)).toEqual(expected)\n  })\n\n  xit('5 level nesting', () => {\n    const arr = [0, 2, [[2, 3], 8, 100, 4, [[[50]]]], -2]\n    const expected = [0, 2, 2, 3, 8, 100, 4, 50, -2]\n    expect(flatten(arr)).toEqual(expected)\n  })\n\n  xit('6 level nesting', () => {\n    const arr = [1, [2, [[3]], [4, [[5]]], 6, 7], 8]\n    const expected = [1, 2, 3, 4, 5, 6, 7, 8]\n    expect(flatten(arr)).toEqual(expected)\n  })\n\n  xit('consecutive null values at the front of the array are omitted from the final result', () => {\n    const arr = [undefined, undefined, 3]\n    const expected = [3]\n    expect(flatten(arr)).toEqual(expected)\n  })\n\n  xit('consecutive null values in the middle of the array are omitted from the final result', () => {\n    const arr = [1, undefined, undefined, 4]\n    const expected = [1, 4]\n    expect(flatten(arr)).toEqual(expected)\n  })\n\n  xit('6 level nest array with null values', () => {\n    const arr = [0, 2, [[2, 3], 8, [[100]], undefined, [[undefined]]], -2]\n    const expected = [0, 2, 2, 3, 8, 100, -2]\n    expect(flatten(arr)).toEqual(expected)\n  })\n\n  xit('all values in nested array are null', () => {\n    const expected: number[] = []\n    expect(\n      flatten([\n        undefined,\n        [[[undefined]]],\n        undefined,\n        undefined,\n        [[undefined, undefined], undefined],\n        undefined,\n      ])\n    ).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/flatten-array/flatten-array.ts",
    "content": "export function flatten(/* Parameters go here */) {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/flatten-array/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/flatten-array/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-flatten-array\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/flatten-array/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/flatten-array/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/flower-field/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to add flower counts to empty squares in a completed Flower Field garden.\nThe garden itself is a rectangle board composed of squares that are either empty (`' '`) or a flower (`'*'`).\n\nFor each empty square, count the number of flowers adjacent to it (horizontally, vertically, diagonally).\nIf the empty square has no adjacent flowers, leave it empty.\nOtherwise replace it with the count of adjacent flowers.\n\nFor example, you may receive a 5 x 4 board like this (empty spaces are represented here with the '·' character for display on screen):\n\n```text\n·*·*·\n··*··\n··*··\n·····\n```\n\nWhich your code should transform into this:\n\n```text\n1*3*1\n13*31\n·2*2·\n·111·\n```\n"
  },
  {
    "path": "exercises/practice/flower-field/.docs/introduction.md",
    "content": "# Introduction\n\n[Flower Field][history] is a compassionate reimagining of the popular game Minesweeper.\nThe object of the game is to find all the flowers in the garden using numeric hints that indicate how many flowers are directly adjacent (horizontally, vertically, diagonally) to a square.\n\"Flower Field\" shipped in regional versions of Microsoft Windows in Italy, Germany, South Korea, Japan and Taiwan.\n\n[history]: https://web.archive.org/web/20020409051321fw_/http://rcm.usr.dsi.unimi.it/rcmweb/fnm/\n"
  },
  {
    "path": "exercises/practice/flower-field/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"BNAndras\",\n    \"iignatov\",\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"flower-field.ts\"\n    ],\n    \"test\": [\n      \"flower-field.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Mark all the flowers in a garden.\"\n}\n"
  },
  {
    "path": "exercises/practice/flower-field/.meta/proof.ci.ts",
    "content": "const FLOWER = '*'\n\nconst DELTAS = [\n  [-1, -1],\n  [-1, 0],\n  [-1, 1],\n  [1, 1],\n  [1, 0],\n  [1, -1],\n  [0, 1],\n  [0, -1],\n]\n\nexport function annotate(rows: string[]): string[] {\n  if (noDataPresent(rows)) {\n    return rows\n  }\n\n  const inputBoard = rows.map((row) => [...row])\n\n  const result = inputBoard.map((row, x) =>\n    [...row].map((cell, y) => cellToFlowerOrCount(cell, inputBoard, x, y))\n  )\n\n  return stringify(result as string[][])\n}\n\nfunction cellToFlowerOrCount(\n  cell: string,\n  inputBoard: string[][],\n  x: number,\n  y: number\n): number | '*' | ' ' {\n  if (cell === FLOWER) {\n    return FLOWER\n  }\n  return countAdjacentFlowers(inputBoard, x, y) || ' '\n}\n\nfunction countAdjacentFlowers(board: string[][], x: number, y: number): number {\n  return DELTAS.filter((d) => adjacentSquareIsOnBoard(board, x, d)).filter(\n    (d) => adjacentSquareHasFlower(board, x, y, d)\n  ).length\n}\n\nfunction stringify(board: string[][]): string[] {\n  return board.map((row) => row.join(''))\n}\n\nfunction noDataPresent(rows: string[]): boolean {\n  return rows.length === 0 || rows[0].length === 0\n}\n\nfunction adjacentSquareIsOnBoard(\n  board: string[][],\n  x: number,\n  d: number[]\n): string[] {\n  return board[x + d[0]]\n}\n\nfunction adjacentSquareHasFlower(\n  board: string[][],\n  x: number,\n  y: number,\n  d: number[]\n): boolean {\n  return board[x + d[0]][y + d[1]] === FLOWER\n}\n"
  },
  {
    "path": "exercises/practice/flower-field/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[237ff487-467a-47e1-9b01-8a891844f86c]\ndescription = \"no rows\"\n\n[4b4134ec-e20f-439c-a295-664c38950ba1]\ndescription = \"no columns\"\n\n[d774d054-bbad-4867-88ae-069cbd1c4f92]\ndescription = \"no flowers\"\n\n[225176a0-725e-43cd-aa13-9dced501f16e]\ndescription = \"garden full of flowers\"\n\n[3f345495-f1a5-4132-8411-74bd7ca08c49]\ndescription = \"flower surrounded by spaces\"\n\n[6cb04070-4199-4ef7-a6fa-92f68c660fca]\ndescription = \"space surrounded by flowers\"\n\n[272d2306-9f62-44fe-8ab5-6b0f43a26338]\ndescription = \"horizontal line\"\n\n[c6f0a4b2-58d0-4bf6-ad8d-ccf4144f1f8e]\ndescription = \"horizontal line, flowers at edges\"\n\n[a54e84b7-3b25-44a8-b8cf-1753c8bb4cf5]\ndescription = \"vertical line\"\n\n[b40f42f5-dec5-4abc-b167-3f08195189c1]\ndescription = \"vertical line, flowers at edges\"\n\n[58674965-7b42-4818-b930-0215062d543c]\ndescription = \"cross\"\n\n[dd9d4ca8-9e68-4f78-a677-a2a70fd7a7b8]\ndescription = \"large garden\"\n\n[6e4ac13a-3e43-4728-a2e3-3551d4b1a996]\ndescription = \"multiple adjacent flowers\"\n"
  },
  {
    "path": "exercises/practice/flower-field/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/flower-field/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/flower-field/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/flower-field/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/flower-field/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/flower-field/flower-field.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { annotate } from './flower-field.ts'\n\ndescribe('Flower Field annotate', () => {\n  it('handles no rows', () => {\n    expect(annotate([])).toEqual([])\n  })\n\n  xit('handles no columns', () => {\n    expect(annotate([''])).toEqual([''])\n  })\n\n  xit('handles no flowers', () => {\n    const input = ['   ', '   ', '   ']\n    const expected = ['   ', '   ', '   ']\n    expect(annotate(input)).toEqual(expected)\n  })\n\n  xit('handles garden full of flowers', () => {\n    const input = ['***', '***', '***']\n    const expected = ['***', '***', '***']\n    expect(annotate(input)).toEqual(expected)\n  })\n\n  xit('handles flower surrounded by spaces', () => {\n    const input = ['   ', ' * ', '   ']\n    const expected = ['111', '1*1', '111']\n    expect(annotate(input)).toEqual(expected)\n  })\n\n  xit('handles space surrounded by flowers', () => {\n    const input = ['***', '* *', '***']\n    const expected = ['***', '*8*', '***']\n    expect(annotate(input)).toEqual(expected)\n  })\n\n  xit('handles horizontal line', () => {\n    const input = [' * * ']\n    const expected = ['1*2*1']\n    expect(annotate(input)).toEqual(expected)\n  })\n\n  xit('handles horizontal line, flowers at edges', () => {\n    const input = ['*   *']\n    const expected = ['*1 1*']\n    expect(annotate(input)).toEqual(expected)\n  })\n\n  xit('handles vertical line', () => {\n    const input = [' ', '*', ' ', '*', ' ']\n    const expected = ['1', '*', '2', '*', '1']\n    expect(annotate(input)).toEqual(expected)\n  })\n\n  xit('handles vertical line, flowers at edges', () => {\n    const input = ['*', ' ', ' ', ' ', '*']\n    const expected = ['*', '1', ' ', '1', '*']\n    expect(annotate(input)).toEqual(expected)\n  })\n\n  xit('handles cross', () => {\n    const input = ['  *  ', '  *  ', '*****', '  *  ', '  *  ']\n    const expected = [' 2*2 ', '25*52', '*****', '25*52', ' 2*2 ']\n    expect(annotate(input)).toEqual(expected)\n  })\n\n  xit('handles large gardem', () => {\n    const input = [' *  * ', '  *   ', '    * ', '   * *', ' *  * ', '      ']\n    const expected = [\n      '1*22*1',\n      '12*322',\n      ' 123*2',\n      '112*4*',\n      '1*22*2',\n      '111111',\n    ]\n    expect(annotate(input)).toEqual(expected)\n  })\n\n  xit('multiple adjacent flowers', () => {\n    expect(annotate([' ** '])).toEqual(['1**1'])\n  })\n})\n"
  },
  {
    "path": "exercises/practice/flower-field/flower-field.ts",
    "content": "export function annotate(field: unknown): unknown {\n  throw new Error('Remove this statement and implement this function')\n}\n"
  },
  {
    "path": "exercises/practice/flower-field/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/flower-field/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-flower-field\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/flower-field/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/flower-field/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/food-chain/.docs/instructions.md",
    "content": "# Instructions\n\nGenerate the lyrics of the song 'I Know an Old Lady Who Swallowed a Fly'.\n\nWhile you could copy/paste the lyrics, or read them from a file, this problem is much more interesting if you approach it algorithmically.\n\nThis is a [cumulative song][cumulative-song] of unknown origin.\n\nThis is one of many common variants.\n\n```text\nI know an old lady who swallowed a fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n\nI know an old lady who swallowed a spider.\nIt wriggled and jiggled and tickled inside her.\nShe swallowed the spider to catch the fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n\nI know an old lady who swallowed a bird.\nHow absurd to swallow a bird!\nShe swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\nShe swallowed the spider to catch the fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n\nI know an old lady who swallowed a cat.\nImagine that, to swallow a cat!\nShe swallowed the cat to catch the bird.\nShe swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\nShe swallowed the spider to catch the fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n\nI know an old lady who swallowed a dog.\nWhat a hog, to swallow a dog!\nShe swallowed the dog to catch the cat.\nShe swallowed the cat to catch the bird.\nShe swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\nShe swallowed the spider to catch the fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n\nI know an old lady who swallowed a goat.\nJust opened her throat and swallowed a goat!\nShe swallowed the goat to catch the dog.\nShe swallowed the dog to catch the cat.\nShe swallowed the cat to catch the bird.\nShe swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\nShe swallowed the spider to catch the fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n\nI know an old lady who swallowed a cow.\nI don't know how she swallowed a cow!\nShe swallowed the cow to catch the goat.\nShe swallowed the goat to catch the dog.\nShe swallowed the dog to catch the cat.\nShe swallowed the cat to catch the bird.\nShe swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\nShe swallowed the spider to catch the fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n\nI know an old lady who swallowed a horse.\nShe's dead, of course!\n```\n\n[cumulative-song]: https://en.wikipedia.org/wiki/Cumulative_song\n"
  },
  {
    "path": "exercises/practice/food-chain/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"masters3d\"\n  ],\n  \"contributors\": [\n    \"lukaszklis\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"food-chain.ts\"\n    ],\n    \"test\": [\n      \"food-chain.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Generate the lyrics of the song 'I Know an Old Lady Who Swallowed a Fly'.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Wikipedia\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/There_Was_an_Old_Lady_Who_Swallowed_a_Fly\"\n}\n"
  },
  {
    "path": "exercises/practice/food-chain/.meta/proof.ci.ts",
    "content": "const animals = [\n  'fly',\n  'spider',\n  'bird',\n  'cat',\n  'dog',\n  'goat',\n  'cow',\n  'horse',\n] as const\n\nexport function verses(start = 1, end = 8): string {\n  if (end < start) {\n    throw new Error('end should be smaller than the start')\n  }\n  let result = ''\n\n  for (; start <= end; start += 1) {\n    result += verse(start)\n    if (start !== end) {\n      result += '\\n'\n    }\n  }\n  return result\n}\n\nexport function verse(num: number): string {\n  let result = ''\n\n  let index = num - 1\n  result += `I know an old lady who swallowed a ${animals[index]}.\\n`\n\n  switch (num) {\n    case 2:\n      result += 'It wriggled and jiggled and tickled inside her.\\n'\n      break\n    case 3:\n      result += 'How absurd to swallow a bird!\\n'\n      break\n    case 4:\n      result += 'Imagine that, to swallow a cat!\\n'\n      break\n    case 5:\n      result += 'What a hog, to swallow a dog!\\n'\n      break\n    case 6:\n      result += 'Just opened her throat and swallowed a goat!\\n'\n      break\n    case 7:\n      result += \"I don't know how she swallowed a cow!\\n\"\n      break\n    case 8:\n      result += \"She's dead, of course!\\n\"\n      return result\n    default:\n      break\n  }\n\n  while (index >= 1) {\n    result += `She swallowed the ${animals[index]} to catch the ${\n      animals[index - 1]\n    }`\n    if (index === 2) {\n      result += ' that wriggled and jiggled and tickled inside her'\n    }\n    result += '.\\n'\n    index -= 1\n  }\n  result += \"I don't know why she swallowed the fly. Perhaps she'll die.\"\n\n  return result + '\\n'\n}\n"
  },
  {
    "path": "exercises/practice/food-chain/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[751dce68-9412-496e-b6e8-855998c56166]\ndescription = \"fly\"\n\n[6c56f861-0c5e-4907-9a9d-b2efae389379]\ndescription = \"spider\"\n\n[3edf5f33-bef1-4e39-ae67-ca5eb79203fa]\ndescription = \"bird\"\n\n[e866a758-e1ff-400e-9f35-f27f28cc288f]\ndescription = \"cat\"\n\n[3f02c30e-496b-4b2a-8491-bc7e2953cafb]\ndescription = \"dog\"\n\n[4b3fd221-01ea-46e0-825b-5734634fbc59]\ndescription = \"goat\"\n\n[1b707da9-7001-4fac-941f-22ad9c7a65d4]\ndescription = \"cow\"\n\n[3cb10d46-ae4e-4d2c-9296-83c9ffc04cdc]\ndescription = \"horse\"\n\n[22b863d5-17e4-4d1e-93e4-617329a5c050]\ndescription = \"multiple verses\"\n\n[e626b32b-745c-4101-bcbd-3b13456893db]\ndescription = \"full song\"\n"
  },
  {
    "path": "exercises/practice/food-chain/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/food-chain/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/food-chain/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/food-chain/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/food-chain/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/food-chain/food-chain.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { verse, verses } from './food-chain.ts'\n\ndescribe('Food Chain', () => {\n  it('fly', () => {\n    const expected = `I know an old lady who swallowed a fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n`\n\n    expect(verse(1)).toEqual(expected)\n  })\n\n  xit('spider', () => {\n    const expected = `I know an old lady who swallowed a spider.\nIt wriggled and jiggled and tickled inside her.\nShe swallowed the spider to catch the fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n`\n\n    expect(verse(2)).toEqual(expected)\n  })\n\n  xit('bird', () => {\n    const expected = `I know an old lady who swallowed a bird.\nHow absurd to swallow a bird!\nShe swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\nShe swallowed the spider to catch the fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n`\n\n    expect(verse(3)).toEqual(expected)\n  })\n\n  xit('cat', () => {\n    const expected = `I know an old lady who swallowed a cat.\nImagine that, to swallow a cat!\nShe swallowed the cat to catch the bird.\nShe swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\nShe swallowed the spider to catch the fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n`\n\n    expect(verse(4)).toEqual(expected)\n  })\n\n  xit('dog', () => {\n    const expected = `I know an old lady who swallowed a dog.\nWhat a hog, to swallow a dog!\nShe swallowed the dog to catch the cat.\nShe swallowed the cat to catch the bird.\nShe swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\nShe swallowed the spider to catch the fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n`\n\n    expect(verse(5)).toEqual(expected)\n  })\n\n  xit('goat', () => {\n    const expected = `I know an old lady who swallowed a goat.\nJust opened her throat and swallowed a goat!\nShe swallowed the goat to catch the dog.\nShe swallowed the dog to catch the cat.\nShe swallowed the cat to catch the bird.\nShe swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\nShe swallowed the spider to catch the fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n`\n\n    expect(verse(6)).toEqual(expected)\n  })\n\n  xit('cow', () => {\n    const expected = `I know an old lady who swallowed a cow.\nI don't know how she swallowed a cow!\nShe swallowed the cow to catch the goat.\nShe swallowed the goat to catch the dog.\nShe swallowed the dog to catch the cat.\nShe swallowed the cat to catch the bird.\nShe swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\nShe swallowed the spider to catch the fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n`\n\n    expect(verse(7)).toEqual(expected)\n  })\n\n  xit('horse', () => {\n    const expected = `I know an old lady who swallowed a horse.\nShe's dead, of course!\n`\n\n    expect(verse(8)).toEqual(expected)\n  })\n\n  xit('multiple verses', () => {\n    const expected = `I know an old lady who swallowed a fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n\nI know an old lady who swallowed a spider.\nIt wriggled and jiggled and tickled inside her.\nShe swallowed the spider to catch the fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n`\n\n    expect(verses(1, 2)).toEqual(expected)\n  })\n\n  xit('the whole song', () => {\n    const expected = `I know an old lady who swallowed a fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n\nI know an old lady who swallowed a spider.\nIt wriggled and jiggled and tickled inside her.\nShe swallowed the spider to catch the fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n\nI know an old lady who swallowed a bird.\nHow absurd to swallow a bird!\nShe swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\nShe swallowed the spider to catch the fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n\nI know an old lady who swallowed a cat.\nImagine that, to swallow a cat!\nShe swallowed the cat to catch the bird.\nShe swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\nShe swallowed the spider to catch the fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n\nI know an old lady who swallowed a dog.\nWhat a hog, to swallow a dog!\nShe swallowed the dog to catch the cat.\nShe swallowed the cat to catch the bird.\nShe swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\nShe swallowed the spider to catch the fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n\nI know an old lady who swallowed a goat.\nJust opened her throat and swallowed a goat!\nShe swallowed the goat to catch the dog.\nShe swallowed the dog to catch the cat.\nShe swallowed the cat to catch the bird.\nShe swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\nShe swallowed the spider to catch the fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n\nI know an old lady who swallowed a cow.\nI don't know how she swallowed a cow!\nShe swallowed the cow to catch the goat.\nShe swallowed the goat to catch the dog.\nShe swallowed the dog to catch the cat.\nShe swallowed the cat to catch the bird.\nShe swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.\nShe swallowed the spider to catch the fly.\nI don't know why she swallowed the fly. Perhaps she'll die.\n\nI know an old lady who swallowed a horse.\nShe's dead, of course!\n`\n    expect(verses(1, 8)).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/food-chain/food-chain.ts",
    "content": "export function verse(/* Parameters go here */) {\n  throw new Error('Remove this line and implement the function')\n}\n\nexport function verses(/* Parameters go here */) {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/food-chain/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/food-chain/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-food-chain\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/food-chain/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/food-chain/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/game-of-life/.docs/instructions.md",
    "content": "# Instructions\n\nAfter each generation, the cells interact with their eight neighbors, which are cells adjacent horizontally, vertically, or diagonally.\n\nThe following rules are applied to each cell:\n\n- Any live cell with two or three live neighbors lives on.\n- Any dead cell with exactly three live neighbors becomes a live cell.\n- All other cells die or stay dead.\n\nGiven a matrix of 1s and 0s (corresponding to live and dead cells), apply the rules to each cell, and return the next generation.\n"
  },
  {
    "path": "exercises/practice/game-of-life/.docs/introduction.md",
    "content": "# Introduction\n\n[Conway's Game of Life][game-of-life] is a fascinating cellular automaton created by the British mathematician John Horton Conway in 1970.\n\nThe game consists of a two-dimensional grid of cells that can either be \"alive\" or \"dead.\"\n\nAfter each generation, the cells interact with their eight neighbors via a set of rules, which define the new generation.\n\n[game-of-life]: https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life\n"
  },
  {
    "path": "exercises/practice/game-of-life/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"BNAndras\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"game-of-life.ts\"\n    ],\n    \"test\": [\n      \"game-of-life.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Implement Conway's Game of Life.\",\n  \"source\": \"Wikipedia\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life\"\n}\n"
  },
  {
    "path": "exercises/practice/game-of-life/.meta/proof.ci.ts",
    "content": "export class GameOfLife {\n  constructor(private matrix: number[][]) {}\n\n  public tick(): void {\n    if (this.matrix.length === 0) {\n      return\n    }\n    const rows = this.matrix.length\n    const cols = this.matrix[0].length\n\n    const newMatrix = JSON.parse(JSON.stringify(this.matrix)) as number[][]\n\n    for (let row = 0; row < rows; row++) {\n      for (let col = 0; col < cols; col++) {\n        let liveNeighbors = 0\n        for (let newRow = row - 1; newRow <= row + 1; newRow++) {\n          for (let newCol = col - 1; newCol <= col + 1; newCol++) {\n            if (newRow === row && newCol === col) {\n              continue\n            }\n            if (newRow >= 0 && newRow < rows && newCol >= 0 && newCol < cols) {\n              liveNeighbors += this.matrix[newRow][newCol]\n            }\n          }\n        }\n\n        let cell = this.matrix[row][col]\n        if (cell === 1) {\n          if (liveNeighbors < 2 || liveNeighbors > 3) {\n            cell = 0\n          }\n        } else {\n          if (liveNeighbors === 3) {\n            cell = 1\n          }\n        }\n\n        newMatrix[row][col] = cell\n      }\n    }\n\n    this.matrix = newMatrix\n  }\n\n  public state(): number[][] {\n    return this.matrix\n  }\n}\n"
  },
  {
    "path": "exercises/practice/game-of-life/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[ae86ea7d-bd07-4357-90b3-ac7d256bd5c5]\ndescription = \"empty matrix\"\n\n[4ea5ccb7-7b73-4281-954a-bed1b0f139a5]\ndescription = \"live cells with zero live neighbors die\"\n\n[df245adc-14ff-4f9c-b2ae-f465ef5321b2]\ndescription = \"live cells with only one live neighbor die\"\n\n[2a713b56-283c-48c8-adae-1d21306c80ae]\ndescription = \"live cells with two live neighbors stay alive\"\n\n[86d5c5a5-ab7b-41a1-8907-c9b3fc5e9dae]\ndescription = \"live cells with three live neighbors stay alive\"\n\n[015f60ac-39d8-4c6c-8328-57f334fc9f89]\ndescription = \"dead cells with three live neighbors become alive\"\n\n[2ee69c00-9d41-4b8b-89da-5832e735ccf1]\ndescription = \"live cells with four or more neighbors die\"\n\n[a79b42be-ed6c-4e27-9206-43da08697ef6]\ndescription = \"bigger matrix\"\n"
  },
  {
    "path": "exercises/practice/game-of-life/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/game-of-life/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/game-of-life/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/game-of-life/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/game-of-life/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/game-of-life/game-of-life.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { GameOfLife } from './game-of-life.ts'\n\ndescribe('Game of Life', () => {\n  // Empty matrix\n  it('empty matrix', () => {\n    const matrix: number[][] = []\n    const game = new GameOfLife(matrix)\n    game.tick()\n    const expected: number[][] = []\n    expect(game.state()).toEqual(expected)\n  })\n\n  // Live cells with zero live neighbors die\n  xit('live cells with zero live neighbors die', () => {\n    const matrix = [\n      [0, 0, 0],\n      [0, 1, 0],\n      [0, 0, 0],\n    ]\n    const game = new GameOfLife(matrix)\n    game.tick()\n    const expected = [\n      [0, 0, 0],\n      [0, 0, 0],\n      [0, 0, 0],\n    ]\n    expect(game.state()).toEqual(expected)\n  })\n\n  // Live cells with only one live neighbor die\n  xit('live cells with only one live neighbor die', () => {\n    const matrix = [\n      [0, 0, 0],\n      [0, 1, 0],\n      [0, 1, 0],\n    ]\n    const game = new GameOfLife(matrix)\n    game.tick()\n    const expected = [\n      [0, 0, 0],\n      [0, 0, 0],\n      [0, 0, 0],\n    ]\n    expect(game.state()).toEqual(expected)\n  })\n\n  // Live cells with two live neighbors stay alive\n  xit('live cells with two live neighbors stay alive', () => {\n    const matrix = [\n      [1, 0, 1],\n      [1, 0, 1],\n      [1, 0, 1],\n    ]\n    const game = new GameOfLife(matrix)\n    game.tick()\n    const expected = [\n      [0, 0, 0],\n      [1, 0, 1],\n      [0, 0, 0],\n    ]\n    expect(game.state()).toEqual(expected)\n  })\n\n  // Live cells with three live neighbors stay alive\n  xit('live cells with three live neighbors stay alive', () => {\n    const matrix = [\n      [0, 1, 0],\n      [1, 0, 0],\n      [1, 1, 0],\n    ]\n    const game = new GameOfLife(matrix)\n    game.tick()\n    const expected = [\n      [0, 0, 0],\n      [1, 0, 0],\n      [1, 1, 0],\n    ]\n    expect(game.state()).toEqual(expected)\n  })\n\n  // Dead cells with three live neighbors become alive\n  xit('dead cells with three live neighbors become alive', () => {\n    const matrix = [\n      [1, 1, 0],\n      [0, 0, 0],\n      [1, 0, 0],\n    ]\n    const game = new GameOfLife(matrix)\n    game.tick()\n    const expected = [\n      [0, 0, 0],\n      [1, 1, 0],\n      [0, 0, 0],\n    ]\n    expect(game.state()).toEqual(expected)\n  })\n\n  // Live cells with four or more neighbors die\n  xit('live cells with four or more neighbors die', () => {\n    const matrix = [\n      [1, 1, 1],\n      [1, 1, 1],\n      [1, 1, 1],\n    ]\n    const game = new GameOfLife(matrix)\n    game.tick()\n    const expected = [\n      [1, 0, 1],\n      [0, 0, 0],\n      [1, 0, 1],\n    ]\n    expect(game.state()).toEqual(expected)\n  })\n\n  // Bigger matrix\n  xit('bigger matrix', () => {\n    const matrix = [\n      [1, 1, 0, 1, 1, 0, 0, 0],\n      [1, 0, 1, 1, 0, 0, 0, 0],\n      [1, 1, 1, 0, 0, 1, 1, 1],\n      [0, 0, 0, 0, 0, 1, 1, 0],\n      [1, 0, 0, 0, 1, 1, 0, 0],\n      [1, 1, 0, 0, 0, 1, 1, 1],\n      [0, 0, 1, 0, 1, 0, 0, 1],\n      [1, 0, 0, 0, 0, 0, 1, 1],\n    ]\n    const game = new GameOfLife(matrix)\n    game.tick()\n    const expected = [\n      [1, 1, 0, 1, 1, 0, 0, 0],\n      [0, 0, 0, 0, 0, 1, 1, 0],\n      [1, 0, 1, 1, 1, 1, 0, 1],\n      [1, 0, 0, 0, 0, 0, 0, 1],\n      [1, 1, 0, 0, 1, 0, 0, 1],\n      [1, 1, 0, 1, 0, 0, 0, 1],\n      [1, 0, 0, 0, 0, 0, 0, 0],\n      [0, 0, 0, 0, 0, 0, 1, 1],\n    ]\n    expect(game.state()).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/game-of-life/game-of-life.ts",
    "content": "export class GameOfLife {\n  constructor(matrix: unknown) {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public tick(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public state(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/game-of-life/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/game-of-life/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-game-of-life\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/game-of-life/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/game-of-life/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/gigasecond/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to determine the date and time one gigasecond after a certain date.\n\nA gigasecond is one thousand million seconds.\nThat is a one with nine zeros after it.\n\nIf you were born on _January 24th, 2015 at 22:00 (10:00:00pm)_, then you would be a gigasecond old on _October 2nd, 2046 at 23:46:40 (11:46:40pm)_.\n"
  },
  {
    "path": "exercises/practice/gigasecond/.docs/introduction.md",
    "content": "# Introduction\n\nThe way we measure time is kind of messy.\nWe have 60 seconds in a minute, and 60 minutes in an hour.\nThis comes from ancient Babylon, where they used 60 as the basis for their number system.\nWe have 24 hours in a day, 7 days in a week, and how many days in a month?\nWell, for days in a month it depends not only on which month it is, but also on what type of calendar is used in the country you live in.\n\nWhat if, instead, we only use seconds to express time intervals?\nThen we can use metric system prefixes for writing large numbers of seconds in more easily comprehensible quantities.\n\n- A food recipe might explain that you need to let the brownies cook in the oven for two kiloseconds (that's two thousand seconds).\n- Perhaps you and your family would travel to somewhere exotic for two megaseconds (that's two million seconds).\n- And if you and your spouse were married for _a thousand million_ seconds, you would celebrate your one gigasecond anniversary.\n\n~~~~exercism/note\nIf we ever colonize Mars or some other planet, measuring time is going to get even messier.\nIf someone says \"year\" do they mean a year on Earth or a year on Mars?\n\nThe idea for this exercise came from the science fiction novel [\"A Deepness in the Sky\"][vinge-novel] by author Vernor Vinge.\nIn it the author uses the metric system as the basis for time measurements.\n\n[vinge-novel]: https://www.tor.com/2017/08/03/science-fiction-with-something-for-everyone-a-deepness-in-the-sky-by-vernor-vinge/\n~~~~\n"
  },
  {
    "path": "exercises/practice/gigasecond/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"masters3d\"\n  ],\n  \"contributors\": [\n    \"lukaszklis\",\n    \"pranasziaukas\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"gigasecond.ts\"\n    ],\n    \"test\": [\n      \"gigasecond.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given a moment, determine the moment that would be after a gigasecond has passed.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Chapter 9 in Chris Pine's online Learn to Program tutorial.\",\n  \"source_url\": \"https://pine.fm/LearnToProgram/chap_09.html\"\n}\n"
  },
  {
    "path": "exercises/practice/gigasecond/.meta/proof.ci.ts",
    "content": "const gigamilisecond = 10 ** 12\n\nexport class Gigasecond {\n  constructor(private readonly currentDate: Readonly<Date>) {}\n\n  public date(): Date {\n    return new Date(this.currentDate.valueOf() + gigamilisecond)\n  }\n}\n"
  },
  {
    "path": "exercises/practice/gigasecond/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[92fbe71c-ea52-4fac-bd77-be38023cacf7]\ndescription = \"date only specification of time\"\n\n[6d86dd16-6f7a-47be-9e58-bb9fb2ae1433]\ndescription = \"second test for date only specification of time\"\n\n[77eb8502-2bca-4d92-89d9-7b39ace28dd5]\ndescription = \"third test for date only specification of time\"\n\n[c9d89a7d-06f8-4e28-a305-64f1b2abc693]\ndescription = \"full time specified\"\n\n[09d4e30e-728a-4b52-9005-be44a58d9eba]\ndescription = \"full time with day roll-over\"\n\n[fcec307c-7529-49ab-b0fe-20309197618a]\ndescription = \"does not mutate the input\"\n"
  },
  {
    "path": "exercises/practice/gigasecond/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/gigasecond/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/gigasecond/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/gigasecond/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/gigasecond/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/gigasecond/gigasecond.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { Gigasecond } from './gigasecond.ts'\n\ndescribe('Gigasecond', () => {\n  it('date only specification of time', () => {\n    const gs = new Gigasecond(new Date(Date.parse('2011-04-25')))\n    const expectedDate = new Date(Date.parse('2043-01-01T01:46:40Z'))\n    expect(gs.date()).toEqual(expectedDate)\n  })\n\n  xit('second test for date only specification of time', () => {\n    const gs = new Gigasecond(new Date(Date.parse('1977-06-13')))\n    const expectedDate = new Date(Date.parse('2009-02-19T01:46:40Z'))\n    expect(gs.date()).toEqual(expectedDate)\n  })\n\n  xit('third test for date only specification of time', () => {\n    const gs = new Gigasecond(new Date(Date.parse('1959-07-19')))\n    const expectedDate = new Date(Date.parse('1991-03-27T01:46:40Z'))\n    expect(gs.date()).toEqual(expectedDate)\n  })\n\n  xit('full time specified', () => {\n    const gs = new Gigasecond(new Date(Date.parse('2015-01-24T22:00:00Z')))\n    const expectedDate = new Date(Date.parse('2046-10-02T23:46:40Z'))\n    expect(gs.date()).toEqual(expectedDate)\n  })\n\n  xit('full time with day roll-over', () => {\n    const gs = new Gigasecond(new Date(Date.parse('2015-01-24T23:59:59Z')))\n    const expectedDate = new Date(Date.parse('2046-10-03T01:46:39Z'))\n    expect(gs.date()).toEqual(expectedDate)\n  })\n\n  xit('does not mutate the input', () => {\n    const gs = new Gigasecond(new Date(Date.parse('2015-01-24T23:59:59Z')))\n    const expectedDate = new Date(Date.parse('2046-10-03T01:46:39Z'))\n    gs.date()\n    expect(gs.date()).toEqual(expectedDate)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/gigasecond/gigasecond.ts",
    "content": "export class Gigasecond {\n  public date(/* Parameters go here */) {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/gigasecond/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/gigasecond/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-gigasecond\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/gigasecond/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/gigasecond/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/grade-school/.docs/instructions.md",
    "content": "# Instructions\n\nGiven students' names along with the grade they are in, create a roster for the school.\n\nIn the end, you should be able to:\n\n- Add a student's name to the roster for a grade:\n  - \"Add Jim to grade 2.\"\n  - \"OK.\"\n- Get a list of all students enrolled in a grade:\n  - \"Which students are in grade 2?\"\n  - \"We've only got Jim right now.\"\n- Get a sorted list of all students in all grades.\n  Grades should be sorted as 1, 2, 3, etc., and students within a grade should be sorted alphabetically by name.\n  - \"Who is enrolled in school right now?\"\n  - \"Let me think.\n    We have Anna, Barb, and Charlie in grade 1, Alex, Peter, and Zoe in grade 2, and Jim in grade 5.\n    So the answer is: Anna, Barb, Charlie, Alex, Peter, Zoe, and Jim.\"\n\nNote that all our students only have one name (it's a small town, what do you want?), and each student cannot be added more than once to a grade or the roster.\nIf a test attempts to add the same student more than once, your implementation should indicate that this is incorrect.\n"
  },
  {
    "path": "exercises/practice/grade-school/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"masters3d\"\n  ],\n  \"contributors\": [\n    \"lukaszklis\",\n    \"pedrorolo\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"grade-school.ts\"\n    ],\n    \"test\": [\n      \"grade-school.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given students' names along with the grade that they are in, create a roster for the school.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"A pairing session with Phil Battos at gSchool\"\n}\n"
  },
  {
    "path": "exercises/practice/grade-school/.meta/proof.ci.ts",
    "content": "type Student = string\ntype Grade = number\ntype StudentRooster = Record<string, Student[]>\ntype StudentGrades = Map<Student, Grade>\nexport class GradeSchool {\n  private students: StudentGrades\n\n  constructor() {\n    this.students = new Map()\n  }\n\n  public add(student: Student, level: Grade): void {\n    this.students.set(student, level)\n  }\n\n  public grade(level: Grade): Student[] {\n    return Array.from(this.students.entries())\n      .filter(([, studentGrade]) => studentGrade === level)\n      .map(([student]) => student)\n      .sort()\n  }\n\n  public roster(): StudentRooster {\n    const result: StudentRooster = {}\n\n    Array.from(this.students.entries()).forEach(([, studentGrade]) => {\n      if (!result[studentGrade]) {\n        result[studentGrade] = this.grade(studentGrade)\n      }\n    })\n\n    return result\n  }\n}\n"
  },
  {
    "path": "exercises/practice/grade-school/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[6d0a30e4-1b4e-472e-8e20-c41702125667]\ndescription = \"Adding a student adds them to the sorted roster\"\n\n[233be705-dd58-4968-889d-fb3c7954c9cc]\ndescription = \"Adding more student adds them to the sorted roster\"\n\n[75a51579-d1d7-407c-a2f8-2166e984e8ab]\ndescription = \"Adding students to different grades adds them to the same sorted roster\"\n\n[a3f0fb58-f240-4723-8ddc-e644666b85cc]\ndescription = \"Roster returns an empty list if there are no students enrolled\"\n\n[180a8ff9-5b94-43fc-9db1-d46b4a8c93b6]\ndescription = \"Student names with grades are displayed in the same sorted roster\"\n\n[1bfbcef1-e4a3-49e8-8d22-f6f9f386187e]\ndescription = \"Grade returns the students in that grade in alphabetical order\"\n\n[5e67aa3c-a3c6-4407-a183-d8fe59cd1630]\ndescription = \"Grade returns an empty list if there are no students in that grade\"\n"
  },
  {
    "path": "exercises/practice/grade-school/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/grade-school/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/grade-school/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/grade-school/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/grade-school/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/grade-school/grade-school.test.ts",
    "content": "import { beforeEach, describe, it, expect, xit } from '@jest/globals'\nimport { GradeSchool } from './grade-school.ts'\n\ndescribe('School', () => {\n  let school: GradeSchool\n\n  beforeEach(() => {\n    school = new GradeSchool()\n  })\n\n  it('a new school has an empty roster', () => {\n    expect(school.roster()).toEqual({})\n  })\n\n  xit('adding a student adds them to the roster for the given grade', () => {\n    school.add('Aimee', 2)\n\n    const expectedDb = { 2: ['Aimee'] }\n    expect(school.roster()).toEqual(expectedDb)\n  })\n\n  xit('adding more students to the same grade adds them to the roster', () => {\n    school.add('Blair', 2)\n    school.add('James', 2)\n    school.add('Paul', 2)\n\n    const expectedDb = { 2: ['Blair', 'James', 'Paul'] }\n    expect(school.roster()).toEqual(expectedDb)\n  })\n\n  xit('adding students to different grades adds them to the roster', () => {\n    school.add('Chelsea', 3)\n    school.add('Logan', 7)\n\n    const expectedDb = { 3: ['Chelsea'], 7: ['Logan'] }\n    expect(school.roster()).toEqual(expectedDb)\n  })\n\n  xit('grade returns the students in that grade in alphabetical order', () => {\n    school.add('Franklin', 5)\n    school.add('Bradley', 5)\n    school.add('Jeff', 1)\n\n    const expectedStudents = ['Bradley', 'Franklin']\n    expect(school.grade(5)).toEqual(expectedStudents)\n  })\n\n  xit('grade returns an empty array if there are no students in that grade', () => {\n    expect(school.grade(1)).toEqual([])\n  })\n\n  xit('the students names in each grade in the roster are sorted', () => {\n    school.add('Jennifer', 4)\n    school.add('Kareem', 6)\n    school.add('Christopher', 4)\n    school.add('Kyle', 3)\n\n    const expectedSortedStudents = {\n      3: ['Kyle'],\n      4: ['Christopher', 'Jennifer'],\n      6: ['Kareem'],\n    }\n    expect(school.roster()).toEqual(expectedSortedStudents)\n  })\n\n  xit('roster cannot be modified outside of module', () => {\n    school.add('Aimee', 2)\n    const roster = school.roster()\n    try {\n      roster[2].push('Oops.')\n    } catch {\n      /* empty */\n    }\n    const expectedDb = { 2: ['Aimee'] }\n    expect(school.roster()).toEqual(expectedDb)\n  })\n\n  xit('roster cannot be modified outside of module using grade()', () => {\n    school.add('Aimee', 2)\n    try {\n      school.grade(2).push('Oops.')\n    } catch {\n      /* empty */\n    }\n    const expectedDb = { 2: ['Aimee'] }\n    expect(school.roster()).toEqual(expectedDb)\n  })\n\n  xit(\"a student can't be in two different grades\", () => {\n    school.add('Aimee', 2)\n    school.add('Aimee', 1)\n\n    expect(school.grade(2)).toEqual([])\n  })\n})\n"
  },
  {
    "path": "exercises/practice/grade-school/grade-school.ts",
    "content": "export class GradeSchool {\n  roster() {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  add() {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  grade() {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/grade-school/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/grade-school/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-grade-school\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/grade-school/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/grade-school/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/grains/.docs/instructions.md",
    "content": "# Instructions\n\nCalculate the number of grains of wheat on a chessboard.\n\nA chessboard has 64 squares.\nSquare 1 has one grain, square 2 has two grains, square 3 has four grains, and so on, doubling each time.\n\nWrite code that calculates:\n\n- the number of grains on a given square\n- the total number of grains on the chessboard\n"
  },
  {
    "path": "exercises/practice/grains/.docs/introduction.md",
    "content": "# Introduction\n\nThere once was a wise servant who saved the life of a prince.\nThe king promised to pay whatever the servant could dream up.\nKnowing that the king loved chess, the servant told the king he would like to have grains of wheat.\nOne grain on the first square of a chessboard, with the number of grains doubling on each successive square.\n"
  },
  {
    "path": "exercises/practice/grains/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"G-Rath\",\n    \"masters3d\",\n    \"SleeplessByte\",\n    \"JoshiRaez\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"grains.ts\"\n    ],\n    \"test\": [\n      \"grains.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Calculate the number of grains of wheat on a chessboard given that the number on each square doubles.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"The CodeRanch Cattle Drive, Assignment 6\",\n  \"source_url\": \"https://web.archive.org/web/20240908084142/https://coderanch.com/wiki/718824/Grains\"\n}\n"
  },
  {
    "path": "exercises/practice/grains/.meta/proof.ci.ts",
    "content": "export function square(n: number): bigint {\n  if (n <= 0 || n >= 65) {\n    throw new Error()\n  }\n\n  return 2n ** BigInt(n - 1)\n}\n\nexport function total(): bigint {\n  let result = 0n\n\n  for (let i = 1; i <= 64; i++) {\n    result += square(i)\n  }\n\n  return result\n}\n"
  },
  {
    "path": "exercises/practice/grains/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[9fbde8de-36b2-49de-baf2-cd42d6f28405]\ndescription = \"1\"\n\n[ee1f30c2-01d8-4298-b25d-c677331b5e6d]\ndescription = \"2\"\n\n[10f45584-2fc3-4875-8ec6-666065d1163b]\ndescription = \"3\"\n\n[a7cbe01b-36f4-4601-b053-c5f6ae055170]\ndescription = \"4\"\n\n[c50acc89-8535-44e4-918f-b848ad2817d4]\ndescription = \"16\"\n\n[acd81b46-c2ad-4951-b848-80d15ed5a04f]\ndescription = \"32\"\n\n[c73b470a-5efb-4d53-9ac6-c5f6487f227b]\ndescription = \"64\"\n\n[1d47d832-3e85-4974-9466-5bd35af484e3]\ndescription = \"square 0 raises an exception\"\n\n[61974483-eeb2-465e-be54-ca5dde366453]\ndescription = \"negative square raises an exception\"\n\n[a95e4374-f32c-45a7-a10d-ffec475c012f]\ndescription = \"square greater than 64 raises an exception\"\n\n[6eb07385-3659-4b45-a6be-9dc474222750]\ndescription = \"returns the total number of grains on the board\"\n"
  },
  {
    "path": "exercises/practice/grains/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/grains/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/grains/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/grains/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/grains/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/grains/grains.test.ts",
    "content": "import { describe, xdescribe, it, expect, xit } from '@jest/globals'\nimport { square, total } from './grains.ts'\n\ndescribe('returns the number of grains on the square', () => {\n  it('1', () => {\n    const expected = 1n\n    expect(square(1)).toEqual(expected)\n  })\n\n  xit('2', () => {\n    const expected = 2n\n    expect(square(2)).toEqual(expected)\n  })\n\n  xit('3', () => {\n    const expected = 4n\n    expect(square(3)).toEqual(expected)\n  })\n\n  xit('4', () => {\n    const expected = 8n\n    expect(square(4)).toEqual(expected)\n  })\n\n  xit('16', () => {\n    const expected = 32768n\n    expect(square(16)).toEqual(expected)\n  })\n\n  xit('32', () => {\n    const expected = 2147483648n\n    expect(square(32)).toEqual(expected)\n  })\n\n  xit('64', () => {\n    const expected = 9223372036854775808n\n    expect(square(64)).toEqual(expected)\n  })\n\n  xit('square 0 raises an exception', () => {\n    expect(() => square(0)).toThrow()\n  })\n\n  xit('negative square raises an exception', () => {\n    expect(() => square(-1)).toThrow()\n  })\n\n  xit('square greater than 64 raises an exception', () => {\n    expect(() => square(65)).toThrow()\n  })\n})\n\nxdescribe('returns the total number of grains on the board', () => {\n  xit('total', () => {\n    const expected = 18446744073709551615n\n    expect(total()).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/grains/grains.ts",
    "content": "export const square = () => {\n  throw new Error('Remove this line and implement the function')\n}\n\nexport const total = () => {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/grains/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/grains/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-grains\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/grains/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/grains/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/hamming/.docs/instructions.md",
    "content": "# Instructions\n\nCalculate the Hamming distance between two DNA strands.\n\nWe read DNA using the letters C, A, G and T.\nTwo strands might look like this:\n\n    GAGCCTACTAACGGGAT\n    CATCGTAATGACGGCCT\n    ^ ^ ^  ^ ^    ^^\n\nThey have 7 differences, and therefore the Hamming distance is 7.\n\n## Implementation notes\n\nThe Hamming distance is only defined for sequences of equal length, so an attempt to calculate it between sequences of different lengths should not work.\n"
  },
  {
    "path": "exercises/practice/hamming/.docs/introduction.md",
    "content": "# Introduction\n\nYour body is made up of cells that contain DNA.\nThose cells regularly wear out and need replacing, which they achieve by dividing into daughter cells.\nIn fact, the average human body experiences about 10 quadrillion cell divisions in a lifetime!\n\nWhen cells divide, their DNA replicates too.\nSometimes during this process mistakes happen and single pieces of DNA get encoded with the incorrect information.\nIf we compare two strands of DNA and count the differences between them, we can see how many mistakes occurred.\nThis is known as the \"Hamming distance\".\n\nThe Hamming distance is useful in many areas of science, not just biology, so it's a nice phrase to be familiar with :)\n"
  },
  {
    "path": "exercises/practice/hamming/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"masters3d\"\n  ],\n  \"contributors\": [\n    \"lukaszklis\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"hamming.ts\"\n    ],\n    \"test\": [\n      \"hamming.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Calculate the Hamming distance between two DNA strands.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"The Calculating Point Mutations problem at Rosalind\",\n  \"source_url\": \"https://rosalind.info/problems/hamm/\"\n}\n"
  },
  {
    "path": "exercises/practice/hamming/.meta/proof.ci.ts",
    "content": "export function compute(left: string, right: string): number {\n  if (left.length !== right.length) {\n    throw new Error('DNA strands must be of equal length.')\n  }\n  const size = left.length\n  const leftArray = left.split('')\n  const rightArray = right.split('')\n  let count = 0\n  for (let i = 0; i < size; i += 1) {\n    if (leftArray[i] !== rightArray[i]) {\n      count += 1\n    }\n  }\n  return count\n}\n"
  },
  {
    "path": "exercises/practice/hamming/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[f6dcb64f-03b0-4b60-81b1-3c9dbf47e887]\ndescription = \"empty strands\"\n\n[54681314-eee2-439a-9db0-b0636c656156]\ndescription = \"single letter identical strands\"\n\n[294479a3-a4c8-478f-8d63-6209815a827b]\ndescription = \"single letter different strands\"\n\n[9aed5f34-5693-4344-9b31-40c692fb5592]\ndescription = \"long identical strands\"\n\n[cd2273a5-c576-46c8-a52b-dee251c3e6e5]\ndescription = \"long different strands\"\n\n[919f8ef0-b767-4d1b-8516-6379d07fcb28]\ndescription = \"disallow first strand longer\"\ninclude = false\n\n[b9228bb1-465f-4141-b40f-1f99812de5a8]\ndescription = \"disallow first strand longer\"\nreimplements = \"919f8ef0-b767-4d1b-8516-6379d07fcb28\"\n\n[8a2d4ed0-ead5-4fdd-924d-27c4cf56e60e]\ndescription = \"disallow second strand longer\"\ninclude = false\n\n[dab38838-26bb-4fff-acbe-3b0a9bfeba2d]\ndescription = \"disallow second strand longer\"\nreimplements = \"8a2d4ed0-ead5-4fdd-924d-27c4cf56e60e\"\n\n[5dce058b-28d4-4ca7-aa64-adfe4e17784c]\ndescription = \"disallow left empty strand\"\ninclude = false\n\n[db92e77e-7c72-499d-8fe6-9354d2bfd504]\ndescription = \"disallow left empty strand\"\ninclude = false\nreimplements = \"5dce058b-28d4-4ca7-aa64-adfe4e17784c\"\n\n[b764d47c-83ff-4de2-ab10-6cfe4b15c0f3]\ndescription = \"disallow empty first strand\"\nreimplements = \"db92e77e-7c72-499d-8fe6-9354d2bfd504\"\n\n[38826d4b-16fb-4639-ac3e-ba027dec8b5f]\ndescription = \"disallow right empty strand\"\ninclude = false\n\n[920cd6e3-18f4-4143-b6b8-74270bb8f8a3]\ndescription = \"disallow right empty strand\"\ninclude = false\nreimplements = \"38826d4b-16fb-4639-ac3e-ba027dec8b5f\"\n\n[9ab9262f-3521-4191-81f5-0ed184a5aa89]\ndescription = \"disallow empty second strand\"\nreimplements = \"920cd6e3-18f4-4143-b6b8-74270bb8f8a3\"\n"
  },
  {
    "path": "exercises/practice/hamming/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/hamming/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/hamming/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/hamming/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/hamming/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/hamming/hamming.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { compute } from './hamming.ts'\n\ndescribe('Hamming', () => {\n  it('empty strands', () => {\n    expect(compute('', '')).toEqual(0)\n  })\n\n  xit('single letter identical strands', () => {\n    expect(compute('A', 'A')).toEqual(0)\n  })\n\n  xit('single letter different strands', () => {\n    expect(compute('G', 'T')).toEqual(1)\n  })\n\n  xit('long identical strands', () => {\n    expect(compute('GGACTGAAATCTG', 'GGACTGAAATCTG')).toEqual(0)\n  })\n\n  xit('long different strands', () => {\n    expect(compute('GGACGGATTCTG', 'AGGACGGATTCT')).toEqual(9)\n  })\n\n  xit('disallow first strand longer', () => {\n    expect(() => {\n      compute('AATG', 'AAA')\n    }).toThrow('DNA strands must be of equal length.')\n  })\n\n  xit('disallow second strand longer', () => {\n    expect(() => {\n      compute('ATA', 'AGTG')\n    }).toThrow('DNA strands must be of equal length.')\n  })\n\n  xit('disallow empty first strand', () => {\n    expect(() => {\n      compute('', 'G')\n    }).toThrow('DNA strands must be of equal length.')\n  })\n\n  xit('disallow empty second strand', () => {\n    expect(() => {\n      compute('G', '')\n    }).toThrow('DNA strands must be of equal length.')\n  })\n})\n"
  },
  {
    "path": "exercises/practice/hamming/hamming.ts",
    "content": "export function compute(left: unknown, right: unknown): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/hamming/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/hamming/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-hamming\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/hamming/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/hamming/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/hello-world/.docs/instructions.append.md",
    "content": "# Instructions append\n\n## Setup\n\nGo through the setup instructions for TypeScript to\ninstall the necessary dependencies:\n\n[https://exercism.org/docs/tracks/typescript/installation](https://exercism.org/docs/tracks/typescript/installation)\n\n## Requirements\n\nInstall assignment dependencies:\n\n```bash\n$ yarn install\n```\n\n## Making the test suite pass\n\nExecute the tests with:\n\n```bash\n$ yarn test\n```\n\nIn many test suites all but the first test have been skipped.\n\nOnce you get a test passing, you can unskip the next one by\nchanging `xit` to `it`.\n\n## Tutorial\n\nThis section is a step-by-step guide to solving this exercise.\n\nThis exercise has two files:\n\n- hello-world.ts\n- hello-world.test.ts\n\nThe first file is where you will write your code.\nThe second is where the tests are defined.\n\nThe tests will check whether your code is doing the right thing.\nYou don't need to be able to write a test suite from scratch,\nbut it helps to understand what a test looks like, and what\nit is doing.\n\nOpen up the test file, hello-world.test.ts.\nThere is a single test inside:\n\n```typescript\nit('says hello world', () => {\n  expect(hello()).toEqual('Hello, World!')\n})\n```\n\nRun the test now, with the following command on the command-line:\n\n```bash\n$ yarn test\n```\n\nThe test fails, which makes sense since you've not written any code yet.\n\nThe failure looks like this:\n\n```\n    × says hello world (5ms)\n\n  ● Hello World › says hello world\n\n    expect(received).toEqual(expected) // deep equality\n\n    Expected: \"Hello, World!\"\n    Received: \"Goodbye, Mars!\"\n\n      4 |\n      5 |   it('says hello world', () => {\n    > 6 |     expect(hello()).toEqual('Hello, World!')\n        |                     ^\n      7 |   })\n      8 |\n      9 | })\n\n      at Object.it (hello-world.test.ts:6:32)\n```\n\nAnd these are those code lines with probable defects in the `hello-world.test.ts` file:\n\nthe 6th line:\n\n```typescript\n    expect(hello()).toEqual('Hello, World!')\n                    ^\n```\n\nHence the problem is with the `hello()` function call.\nWe can see that the test is expecting `'Hello, World!'` as output, but instead is getting `\"Goodbye, Mars!\"`.\n\nSo let's check now this function in the `hello-worlds.ts` file:\n\n```typescript\nexport function hello(): string {\n  return 'Goodbye, Mars!'\n}\n```\n\nNow we see that the function returns the incorrect string, which is the reason for our failure. Let's fix this by changing the returned value:\n\n```typescript\nexport function hello(): string {\n  return 'Hello, World!'\n}\n```\n\nRun the test again:\n\n```bash\n PASS  ./hello-world.test.ts\n  Hello World\n    √ says hello world (4ms)\n```\n\nAnd it passes!\n"
  },
  {
    "path": "exercises/practice/hello-world/.docs/instructions.md",
    "content": "# Instructions\n\nThe classical introductory exercise.\nJust say \"Hello, World!\".\n\n[\"Hello, World!\"][hello-world] is the traditional first program for beginning programming in a new language or environment.\n\nThe objectives are simple:\n\n- Modify the provided code so that it produces the string \"Hello, World!\".\n- Run the test suite and make sure that it succeeds.\n- Submit your solution and check it at the website.\n\nIf everything goes well, you will be ready to fetch your first real exercise.\n\n[hello-world]: https://en.wikipedia.org/wiki/%22Hello,_world!%22_program\n"
  },
  {
    "path": "exercises/practice/hello-world/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"masters3d\"\n  ],\n  \"contributors\": [\n    \"DFXLuna\",\n    \"iHiD\",\n    \"kytrinyx\",\n    \"lukaszklis\",\n    \"porkostomus\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"hello-world.ts\"\n    ],\n    \"test\": [\n      \"hello-world.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Exercism's classic introductory exercise. Just say \\\"Hello, World!\\\".\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"This is an exercise to introduce users to using Exercism\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/%22Hello,_world!%22_program\"\n}\n"
  },
  {
    "path": "exercises/practice/hello-world/.meta/proof.ci.ts",
    "content": "export function hello(): string {\n  return 'Hello, World!'\n}\n"
  },
  {
    "path": "exercises/practice/hello-world/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[af9ffe10-dc13-42d8-a742-e7bdafac449d]\ndescription = \"Say Hi!\"\n"
  },
  {
    "path": "exercises/practice/hello-world/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/hello-world/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/hello-world/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/hello-world/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/hello-world/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/hello-world/hello-world.test.ts",
    "content": "import { describe, it, expect } from '@jest/globals'\nimport { hello } from './hello-world.ts'\n\ndescribe('Hello World', () => {\n  it('says hello world', () => {\n    expect(hello()).toEqual('Hello, World!')\n  })\n})\n"
  },
  {
    "path": "exercises/practice/hello-world/hello-world.ts",
    "content": "export function hello(): string {\n  return 'Goodbye, Mars!'\n}\n"
  },
  {
    "path": "exercises/practice/hello-world/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/hello-world/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-hello-world\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/hello-world/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/hello-world/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/house/.docs/instructions.md",
    "content": "# Instructions\n\nRecite the nursery rhyme 'This is the House that Jack Built'.\n\n> [The] process of placing a phrase of clause within another phrase of clause is called embedding.\n> It is through the processes of recursion and embedding that we are able to take a finite number of forms (words and phrases) and construct an infinite number of expressions.\n> Furthermore, embedding also allows us to construct an infinitely long structure, in theory anyway.\n\n- [papyr.com][papyr]\n\nThe nursery rhyme reads as follows:\n\n```text\nThis is the house that Jack built.\n\nThis is the malt\nthat lay in the house that Jack built.\n\nThis is the rat\nthat ate the malt\nthat lay in the house that Jack built.\n\nThis is the cat\nthat killed the rat\nthat ate the malt\nthat lay in the house that Jack built.\n\nThis is the dog\nthat worried the cat\nthat killed the rat\nthat ate the malt\nthat lay in the house that Jack built.\n\nThis is the cow with the crumpled horn\nthat tossed the dog\nthat worried the cat\nthat killed the rat\nthat ate the malt\nthat lay in the house that Jack built.\n\nThis is the maiden all forlorn\nthat milked the cow with the crumpled horn\nthat tossed the dog\nthat worried the cat\nthat killed the rat\nthat ate the malt\nthat lay in the house that Jack built.\n\nThis is the man all tattered and torn\nthat kissed the maiden all forlorn\nthat milked the cow with the crumpled horn\nthat tossed the dog\nthat worried the cat\nthat killed the rat\nthat ate the malt\nthat lay in the house that Jack built.\n\nThis is the priest all shaven and shorn\nthat married the man all tattered and torn\nthat kissed the maiden all forlorn\nthat milked the cow with the crumpled horn\nthat tossed the dog\nthat worried the cat\nthat killed the rat\nthat ate the malt\nthat lay in the house that Jack built.\n\nThis is the rooster that crowed in the morn\nthat woke the priest all shaven and shorn\nthat married the man all tattered and torn\nthat kissed the maiden all forlorn\nthat milked the cow with the crumpled horn\nthat tossed the dog\nthat worried the cat\nthat killed the rat\nthat ate the malt\nthat lay in the house that Jack built.\n\nThis is the farmer sowing his corn\nthat kept the rooster that crowed in the morn\nthat woke the priest all shaven and shorn\nthat married the man all tattered and torn\nthat kissed the maiden all forlorn\nthat milked the cow with the crumpled horn\nthat tossed the dog\nthat worried the cat\nthat killed the rat\nthat ate the malt\nthat lay in the house that Jack built.\n\nThis is the horse and the hound and the horn\nthat belonged to the farmer sowing his corn\nthat kept the rooster that crowed in the morn\nthat woke the priest all shaven and shorn\nthat married the man all tattered and torn\nthat kissed the maiden all forlorn\nthat milked the cow with the crumpled horn\nthat tossed the dog\nthat worried the cat\nthat killed the rat\nthat ate the malt\nthat lay in the house that Jack built.\n```\n\n[papyr]: https://papyr.com/hypertextbooks/grammar/ph_noun.htm\n"
  },
  {
    "path": "exercises/practice/house/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"house.ts\"\n    ],\n    \"test\": [\n      \"house.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Output the nursery rhyme 'This is the House that Jack Built'.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"British nursery rhyme\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/This_Is_The_House_That_Jack_Built\"\n}\n"
  },
  {
    "path": "exercises/practice/house/.meta/proof.ci.ts",
    "content": "const OBJECTS = [\n  'house',\n  'malt',\n  'rat',\n  'cat',\n  'dog',\n  'cow with the crumpled horn',\n  'maiden all forlorn',\n  'man all tattered and torn',\n  'priest all shaven and shorn',\n  'rooster that crowed in the morn',\n  'farmer sowing his corn',\n  'horse and the hound and the horn',\n] as const\n\nconst ACTIONS = [\n  'Jack built',\n  'lay in',\n  'ate',\n  'killed',\n  'worried',\n  'tossed',\n  'milked',\n  'kissed',\n  'married',\n  'woke',\n  'kept',\n  'belonged to',\n] as const\n\nexport function verse(verseNumber: number): string[] {\n  const lines = []\n  const totalLines = verseNumber\n  let itemIndex = verseNumber - 1\n  for (let lineNumber = 1; lineNumber <= totalLines; lineNumber += 1) {\n    let lineText = ''\n    if (lineNumber === 1) {\n      lineText += 'This is'\n    } else {\n      lineText += `that ${ACTIONS[itemIndex]}`\n      itemIndex -= 1\n    }\n\n    lineText += ` the ${OBJECTS[itemIndex]}`\n    if (lineNumber === totalLines) {\n      lineText += ` that ${ACTIONS[itemIndex]}.`\n    }\n    lines.push(lineText)\n  }\n\n  return lines\n}\n\nexport function verses(start: number, end: number): string[] {\n  let lines: string[] = []\n  for (let i = start; i <= end; i += 1) {\n    const verseLines = verse(i)\n    lines = lines.concat(verseLines)\n    if (i < end) {\n      lines.push('')\n    }\n  }\n  return lines\n}\n"
  },
  {
    "path": "exercises/practice/house/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[28a540ff-f765-4348-9d57-ae33f25f41f2]\ndescription = \"verse one - the house that jack built\"\n\n[ebc825ac-6e2b-4a5e-9afd-95732191c8da]\ndescription = \"verse two - the malt that lay\"\n\n[1ed8bb0f-edb8-4bd1-b6d4-b64754fe4a60]\ndescription = \"verse three - the rat that ate\"\n\n[64b0954e-8b7d-4d14-aad0-d3f6ce297a30]\ndescription = \"verse four - the cat that killed\"\n\n[1e8d56bc-fe31-424d-9084-61e6111d2c82]\ndescription = \"verse five - the dog that worried\"\n\n[6312dc6f-ab0a-40c9-8a55-8d4e582beac4]\ndescription = \"verse six - the cow with the crumpled horn\"\n\n[68f76d18-6e19-4692-819c-5ff6a7f92feb]\ndescription = \"verse seven - the maiden all forlorn\"\n\n[73872564-2004-4071-b51d-2e4326096747]\ndescription = \"verse eight - the man all tattered and torn\"\n\n[0d53d743-66cb-4351-a173-82702f3338c9]\ndescription = \"verse nine - the priest all shaven and shorn\"\n\n[452f24dc-8fd7-4a82-be1a-3b4839cfeb41]\ndescription = \"verse 10 - the rooster that crowed in the morn\"\n\n[97176f20-2dd3-4646-ac72-cffced91ea26]\ndescription = \"verse 11 - the farmer sowing his corn\"\n\n[09824c29-6aad-4dcd-ac98-f61374a6a8b7]\ndescription = \"verse 12 - the horse and the hound and the horn\"\n\n[d2b980d3-7851-49e1-97ab-1524515ec200]\ndescription = \"multiple verses\"\n\n[0311d1d0-e085-4f23-8ae7-92406fb3e803]\ndescription = \"full rhyme\"\n"
  },
  {
    "path": "exercises/practice/house/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/house/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/house/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/house/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/house/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/house/house.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { verse, verses } from './house.ts'\n\ndescribe('House', () => {\n  it('verse one - the house that jack built', () => {\n    const lyrics = ['This is the house that Jack built.']\n    expect(verse(1)).toEqual(lyrics)\n  })\n\n  xit('verse two - the malt that lay', () => {\n    const lyrics = [\n      'This is the malt',\n      'that lay in the house that Jack built.',\n    ]\n    expect(verse(2)).toEqual(lyrics)\n  })\n\n  xit('verse three - the rat that ate', () => {\n    const lyrics = [\n      'This is the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n    ]\n    expect(verse(3)).toEqual(lyrics)\n  })\n\n  xit('verse four - the cat that killed', () => {\n    const lyrics = [\n      'This is the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n    ]\n    expect(verse(4)).toEqual(lyrics)\n  })\n\n  xit('verse five - the dog that worried', () => {\n    const lyrics = [\n      'This is the dog',\n      'that worried the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n    ]\n    expect(verse(5)).toEqual(lyrics)\n  })\n\n  xit('verse six - the cow with the crumpled horn', () => {\n    const lyrics = [\n      'This is the cow with the crumpled horn',\n      'that tossed the dog',\n      'that worried the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n    ]\n    expect(verse(6)).toEqual(lyrics)\n  })\n\n  xit('verse seven - the maiden all forlorn', () => {\n    const lyrics = [\n      'This is the maiden all forlorn',\n      'that milked the cow with the crumpled horn',\n      'that tossed the dog',\n      'that worried the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n    ]\n    expect(verse(7)).toEqual(lyrics)\n  })\n\n  xit('verse eight - the man all tattered and torn', () => {\n    const lyrics = [\n      'This is the man all tattered and torn',\n      'that kissed the maiden all forlorn',\n      'that milked the cow with the crumpled horn',\n      'that tossed the dog',\n      'that worried the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n    ]\n    expect(verse(8)).toEqual(lyrics)\n  })\n\n  xit('verse nine - the priest all shaven and shorn', () => {\n    const lyrics = [\n      'This is the priest all shaven and shorn',\n      'that married the man all tattered and torn',\n      'that kissed the maiden all forlorn',\n      'that milked the cow with the crumpled horn',\n      'that tossed the dog',\n      'that worried the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n    ]\n    expect(verse(9)).toEqual(lyrics)\n  })\n\n  xit('verse ten - the rooster that crowed in the morn', () => {\n    const lyrics = [\n      'This is the rooster that crowed in the morn',\n      'that woke the priest all shaven and shorn',\n      'that married the man all tattered and torn',\n      'that kissed the maiden all forlorn',\n      'that milked the cow with the crumpled horn',\n      'that tossed the dog',\n      'that worried the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n    ]\n    expect(verse(10)).toEqual(lyrics)\n  })\n\n  xit('verse eleven - the farmer sowing his corn', () => {\n    const lyrics = [\n      'This is the farmer sowing his corn',\n      'that kept the rooster that crowed in the morn',\n      'that woke the priest all shaven and shorn',\n      'that married the man all tattered and torn',\n      'that kissed the maiden all forlorn',\n      'that milked the cow with the crumpled horn',\n      'that tossed the dog',\n      'that worried the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n    ]\n    expect(verse(11)).toEqual(lyrics)\n  })\n\n  xit('verse twelve - the horse and the hound and the horn', () => {\n    const lyrics = [\n      'This is the horse and the hound and the horn',\n      'that belonged to the farmer sowing his corn',\n      'that kept the rooster that crowed in the morn',\n      'that woke the priest all shaven and shorn',\n      'that married the man all tattered and torn',\n      'that kissed the maiden all forlorn',\n      'that milked the cow with the crumpled horn',\n      'that tossed the dog',\n      'that worried the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n    ]\n    expect(verse(12)).toEqual(lyrics)\n  })\n\n  xit('multiple verses', () => {\n    const startVerse = 4\n    const endVerse = 8\n    const lyrics = [\n      'This is the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n      '',\n      'This is the dog',\n      'that worried the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n      '',\n      'This is the cow with the crumpled horn',\n      'that tossed the dog',\n      'that worried the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n      '',\n      'This is the maiden all forlorn',\n      'that milked the cow with the crumpled horn',\n      'that tossed the dog',\n      'that worried the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n      '',\n      'This is the man all tattered and torn',\n      'that kissed the maiden all forlorn',\n      'that milked the cow with the crumpled horn',\n      'that tossed the dog',\n      'that worried the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n    ]\n    expect(verses(startVerse, endVerse)).toEqual(lyrics)\n  })\n\n  xit('full rhyme', () => {\n    const startVerse = 1\n    const endVerse = 12\n    const lyrics = [\n      'This is the house that Jack built.',\n      '',\n      'This is the malt',\n      'that lay in the house that Jack built.',\n      '',\n      'This is the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n      '',\n      'This is the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n      '',\n      'This is the dog',\n      'that worried the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n      '',\n      'This is the cow with the crumpled horn',\n      'that tossed the dog',\n      'that worried the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n      '',\n      'This is the maiden all forlorn',\n      'that milked the cow with the crumpled horn',\n      'that tossed the dog',\n      'that worried the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n      '',\n      'This is the man all tattered and torn',\n      'that kissed the maiden all forlorn',\n      'that milked the cow with the crumpled horn',\n      'that tossed the dog',\n      'that worried the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n      '',\n      'This is the priest all shaven and shorn',\n      'that married the man all tattered and torn',\n      'that kissed the maiden all forlorn',\n      'that milked the cow with the crumpled horn',\n      'that tossed the dog',\n      'that worried the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n      '',\n      'This is the rooster that crowed in the morn',\n      'that woke the priest all shaven and shorn',\n      'that married the man all tattered and torn',\n      'that kissed the maiden all forlorn',\n      'that milked the cow with the crumpled horn',\n      'that tossed the dog',\n      'that worried the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n      '',\n      'This is the farmer sowing his corn',\n      'that kept the rooster that crowed in the morn',\n      'that woke the priest all shaven and shorn',\n      'that married the man all tattered and torn',\n      'that kissed the maiden all forlorn',\n      'that milked the cow with the crumpled horn',\n      'that tossed the dog',\n      'that worried the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n      '',\n      'This is the horse and the hound and the horn',\n      'that belonged to the farmer sowing his corn',\n      'that kept the rooster that crowed in the morn',\n      'that woke the priest all shaven and shorn',\n      'that married the man all tattered and torn',\n      'that kissed the maiden all forlorn',\n      'that milked the cow with the crumpled horn',\n      'that tossed the dog',\n      'that worried the cat',\n      'that killed the rat',\n      'that ate the malt',\n      'that lay in the house that Jack built.',\n    ]\n    expect(verses(startVerse, endVerse)).toEqual(lyrics)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/house/house.ts",
    "content": "export function verse(/* parameters go here */): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n\nexport function verses(/* parameters go here */): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/house/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/house/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-house\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/house/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/house/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/isbn-verifier/.docs/instructions.md",
    "content": "# Instructions\n\nThe [ISBN-10 verification process][isbn-verification] is used to validate book identification numbers.\nThese normally contain dashes and look like: `3-598-21508-8`\n\n## ISBN\n\nThe ISBN-10 format is 9 digits (0 to 9) plus one check character (either a digit or an X only).\nIn the case the check character is an X, this represents the value '10'.\nThese may be communicated with or without hyphens, and can be checked for their validity by the following formula:\n\n```text\n(d₁ * 10 + d₂ * 9 + d₃ * 8 + d₄ * 7 + d₅ * 6 + d₆ * 5 + d₇ * 4 + d₈ * 3 + d₉ * 2 + d₁₀ * 1) mod 11 == 0\n```\n\nIf the result is 0, then it is a valid ISBN-10, otherwise it is invalid.\n\n## Example\n\nLet's take the ISBN-10 `3-598-21508-8`.\nWe plug it in to the formula, and get:\n\n```text\n(3 * 10 + 5 * 9 + 9 * 8 + 8 * 7 + 2 * 6 + 1 * 5 + 5 * 4 + 0 * 3 + 8 * 2 + 8 * 1) mod 11 == 0\n```\n\nSince the result is 0, this proves that our ISBN is valid.\n\n## Task\n\nGiven a string the program should check if the provided string is a valid ISBN-10.\nPutting this into place requires some thinking about preprocessing/parsing of the string prior to calculating the check digit for the ISBN.\n\nThe program should be able to verify ISBN-10 both with and without separating dashes.\n\n## Caveats\n\nConverting from strings to numbers can be tricky in certain languages.\nNow, it's even trickier since the check digit of an ISBN-10 may be 'X' (representing '10').\nFor instance `3-598-21507-X` is a valid ISBN-10.\n\n[isbn-verification]: https://en.wikipedia.org/wiki/International_Standard_Book_Number\n"
  },
  {
    "path": "exercises/practice/isbn-verifier/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"isbn-verifier.ts\"\n    ],\n    \"test\": [\n      \"isbn-verifier.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Check if a given string is a valid ISBN-10 number.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Converting a string into a number and some basic processing utilizing a relatable real world example.\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/International_Standard_Book_Number#ISBN-10_check_digit_calculation\"\n}\n"
  },
  {
    "path": "exercises/practice/isbn-verifier/.meta/proof.ci.ts",
    "content": "export function isValid(input: string): boolean {\n  const isbn = input.replace(/-/g, '')\n  if (!isbn.match(/^(\\d{9}[\\dxX])$/)) {\n    return false\n  }\n\n  const digits = [...isbn]\n  if (digits[9].match(/[xX]/)) {\n    digits[9] = '10'\n  }\n\n  const sum = digits.reduce(\n    (acc, value, index) => acc + (10 - index) * parseInt(value, 10),\n    0\n  )\n\n  return sum % 11 === 0\n}\n"
  },
  {
    "path": "exercises/practice/isbn-verifier/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[0caa3eac-d2e3-4c29-8df8-b188bc8c9292]\ndescription = \"valid isbn\"\n\n[19f76b53-7c24-45f8-87b8-4604d0ccd248]\ndescription = \"invalid isbn check digit\"\n\n[4164bfee-fb0a-4a1c-9f70-64c6a1903dcd]\ndescription = \"valid isbn with a check digit of 10\"\n\n[3ed50db1-8982-4423-a993-93174a20825c]\ndescription = \"check digit is a character other than X\"\n\n[9416f4a5-fe01-4b61-a07b-eb75892ef562]\ndescription = \"invalid check digit in isbn is not treated as zero\"\n\n[c19ba0c4-014f-4dc3-a63f-ff9aefc9b5ec]\ndescription = \"invalid character in isbn is not treated as zero\"\n\n[28025280-2c39-4092-9719-f3234b89c627]\ndescription = \"X is only valid as a check digit\"\n\n[8005b57f-f194-44ee-88d2-a77ac4142591]\ndescription = \"only one check digit is allowed\"\n\n[fdb14c99-4cf8-43c5-b06d-eb1638eff343]\ndescription = \"X is not substituted by the value 10\"\n\n[f6294e61-7e79-46b3-977b-f48789a4945b]\ndescription = \"valid isbn without separating dashes\"\n\n[185ab99b-3a1b-45f3-aeec-b80d80b07f0b]\ndescription = \"isbn without separating dashes and X as check digit\"\n\n[7725a837-ec8e-4528-a92a-d981dd8cf3e2]\ndescription = \"isbn without check digit and dashes\"\n\n[47e4dfba-9c20-46ed-9958-4d3190630bdf]\ndescription = \"too long isbn and no dashes\"\n\n[737f4e91-cbba-4175-95bf-ae630b41fb60]\ndescription = \"too short isbn\"\n\n[5458a128-a9b6-4ff8-8afb-674e74567cef]\ndescription = \"isbn without check digit\"\n\n[70b6ad83-d0a2-4ca7-a4d5-a9ab731800f7]\ndescription = \"check digit of X should not be used for 0\"\n\n[94610459-55ab-4c35-9b93-ff6ea1a8e562]\ndescription = \"empty isbn\"\n\n[7bff28d4-d770-48cc-80d6-b20b3a0fb46c]\ndescription = \"input is 9 characters\"\n\n[ed6e8d1b-382c-4081-8326-8b772c581fec]\ndescription = \"invalid characters are not ignored after checking length\"\n\n[daad3e58-ce00-4395-8a8e-e3eded1cdc86]\ndescription = \"invalid characters are not ignored before checking length\"\n\n[fb5e48d8-7c03-4bfb-a088-b101df16fdc3]\ndescription = \"input is too long but contains a valid isbn\"\n"
  },
  {
    "path": "exercises/practice/isbn-verifier/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/isbn-verifier/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/isbn-verifier/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/isbn-verifier/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/isbn-verifier/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/isbn-verifier/isbn-verifier.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { isValid } from './isbn-verifier.ts'\n\ndescribe('ISBN Verifier', () => {\n  it('valid isbn', () => {\n    expect(isValid('3-598-21508-8')).toBeTruthy()\n  })\n\n  xit('invalid isbn check digit', () => {\n    expect(isValid('3-598-21508-9')).toBeFalsy()\n  })\n\n  xit('valid isbn with a check digit of 10', () => {\n    expect(isValid('3-598-21507-X')).toBeTruthy()\n  })\n\n  xit('check digit is a character other than X', () => {\n    expect(isValid('3-598-21507-A')).toBeFalsy()\n  })\n\n  xit('invalid check digit in isbn is not treated as zero', () => {\n    expect(isValid('4-598-21507-B')).toBeFalsy()\n  })\n\n  xit('invalid character in isbn is not treated as zero', () => {\n    expect(isValid('3-598-2K507-0')).toBeFalsy()\n  })\n\n  xit('X is only valid as a check digit', () => {\n    expect(isValid('3-598-2X507-9')).toBeFalsy()\n  })\n\n  xit('only one check digit is allowed', () => {\n    expect(isValid('3-598-21508-96')).toBeFalsy()\n  })\n\n  xit('X is not substituted by the value 10', () => {\n    expect(isValid('3-598-2X507-5')).toBeFalsy()\n  })\n\n  xit('valid isbn without separating dashes', () => {\n    expect(isValid('3598215088')).toBeTruthy()\n  })\n\n  xit('isbn without separating dashes and X as check digit', () => {\n    expect(isValid('359821507X')).toBeTruthy()\n  })\n\n  xit('isbn without check digit and dashes', () => {\n    expect(isValid('359821507')).toBeFalsy()\n  })\n\n  xit('too long isbn', () => {\n    expect(isValid('3-598-21507-XX')).toBeFalsy()\n  })\n\n  xit('too long isbn and no dashes', () => {\n    expect(isValid('3598215078X')).toBeFalsy()\n  })\n\n  xit('too short isbn', () => {\n    expect(isValid('00')).toBeFalsy()\n  })\n\n  xit('isbn without check digit', () => {\n    expect(isValid('3-598-21507')).toBeFalsy()\n  })\n\n  xit('check digit of X should not be used for 0', () => {\n    expect(isValid('3-598-21515-X')).toBeFalsy()\n  })\n\n  xit('empty isbn', () => {\n    expect(isValid('')).toBeFalsy()\n  })\n\n  xit('input is 9 characters', () => {\n    expect(isValid('134456729')).toBeFalsy()\n  })\n\n  xit('invalid characters are not ignored after checking length', () => {\n    expect(isValid('3132P34035')).toBeFalsy()\n  })\n\n  xit('invalid characters are not ignored before checking length', () => {\n    expect(isValid('3598P215088')).toBeFalsy()\n  })\n\n  xit('input is too long but contains a valid isbn', () => {\n    expect(isValid('98245726788')).toBeFalsy()\n  })\n})\n"
  },
  {
    "path": "exercises/practice/isbn-verifier/isbn-verifier.ts",
    "content": "export function isValid(isbn: unknown): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/isbn-verifier/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/isbn-verifier/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-isbn-verifier\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/isbn-verifier/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/isbn-verifier/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/isogram/.docs/instructions.md",
    "content": "# Instructions\n\nDetermine if a word or phrase is an isogram.\n\nAn isogram (also known as a \"non-pattern word\") is a word or phrase without a repeating letter, however spaces and hyphens are allowed to appear multiple times.\n\nExamples of isograms:\n\n- lumberjacks\n- background\n- downstream\n- six-year-old\n\nThe word _isograms_, however, is not an isogram, because the s repeats.\n"
  },
  {
    "path": "exercises/practice/isogram/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"isogram.ts\"\n    ],\n    \"test\": [\n      \"isogram.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Determine if a word or phrase is an isogram.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Wikipedia\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/Isogram\"\n}\n"
  },
  {
    "path": "exercises/practice/isogram/.meta/proof.ci.ts",
    "content": "export function isIsogram(phrase: string): boolean {\n  const appearances = new Set()\n\n  for (const letter of phrase) {\n    if (isLetter(letter)) {\n      if (appearances.has(letter.toLowerCase())) {\n        return false\n      } else {\n        appearances.add(letter.toLowerCase())\n      }\n    } else {\n      continue\n    }\n  }\n\n  return true\n}\n\nfunction isLetter(letter: string): boolean {\n  if (\n    (letter.charCodeAt(0) >= 97 && letter.charCodeAt(0) <= 122) ||\n    (letter.charCodeAt(0) >= 65 && letter.charCodeAt(0) <= 90)\n  ) {\n    return true\n  } else {\n    return false\n  }\n}\n"
  },
  {
    "path": "exercises/practice/isogram/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[a0e97d2d-669e-47c7-8134-518a1e2c4555]\ndescription = \"empty string\"\n\n[9a001b50-f194-4143-bc29-2af5ec1ef652]\ndescription = \"isogram with only lower case characters\"\n\n[8ddb0ca3-276e-4f8b-89da-d95d5bae78a4]\ndescription = \"word with one duplicated character\"\n\n[6450b333-cbc2-4b24-a723-0b459b34fe18]\ndescription = \"word with one duplicated character from the end of the alphabet\"\n\n[a15ff557-dd04-4764-99e7-02cc1a385863]\ndescription = \"longest reported english isogram\"\n\n[f1a7f6c7-a42f-4915-91d7-35b2ea11c92e]\ndescription = \"word with duplicated character in mixed case\"\n\n[14a4f3c1-3b47-4695-b645-53d328298942]\ndescription = \"word with duplicated character in mixed case, lowercase first\"\n\n[423b850c-7090-4a8a-b057-97f1cadd7c42]\ndescription = \"hypothetical isogrammic word with hyphen\"\n\n[93dbeaa0-3c5a-45c2-8b25-428b8eacd4f2]\ndescription = \"hypothetical word with duplicated character following hyphen\"\n\n[36b30e5c-173f-49c6-a515-93a3e825553f]\ndescription = \"isogram with duplicated hyphen\"\n\n[cdabafa0-c9f4-4c1f-b142-689c6ee17d93]\ndescription = \"made-up name that is an isogram\"\n\n[5fc61048-d74e-48fd-bc34-abfc21552d4d]\ndescription = \"duplicated character in the middle\"\n\n[310ac53d-8932-47bc-bbb4-b2b94f25a83e]\ndescription = \"same first and last characters\"\n\n[0d0b8644-0a1e-4a31-a432-2b3ee270d847]\ndescription = \"word with duplicated character and with two hyphens\"\n"
  },
  {
    "path": "exercises/practice/isogram/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/isogram/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/isogram/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/isogram/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/isogram/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/isogram/isogram.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { isIsogram } from './isogram.ts'\n\ndescribe('Check if the given string is an isogram', () => {\n  it('empty string', () => {\n    const expected = true\n    expect(isIsogram('')).toEqual(expected)\n  })\n\n  xit('isogram with only lower case characters', () => {\n    const expected = true\n    expect(isIsogram('isogram')).toEqual(expected)\n  })\n\n  xit('word with one duplicated character', () => {\n    const expected = false\n    expect(isIsogram('eleven')).toEqual(expected)\n  })\n\n  xit('word with one duplicated character from the end of the alphabet', () => {\n    const expected = false\n    expect(isIsogram('zzyzx')).toEqual(expected)\n  })\n\n  xit('longest reported english isogram', () => {\n    const expected = true\n    expect(isIsogram('subdermatoglyphic')).toEqual(expected)\n  })\n\n  xit('word with duplicated character in mixed case', () => {\n    const expected = false\n    expect(isIsogram('Alphabet')).toEqual(expected)\n  })\n\n  xit('word with duplicated character in mixed case, lowercase first', () => {\n    const expected = false\n    expect(isIsogram('alphAbet')).toEqual(expected)\n  })\n\n  xit('hypothetical isogrammic word with hyphen', () => {\n    const expected = true\n    expect(isIsogram('thumbscrew-japingly')).toEqual(expected)\n  })\n\n  xit('hypothetical word with duplicated character following hyphen', () => {\n    const expected = false\n    expect(isIsogram('thumbscrew-jappingly')).toEqual(expected)\n  })\n\n  xit('isogram with duplicated hyphen', () => {\n    const expected = true\n    expect(isIsogram('six-year-old')).toEqual(expected)\n  })\n\n  xit('made-up name that is an isogram', () => {\n    const expected = true\n    expect(isIsogram('Emily Jung Schwartzkopf')).toEqual(expected)\n  })\n\n  xit('duplicated character in the middle', () => {\n    const expected = false\n    expect(isIsogram('accentor')).toEqual(expected)\n  })\n\n  xit('same first and last characters', () => {\n    const expected = false\n    expect(isIsogram('angola')).toEqual(expected)\n  })\n\n  xit('word with duplicated character and with two hyphens', () => {\n    const expected = false\n    expect(isIsogram('up-to-date')).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/isogram/isogram.ts",
    "content": "export function isIsogram(/* parameters go here */): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/isogram/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/isogram/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-isogram\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/isogram/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/isogram/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/kindergarten-garden/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to, given a diagram, determine which plants each child in the kindergarten class is responsible for.\n\nThere are 12 children in the class:\n\n- Alice, Bob, Charlie, David, Eve, Fred, Ginny, Harriet, Ileana, Joseph, Kincaid, and Larry.\n\nFour different types of seeds are planted:\n\n| Plant  | Diagram encoding |\n| ------ | ---------------- |\n| Grass  | G                |\n| Clover | C                |\n| Radish | R                |\n| Violet | V                |\n\nEach child gets four cups, two on each row:\n\n```text\n[window][window][window]\n........................ # each dot represents a cup\n........................\n```\n\nTheir teacher assigns cups to the children alphabetically by their names, which means that Alice comes first and Larry comes last.\n\nHere is an example diagram representing Alice's plants:\n\n```text\n[window][window][window]\nVR......................\nRG......................\n```\n\nIn the first row, nearest the windows, she has a violet and a radish.\nIn the second row she has a radish and some grass.\n\nYour program will be given the plants from left-to-right starting with the row nearest the windows.\nFrom this, it should be able to determine which plants belong to each student.\n\nFor example, if it's told that the garden looks like so:\n\n```text\n[window][window][window]\nVRCGVVRVCGGCCGVRGCVCGCGV\nVRCCCGCRRGVCGCRVVCVGCGCV\n```\n\nThen if asked for Alice's plants, it should provide:\n\n- Violets, radishes, violets, radishes\n\nWhile asking for Bob's plants would yield:\n\n- Clover, grass, clover, clover\n"
  },
  {
    "path": "exercises/practice/kindergarten-garden/.docs/introduction.md",
    "content": "# Introduction\n\nThe kindergarten class is learning about growing plants.\nThe teacher thought it would be a good idea to give the class seeds to plant and grow in the dirt.\nTo this end, the children have put little cups along the window sills and planted one type of plant in each cup.\nThe children got to pick their favorites from four available types of seeds: grass, clover, radishes, and violets.\n"
  },
  {
    "path": "exercises/practice/kindergarten-garden/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"fredrb\"\n  ],\n  \"contributors\": [\n    \"CRivasGomez\",\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"kindergarten-garden.ts\"\n    ],\n    \"test\": [\n      \"kindergarten-garden.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given a diagram, determine which plants each child in the kindergarten class is responsible for.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Exercise by the JumpstartLab team for students at The Turing School of Software and Design.\",\n  \"source_url\": \"https://www.turing.edu/\"\n}\n"
  },
  {
    "path": "exercises/practice/kindergarten-garden/.meta/proof.ci.ts",
    "content": "const DEFAULT_STUDENTS: Student[] = [\n  'Alice',\n  'Bob',\n  'Charlie',\n  'David',\n  'Eve',\n  'Fred',\n  'Ginny',\n  'Harriet',\n  'Ileana',\n  'Joseph',\n  'Kincaid',\n  'Larry',\n]\n\nconst PLANT_CODES = {\n  G: 'grass',\n  V: 'violets',\n  R: 'radishes',\n  C: 'clover',\n} as const\n\ntype Student = string\ntype Plant = (typeof PLANT_CODES)[keyof typeof PLANT_CODES]\ntype Plants = Plant[]\ntype Pots = Plants[]\n\nfunction getPlants(pots: Pots, index: number): Plants {\n  const plants: Plants = []\n\n  const position = 2 * index\n  plants.push(pots[0][position])\n  plants.push(pots[0][position + 1])\n  plants.push(pots[1][position])\n  plants.push(pots[1][position + 1])\n\n  return plants\n}\n\nfunction parse(diagram: string): Pots {\n  return diagram\n    .split('\\n')\n    .map((row) =>\n      [...row].map(\n        (sign) => PLANT_CODES[sign as keyof typeof PLANT_CODES] as Plant\n      )\n    )\n}\nexport class Garden {\n  private plots: Record<Student, Plants>\n\n  constructor(\n    diagram: string,\n    private students = DEFAULT_STUDENTS\n  ) {\n    this.students.sort()\n\n    this.plots = {}\n\n    this.students.forEach((student, index) => {\n      this.plots[student] = getPlants(parse(diagram), index)\n    })\n  }\n\n  public plants(student: Student): Plants {\n    return this.plots[student]\n  }\n}\n"
  },
  {
    "path": "exercises/practice/kindergarten-garden/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[1fc316ed-17ab-4fba-88ef-3ae78296b692]\ndescription = \"partial garden -> garden with single student\"\n\n[acd19dc1-2200-4317-bc2a-08f021276b40]\ndescription = \"partial garden -> different garden with single student\"\n\n[c376fcc8-349c-446c-94b0-903947315757]\ndescription = \"partial garden -> garden with two students\"\n\n[2d620f45-9617-4924-9d27-751c80d17db9]\ndescription = \"partial garden -> multiple students for the same garden with three students -> second student's garden\"\n\n[57712331-4896-4364-89f8-576421d69c44]\ndescription = \"partial garden -> multiple students for the same garden with three students -> third student's garden\"\n\n[149b4290-58e1-40f2-8ae4-8b87c46e765b]\ndescription = \"full garden -> for Alice, first student's garden\"\n\n[ba25dbbc-10bd-4a37-b18e-f89ecd098a5e]\ndescription = \"full garden -> for Bob, second student's garden\"\n\n[566b621b-f18e-4c5f-873e-be30544b838c]\ndescription = \"full garden -> for Charlie\"\n\n[3ad3df57-dd98-46fc-9269-1877abf612aa]\ndescription = \"full garden -> for David\"\n\n[0f0a55d1-9710-46ed-a0eb-399ba8c72db2]\ndescription = \"full garden -> for Eve\"\n\n[a7e80c90-b140-4ea1-aee3-f4625365c9a4]\ndescription = \"full garden -> for Fred\"\n\n[9d94b273-2933-471b-86e8-dba68694c615]\ndescription = \"full garden -> for Ginny\"\n\n[f55bc6c2-ade8-4844-87c4-87196f1b7258]\ndescription = \"full garden -> for Harriet\"\n\n[759070a3-1bb1-4dd4-be2c-7cce1d7679ae]\ndescription = \"full garden -> for Ileana\"\n\n[78578123-2755-4d4a-9c7d-e985b8dda1c6]\ndescription = \"full garden -> for Joseph\"\n\n[6bb66df7-f433-41ab-aec2-3ead6e99f65b]\ndescription = \"full garden -> for Kincaid, second to last student's garden\"\n\n[d7edec11-6488-418a-94e6-ed509e0fa7eb]\ndescription = \"full garden -> for Larry, last student's garden\"\n"
  },
  {
    "path": "exercises/practice/kindergarten-garden/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/kindergarten-garden/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/kindergarten-garden/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/kindergarten-garden/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/kindergarten-garden/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/kindergarten-garden/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/kindergarten-garden/kindergarten-garden.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { Garden } from './kindergarten-garden.ts'\n\ndescribe('partial Garden', () => {\n  it('garden with single student', () => {\n    expect(new Garden('RC\\nGG').plants('Alice')).toEqual([\n      'radishes',\n      'clover',\n      'grass',\n      'grass',\n    ])\n  })\n\n  xit('different garden with single student', () => {\n    expect(new Garden('VC\\nRC').plants('Alice')).toEqual([\n      'violets',\n      'clover',\n      'radishes',\n      'clover',\n    ])\n  })\n\n  xit('garden with two students', () => {\n    expect(new Garden('VVCG\\nVVRC').plants('Bob')).toEqual([\n      'clover',\n      'grass',\n      'radishes',\n      'clover',\n    ])\n  })\n\n  describe('multiple students for the same garden with three students', () => {\n    xit(\"second student's garden\", () => {\n      expect(new Garden('VVCCGG\\nVVCCGG').plants('Bob')).toEqual([\n        'clover',\n        'clover',\n        'clover',\n        'clover',\n      ])\n    })\n\n    xit(\"third student's garden\", () => {\n      expect(new Garden('VVCCGG\\nVVCCGG').plants('Charlie')).toEqual([\n        'grass',\n        'grass',\n        'grass',\n        'grass',\n      ])\n    })\n  })\n})\n\ndescribe('full garden', () => {\n  const diagram = 'VRCGVVRVCGGCCGVRGCVCGCGV\\nVRCCCGCRRGVCGCRVVCVGCGCV'\n  const garden = new Garden(diagram)\n\n  xit(\"for Alice, first student's garden\", () => {\n    expect(garden.plants('Alice')).toEqual([\n      'violets',\n      'radishes',\n      'violets',\n      'radishes',\n    ])\n  })\n\n  xit(\"for Bob, second student's garden\", () => {\n    expect(garden.plants('Bob')).toEqual([\n      'clover',\n      'grass',\n      'clover',\n      'clover',\n    ])\n  })\n\n  xit('for Charlie', () => {\n    expect(garden.plants('Charlie')).toEqual([\n      'violets',\n      'violets',\n      'clover',\n      'grass',\n    ])\n  })\n\n  xit('for David', () => {\n    expect(garden.plants('David')).toEqual([\n      'radishes',\n      'violets',\n      'clover',\n      'radishes',\n    ])\n  })\n\n  xit('for Eve', () => {\n    expect(garden.plants('Eve')).toEqual([\n      'clover',\n      'grass',\n      'radishes',\n      'grass',\n    ])\n  })\n\n  xit('for Fred', () => {\n    expect(garden.plants('Fred')).toEqual([\n      'grass',\n      'clover',\n      'violets',\n      'clover',\n    ])\n  })\n\n  xit('for Ginny', () => {\n    expect(garden.plants('Ginny')).toEqual([\n      'clover',\n      'grass',\n      'grass',\n      'clover',\n    ])\n  })\n\n  xit('for Harriet', () => {\n    expect(garden.plants('Harriet')).toEqual([\n      'violets',\n      'radishes',\n      'radishes',\n      'violets',\n    ])\n  })\n\n  xit('for Ileana', () => {\n    expect(garden.plants('Ileana')).toEqual([\n      'grass',\n      'clover',\n      'violets',\n      'clover',\n    ])\n  })\n\n  xit('for Joseph', () => {\n    expect(garden.plants('Joseph')).toEqual([\n      'violets',\n      'clover',\n      'violets',\n      'grass',\n    ])\n  })\n\n  xit(\"for Kincaid, second to last student's garden\", () => {\n    expect(garden.plants('Kincaid')).toEqual([\n      'grass',\n      'clover',\n      'clover',\n      'grass',\n    ])\n  })\n\n  xit(\"for Larry, last student's garden\", () => {\n    expect(garden.plants('Larry')).toEqual([\n      'grass',\n      'violets',\n      'clover',\n      'violets',\n    ])\n  })\n})\n\ndescribe('disordered class', () => {\n  const diagram = 'VCRRGVRG\\nRVGCCGCV'\n  const students = ['Samantha', 'Patricia', 'Xander', 'Roger']\n  const garden = new Garden(diagram, students)\n\n  xit('for Patricia', () => {\n    expect(garden.plants('Patricia')).toEqual([\n      'violets',\n      'clover',\n      'radishes',\n      'violets',\n    ])\n  })\n\n  xit('for Roger', () => {\n    expect(garden.plants('Roger')).toEqual([\n      'radishes',\n      'radishes',\n      'grass',\n      'clover',\n    ])\n  })\n\n  xit('for Samantha', () => {\n    expect(garden.plants('Samantha')).toEqual([\n      'grass',\n      'violets',\n      'clover',\n      'grass',\n    ])\n  })\n\n  xit('for Xander', () => {\n    expect(garden.plants('Xander')).toEqual([\n      'radishes',\n      'grass',\n      'clover',\n      'violets',\n    ])\n  })\n})\n\ndescribe('Two gardens, different students', () => {\n  const diagram = 'VCRRGVRG\\nRVGCCGCV'\n  const garden1 = new Garden(diagram, ['Alice', 'Bob', 'Charlie', 'Dan'])\n  const garden2 = new Garden(diagram, ['Bob', 'Charlie', 'Dan', 'Erin'])\n\n  xit('Bob and Charlie for each garden', () => {\n    expect(garden1.plants('Bob')).toEqual([\n      'radishes',\n      'radishes',\n      'grass',\n      'clover',\n    ])\n    expect(garden2.plants('Bob')).toEqual([\n      'violets',\n      'clover',\n      'radishes',\n      'violets',\n    ])\n    expect(garden1.plants('Charlie')).toEqual([\n      'grass',\n      'violets',\n      'clover',\n      'grass',\n    ])\n    expect(garden2.plants('Charlie')).toEqual([\n      'radishes',\n      'radishes',\n      'grass',\n      'clover',\n    ])\n  })\n})\n"
  },
  {
    "path": "exercises/practice/kindergarten-garden/kindergarten-garden.ts",
    "content": "//\n// This is only a SKELETON file for the 'Kindergarten Garden' exercise.\n// It's been provided as a convenience to get you started writing code faster.\n//\n\nconst DEFAULT_STUDENTS: Student[] = [\n  'Alice',\n  'Bob',\n  'Charlie',\n  'David',\n  'Eve',\n  'Fred',\n  'Ginny',\n  'Harriet',\n  'Ileana',\n  'Joseph',\n  'Kincaid',\n  'Larry',\n]\n\nconst PLANT_CODES = {\n  G: 'grass',\n  V: 'violets',\n  R: 'radishes',\n  C: 'clover',\n} as const\n\ntype Student = string\ntype Plant = (typeof PLANT_CODES)[keyof typeof PLANT_CODES]\ntype Plants = Plant[]\ntype Pots = Plants[]\n\nexport class Garden {\n  constructor(diagram: string, students = DEFAULT_STUDENTS) {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public plants(student: Student): Plants {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/kindergarten-garden/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-kindergarten-garden\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/kindergarten-garden/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/kindergarten-garden/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/knapsack/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to determine which items to take so that the total value of her selection is maximized, taking into account the knapsack's carrying capacity.\n\nItems will be represented as a list of items.\nEach item will have a weight and value.\nAll values given will be strictly positive.\nLhakpa can take only one of each item.\n\nFor example:\n\n```text\nItems: [\n  { \"weight\": 5, \"value\": 10 },\n  { \"weight\": 4, \"value\": 40 },\n  { \"weight\": 6, \"value\": 30 },\n  { \"weight\": 4, \"value\": 50 }\n]\n\nKnapsack Maximum Weight: 10\n```\n\nFor the above, the first item has weight 5 and value 10, the second item has weight 4 and value 40, and so on.\nIn this example, Lhakpa should take the second and fourth item to maximize her value, which, in this case, is 90.\nShe cannot get more than 90 as her knapsack has a weight limit of 10.\n"
  },
  {
    "path": "exercises/practice/knapsack/.docs/introduction.md",
    "content": "# Introduction\n\nLhakpa is a [Sherpa][sherpa] mountain guide and porter.\nAfter months of careful planning, the expedition Lhakpa works for is about to leave.\nShe will be paid the value she carried to the base camp.\n\nIn front of her are many items, each with a value and weight.\nLhakpa would gladly take all of the items, but her knapsack can only hold so much weight.\n\n[sherpa]: https://en.wikipedia.org/wiki/Sherpa_people#Mountaineering\n"
  },
  {
    "path": "exercises/practice/knapsack/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"JoshiRaez\"\n  ],\n  \"contributors\": [\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"knapsack.ts\"\n    ],\n    \"test\": [\n      \"knapsack.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given a knapsack that can only carry a certain weight, determine which items to put in the knapsack in order to maximize their combined value.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Wikipedia\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/Knapsack_problem\"\n}\n"
  },
  {
    "path": "exercises/practice/knapsack/.meta/proof.ci.ts",
    "content": "type Item = {\n  weight: number\n  value: number\n}\n\nexport function maximumValue({\n  maximumWeight,\n  items,\n}: {\n  maximumWeight: number\n  items: Item[]\n}): number {\n  const maxValueForItemsSizeToWeight: number[][] = new Array(items.length + 1)\n    .fill(undefined)\n    .map(() => new Array<number>(maximumWeight + 1))\n\n  return solve(items.length, maximumWeight, items, maxValueForItemsSizeToWeight)\n}\n\nfunction solve(\n  setItemsSize: number,\n  maxWeight: number,\n  items: Item[],\n  maxValueForItemsSizeToWeight: number[][]\n): number {\n  return memoizedMax(\n    setItemsSize,\n    maxWeight,\n    items,\n    maxValueForItemsSizeToWeight\n  )\n}\n\nfunction memoizedMax(\n  setItemsSize: number,\n  maxWeight: number,\n  items: Item[],\n  maxValueForItemsSizeToWeight: number[][]\n): number {\n  const alreadyKnownMaxValue =\n    maxValueForItemsSizeToWeight[setItemsSize][maxWeight]\n  if (alreadyKnownMaxValue || alreadyKnownMaxValue === 0)\n    return alreadyKnownMaxValue\n\n  const max = calculateMax(\n    setItemsSize,\n    maxWeight,\n    items,\n    maxValueForItemsSizeToWeight\n  )\n  maxValueForItemsSizeToWeight[setItemsSize][maxWeight] = max\n\n  return max\n}\n\nfunction calculateMax(\n  setItemsSize: number,\n  maxWeight: number,\n  items: Item[],\n  maxValueForItemsSizeToWeight: number[][]\n): number {\n  if (!setItemsSize) return 0\n\n  return Math.max(\n    ...Array.from(Array(maxWeight + 1).keys()).map(\n      (checkingWeight) =>\n        memoizedMax(\n          setItemsSize - 1,\n          checkingWeight,\n          items,\n          maxValueForItemsSizeToWeight\n        ) +\n        valueOfItemIfFits(maxWeight, checkingWeight, items[setItemsSize - 1])\n    )\n  )\n}\n\nfunction valueOfItemIfFits(\n  maxWeight: number,\n  alreadyInBagWeight: number,\n  itemToFit: Item\n): number {\n  if (alreadyInBagWeight + itemToFit.weight <= maxWeight) return itemToFit.value\n\n  return 0\n}\n"
  },
  {
    "path": "exercises/practice/knapsack/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[a4d7d2f0-ad8a-460c-86f3-88ba709d41a7]\ndescription = \"no items\"\ninclude = false\n\n[3993a824-c20e-493d-b3c9-ee8a7753ee59]\ndescription = \"no items\"\nreimplements = \"a4d7d2f0-ad8a-460c-86f3-88ba709d41a7\"\n\n[1d39e98c-6249-4a8b-912f-87cb12e506b0]\ndescription = \"one item, too heavy\"\n\n[833ea310-6323-44f2-9d27-a278740ffbd8]\ndescription = \"five items (cannot be greedy by weight)\"\n\n[277cdc52-f835-4c7d-872b-bff17bab2456]\ndescription = \"five items (cannot be greedy by value)\"\n\n[81d8e679-442b-4f7a-8a59-7278083916c9]\ndescription = \"example knapsack\"\n\n[f23a2449-d67c-4c26-bf3e-cde020f27ecc]\ndescription = \"8 items\"\n\n[7c682ae9-c385-4241-a197-d2fa02c81a11]\ndescription = \"15 items\"\n"
  },
  {
    "path": "exercises/practice/knapsack/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/knapsack/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/knapsack/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/knapsack/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/knapsack/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/knapsack/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/knapsack/knapsack.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { maximumValue } from './knapsack.ts'\n\ndescribe('Check if max carriable value is returned', () => {\n  it('No items', () => {\n    const input = {\n      maximumWeight: 100,\n      items: [],\n    }\n    const expected = 0\n    expect(maximumValue(input)).toEqual(expected)\n  })\n\n  xit('One item, but too heavy', () => {\n    const input = {\n      maximumWeight: 10,\n      items: [{ weight: 100, value: 1 }],\n    }\n    const expected = 0\n    expect(maximumValue(input)).toEqual(expected)\n  })\n\n  xit(\"Five items. Can't be greedy by weight\", () => {\n    const input = {\n      maximumWeight: 10,\n      items: [\n        { weight: 2, value: 5 },\n        { weight: 2, value: 5 },\n        { weight: 2, value: 5 },\n        { weight: 2, value: 5 },\n        { weight: 10, value: 21 },\n      ],\n    }\n    const expected = 21\n    expect(maximumValue(input)).toEqual(expected)\n  })\n\n  xit(\"Five items. Can't be greedy by value\", () => {\n    const input = {\n      maximumWeight: 10,\n      items: [\n        { weight: 2, value: 20 },\n        { weight: 2, value: 20 },\n        { weight: 2, value: 20 },\n        { weight: 2, value: 20 },\n        { weight: 10, value: 50 },\n      ],\n    }\n    const expected = 80\n    expect(maximumValue(input)).toEqual(expected)\n  })\n\n  xit('Example knapsack', () => {\n    const input = {\n      maximumWeight: 10,\n      items: [\n        { weight: 5, value: 10 },\n        { weight: 4, value: 40 },\n        { weight: 6, value: 30 },\n        { weight: 4, value: 50 },\n      ],\n    }\n    const expected = 90\n    expect(maximumValue(input)).toEqual(expected)\n  })\n\n  xit('8 items', () => {\n    const input = {\n      maximumWeight: 104,\n      items: [\n        { weight: 25, value: 350 },\n        { weight: 35, value: 400 },\n        { weight: 45, value: 450 },\n        { weight: 5, value: 20 },\n        { weight: 25, value: 70 },\n        { weight: 3, value: 8 },\n        { weight: 2, value: 5 },\n        { weight: 2, value: 5 },\n      ],\n    }\n    const expected = 900\n    expect(maximumValue(input)).toEqual(expected)\n  })\n\n  xit('15 items', () => {\n    const input = {\n      maximumWeight: 750,\n      items: [\n        { weight: 70, value: 135 },\n        { weight: 73, value: 139 },\n        { weight: 77, value: 149 },\n        { weight: 80, value: 150 },\n        { weight: 82, value: 156 },\n        { weight: 87, value: 163 },\n        { weight: 90, value: 173 },\n        { weight: 94, value: 184 },\n        { weight: 98, value: 192 },\n        { weight: 106, value: 201 },\n        { weight: 110, value: 210 },\n        { weight: 113, value: 214 },\n        { weight: 115, value: 221 },\n        { weight: 118, value: 229 },\n        { weight: 120, value: 240 },\n      ],\n    }\n    const expected = 1458\n    expect(maximumValue(input)).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/knapsack/knapsack.ts",
    "content": "type Item = {\n  weight: number\n  value: number\n}\n\nexport function maximumValue({\n  maximumWeight,\n  items,\n}: {\n  maximumWeight: number\n  items: Item[]\n}): number {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/knapsack/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-knapsack\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism practice exercise on knapsack\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/knapsack/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/knapsack/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/largest-series-product/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to look for patterns in the long sequence of digits in the encrypted signal.\n\nThe technique you're going to use here is called the largest series product.\n\nLet's define a few terms, first.\n\n- **input**: the sequence of digits that you need to analyze\n- **series**: a sequence of adjacent digits (those that are next to each other) that is contained within the input\n- **span**: how many digits long each series is\n- **product**: what you get when you multiply numbers together\n\nLet's work through an example, with the input `\"63915\"`.\n\n- To form a series, take adjacent digits in the original input.\n- If you are working with a span of `3`, there will be three possible series:\n  - `\"639\"`\n  - `\"391\"`\n  - `\"915\"`\n- Then we need to calculate the product of each series:\n  - The product of the series `\"639\"` is 162 (`6 × 3 × 9 = 162`)\n  - The product of the series `\"391\"` is 27 (`3 × 9 × 1 = 27`)\n  - The product of the series `\"915\"` is 45 (`9 × 1 × 5 = 45`)\n- 162 is bigger than both 27 and 45, so the largest series product of `\"63915\"` is from the series `\"639\"`.\n  So the answer is **162**.\n"
  },
  {
    "path": "exercises/practice/largest-series-product/.docs/introduction.md",
    "content": "# Introduction\n\nYou work for a government agency that has intercepted a series of encrypted communication signals from a group of bank robbers.\nThe signals contain a long sequence of digits.\nYour team needs to use various digital signal processing techniques to analyze the signals and identify any patterns that may indicate the planning of a heist.\n"
  },
  {
    "path": "exercises/practice/largest-series-product/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"deyshin\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"largest-series-product.ts\"\n    ],\n    \"test\": [\n      \"largest-series-product.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given a string of digits, calculate the largest product for a contiguous substring of digits of length n.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"A variation on Problem 8 at Project Euler\",\n  \"source_url\": \"https://projecteuler.net/problem=8\"\n}\n"
  },
  {
    "path": "exercises/practice/largest-series-product/.meta/proof.ci.ts",
    "content": "export function largestProduct(digits: string, seriesLength: number): number {\n  if (seriesLength === 0) {\n    return 1\n  }\n  if (seriesLength > digits.length) {\n    throw new Error('Span must not exceed string length')\n  }\n  if (seriesLength < 0) {\n    throw new Error('Span must not be negative')\n  }\n\n  if (!/^[0-9]+$/g.test(digits)) {\n    throw new Error('Digits input must only contain digits')\n  }\n\n  let result = 0\n  for (let i = 0; i <= digits.length - seriesLength; i++) {\n    const product = digits\n      .substring(i, i + seriesLength)\n      .split('')\n      .map((digit) => Number(digit))\n      .reduce((a, b) => a * b)\n    if (product > result) {\n      result = product\n    }\n  }\n  return result\n}\n"
  },
  {
    "path": "exercises/practice/largest-series-product/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[7c82f8b7-e347-48ee-8a22-f672323324d4]\ndescription = \"finds the largest product if span equals length\"\n\n[88523f65-21ba-4458-a76a-b4aaf6e4cb5e]\ndescription = \"can find the largest product of 2 with numbers in order\"\n\n[f1376b48-1157-419d-92c2-1d7e36a70b8a]\ndescription = \"can find the largest product of 2\"\n\n[46356a67-7e02-489e-8fea-321c2fa7b4a4]\ndescription = \"can find the largest product of 3 with numbers in order\"\n\n[a2dcb54b-2b8f-4993-92dd-5ce56dece64a]\ndescription = \"can find the largest product of 3\"\n\n[673210a3-33cd-4708-940b-c482d7a88f9d]\ndescription = \"can find the largest product of 5 with numbers in order\"\n\n[02acd5a6-3bbf-46df-8282-8b313a80a7c9]\ndescription = \"can get the largest product of a big number\"\n\n[76dcc407-21e9-424c-a98e-609f269622b5]\ndescription = \"reports zero if the only digits are zero\"\n\n[6ef0df9f-52d4-4a5d-b210-f6fae5f20e19]\ndescription = \"reports zero if all spans include zero\"\n\n[5d81aaf7-4f67-4125-bf33-11493cc7eab7]\ndescription = \"rejects span longer than string length\"\ninclude = false\n\n[0ae1ce53-d9ba-41bb-827f-2fceb64f058b]\ndescription = \"rejects span longer than string length\"\nreimplements = \"5d81aaf7-4f67-4125-bf33-11493cc7eab7\"\n\n[06bc8b90-0c51-4c54-ac22-3ec3893a079e]\ndescription = \"reports 1 for empty string and empty product (0 span)\"\ninclude = false\n\n[3ec0d92e-f2e2-4090-a380-70afee02f4c0]\ndescription = \"reports 1 for nonempty string and empty product (0 span)\"\ninclude = false\n\n[6d96c691-4374-4404-80ee-2ea8f3613dd4]\ndescription = \"rejects empty string and nonzero span\"\ninclude = false\n\n[6cf66098-a6af-4223-aab1-26aeeefc7402]\ndescription = \"rejects empty string and nonzero span\"\nreimplements = \"6d96c691-4374-4404-80ee-2ea8f3613dd4\"\n\n[7a38f2d6-3c35-45f6-8d6f-12e6e32d4d74]\ndescription = \"rejects invalid character in digits\"\n\n[5fe3c0e5-a945-49f2-b584-f0814b4dd1ef]\ndescription = \"rejects negative span\"\ninclude = false\n\n[c859f34a-9bfe-4897-9c2f-6d7f8598e7f0]\ndescription = \"rejects negative span\"\nreimplements = \"5fe3c0e5-a945-49f2-b584-f0814b4dd1ef\"\n"
  },
  {
    "path": "exercises/practice/largest-series-product/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/largest-series-product/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/largest-series-product/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/largest-series-product/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/largest-series-product/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/largest-series-product/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/largest-series-product/largest-series-product.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { largestProduct } from './largest-series-product.ts'\n\ndescribe('Largest Series Product', () => {\n  it('finds the largest product if span equals length', () => {\n    expect(largestProduct('29', 2)).toEqual(18)\n  })\n\n  xit('can find the largest product of 2 with numbers in order', () => {\n    expect(largestProduct('0123456789', 2)).toEqual(72)\n  })\n\n  xit('can find the largest product of 2', () => {\n    expect(largestProduct('576802143', 2)).toEqual(48)\n  })\n\n  xit('can find the largest product of 3 with numbers in order', () => {\n    expect(largestProduct('0123456789', 3)).toEqual(504)\n  })\n\n  xit('can find the largest product of 3', () => {\n    expect(largestProduct('1027839564', 3)).toEqual(270)\n  })\n\n  xit('can find the largest product of 5 with numbers in order', () => {\n    expect(largestProduct('0123456789', 5)).toEqual(15120)\n  })\n\n  xit('can get the largest product of a big number', () => {\n    expect(\n      largestProduct('73167176531330624919225119674426574742355349194934', 6)\n    ).toEqual(23520)\n  })\n\n  xit('reports zero if the only digits are zero', () => {\n    expect(largestProduct('0000', 2)).toEqual(0)\n  })\n\n  xit('reports zero if all spans include zero', () => {\n    expect(largestProduct('99099', 3)).toEqual(0)\n  })\n\n  xit('rejects span longer than string length', () => {\n    expect(() => largestProduct('123', 4)).toThrow(\n      new Error('Span must not exceed string length')\n    )\n  })\n\n  xit('rejects empty string and nonzero span', () => {\n    expect(() => largestProduct('', 1)).toThrow(\n      new Error('Span must not exceed string length')\n    )\n  })\n\n  xit('rejects invalid character in digits', () => {\n    expect(() => largestProduct('1234a5', 2)).toThrow(\n      new Error('Digits input must only contain digits')\n    )\n  })\n\n  xit('rejects negative span', () => {\n    expect(() => largestProduct('12345', -1)).toThrow(\n      new Error('Span must not be negative')\n    )\n  })\n})\n"
  },
  {
    "path": "exercises/practice/largest-series-product/largest-series-product.ts",
    "content": "export const largestProduct = () => {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/largest-series-product/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-largest-series-product\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/largest-series-product/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/largest-series-product/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/leap/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to determine whether a given year is a leap year.\n"
  },
  {
    "path": "exercises/practice/leap/.docs/introduction.md",
    "content": "# Introduction\n\nA leap year (in the Gregorian calendar) occurs:\n\n- In every year that is evenly divisible by 4.\n- Unless the year is evenly divisible by 100, in which case it's only a leap year if the year is also evenly divisible by 400.\n\nSome examples:\n\n- 1997 was not a leap year as it's not divisible by 4.\n- 1900 was not a leap year as it's not divisible by 400.\n- 2000 was a leap year!\n\n~~~~exercism/note\nFor a delightful, four-minute explanation of the whole phenomenon of leap years, check out [this YouTube video](https://www.youtube.com/watch?v=xX96xng7sAE).\n~~~~\n"
  },
  {
    "path": "exercises/practice/leap/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"masters3d\"\n  ],\n  \"contributors\": [\n    \"DFXLuna\",\n    \"lukaszklis\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"leap.ts\"\n    ],\n    \"test\": [\n      \"leap.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Determine whether a given year is a leap year.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"CodeRanch Cattle Drive, Assignment 3\",\n  \"source_url\": \"https://web.archive.org/web/20240907033714/https://coderanch.com/t/718816/Leap\"\n}\n"
  },
  {
    "path": "exercises/practice/leap/.meta/proof.ci.ts",
    "content": "export function isLeap(year: number): boolean {\n  return (year % 100 !== 0 && year % 4 === 0) || year % 400 === 0\n}\n"
  },
  {
    "path": "exercises/practice/leap/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[6466b30d-519c-438e-935d-388224ab5223]\ndescription = \"year not divisible by 4 in common year\"\n\n[ac227e82-ee82-4a09-9eb6-4f84331ffdb0]\ndescription = \"year divisible by 2, not divisible by 4 in common year\"\n\n[4fe9b84c-8e65-489e-970b-856d60b8b78e]\ndescription = \"year divisible by 4, not divisible by 100 in leap year\"\n\n[7fc6aed7-e63c-48f5-ae05-5fe182f60a5d]\ndescription = \"year divisible by 4 and 5 is still a leap year\"\n\n[78a7848f-9667-4192-ae53-87b30c9a02dd]\ndescription = \"year divisible by 100, not divisible by 400 in common year\"\n\n[9d70f938-537c-40a6-ba19-f50739ce8bac]\ndescription = \"year divisible by 100 but not by 3 is still not a leap year\"\n\n[42ee56ad-d3e6-48f1-8e3f-c84078d916fc]\ndescription = \"year divisible by 400 in leap year\"\n\n[57902c77-6fe9-40de-8302-587b5c27121e]\ndescription = \"year divisible by 400 but not by 125 is still a leap year\"\n\n[c30331f6-f9f6-4881-ad38-8ca8c12520c1]\ndescription = \"year divisible by 200, not divisible by 400 in common year\"\n"
  },
  {
    "path": "exercises/practice/leap/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/leap/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/leap/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/leap/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/leap/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/leap/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/leap/leap.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { isLeap } from './leap.ts'\n\ndescribe('A leap year', () => {\n  it('year not divisible by 4 in common year', () => {\n    expect(isLeap(2015)).toBe(false)\n  })\n\n  xit('year divisible by 2, not divisible by 4 in common year', () => {\n    expect(isLeap(1970)).toBe(false)\n  })\n\n  xit('year divisible by 4, not divisible by 100 in leap year', () => {\n    expect(isLeap(1996)).toBe(true)\n  })\n\n  xit('year divisible by 4 and 5 is still a leap year', () => {\n    expect(isLeap(1960)).toBe(true)\n  })\n\n  xit('year divisible by 100, not divisible by 400 in common year', () => {\n    expect(isLeap(2100)).toBe(false)\n  })\n\n  xit('year divisible by 100 but not by 3 is still not a leap year', () => {\n    expect(isLeap(1900)).toBe(false)\n  })\n\n  xit('year divisible by 400 in leap year', () => {\n    expect(isLeap(2000)).toBe(true)\n  })\n\n  xit('year divisible by 400 but not by 125 is still a leap year', () => {\n    expect(isLeap(2400)).toBe(true)\n  })\n\n  xit('year divisible by 200, not divisible by 400 in common year', () => {\n    expect(isLeap(1800)).toBe(false)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/leap/leap.ts",
    "content": "export function isLeap() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/leap/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-leap\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/leap/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/leap/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/line-up/.docs/instructions.md",
    "content": "# Instructions\n\nGiven a name and a number, your task is to produce a sentence using that name and that number as an [ordinal numeral][ordinal-numeral].\nYaʻqūb expects to use numbers from 1 up to 999.\n\nRules:\n\n- Numbers ending in 1 (unless ending in 11) → `\"st\"`\n- Numbers ending in 2 (unless ending in 12) → `\"nd\"`\n- Numbers ending in 3 (unless ending in 13) → `\"rd\"`\n- All other numbers → `\"th\"`\n\nExamples:\n\n- `\"Mary\", 1` → `\"Mary, you are the 1st customer we serve today. Thank you!\"`\n- `\"John\", 12` → `\"John, you are the 12th customer we serve today. Thank you!\"`\n- `\"Dahir\", 162` → `\"Dahir, you are the 162nd customer we serve today. Thank you!\"`\n\n[ordinal-numeral]: https://en.wikipedia.org/wiki/Ordinal_numeral\n"
  },
  {
    "path": "exercises/practice/line-up/.docs/introduction.md",
    "content": "# Introduction\n\nYour friend Yaʻqūb works the counter at a deli in town, slicing, weighing, and wrapping orders for a line of hungry customers that gets longer every day.\nWaiting customers are starting to lose track of who is next, so he wants numbered tickets they can use to track the order in which they arrive.\n\nTo make the customers feel special, he does not want the ticket to have only a number on it.\nThey shall get a proper English sentence with their name and number on it.\n"
  },
  {
    "path": "exercises/practice/line-up/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"BNAndras\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"line-up.ts\"\n    ],\n    \"test\": [\n      \"line-up.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Help lining up customers at Yaʻqūb's Deli.\",\n  \"source\": \"mk-mxp, based on previous work from Exercism contributors codedge and neenjaw\",\n  \"source_url\": \"https://forum.exercism.org/t/new-exercise-ordinal-numbers/19147\"\n}\n"
  },
  {
    "path": "exercises/practice/line-up/.meta/proof.ci.ts",
    "content": "const getSuffix = (number: number): string => {\n  const lastTwoDigits = number % 100\n  const lastOneDigit = number % 10\n\n  if (lastTwoDigits >= 11 && lastTwoDigits <= 13) {\n    return 'th'\n  }\n\n  if (lastOneDigit === 1) {\n    return 'st'\n  }\n\n  if (lastOneDigit === 2) {\n    return 'nd'\n  }\n\n  if (lastOneDigit === 3) {\n    return 'rd'\n  }\n\n  return 'th'\n}\n\nexport const format = (name: string, number: number): string =>\n  `${name}, you are the ${number}${getSuffix(number)} customer we serve today. Thank you!`\n"
  },
  {
    "path": "exercises/practice/line-up/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[7760d1b8-4864-4db4-953b-0fa7c047dbc0]\ndescription = \"format smallest non-exceptional ordinal numeral 4\"\n\n[e8b7c715-6baa-4f7b-8fb3-2fa48044ab7a]\ndescription = \"format greatest single digit non-exceptional ordinal numeral 9\"\n\n[f370aae9-7ae7-4247-90ce-e8ff8c6934df]\ndescription = \"format non-exceptional ordinal numeral 5\"\n\n[37f10dea-42a2-49de-bb92-0b690b677908]\ndescription = \"format non-exceptional ordinal numeral 6\"\n\n[d8dfb9a2-3a1f-4fee-9dae-01af3600054e]\ndescription = \"format non-exceptional ordinal numeral 7\"\n\n[505ec372-1803-42b1-9377-6934890fd055]\ndescription = \"format non-exceptional ordinal numeral 8\"\n\n[8267072d-be1f-4f70-b34a-76b7557a47b9]\ndescription = \"format exceptional ordinal numeral 1\"\n\n[4d8753cb-0364-4b29-84b8-4374a4fa2e3f]\ndescription = \"format exceptional ordinal numeral 2\"\n\n[8d44c223-3a7e-4f48-a0ca-78e67bf98aa7]\ndescription = \"format exceptional ordinal numeral 3\"\n\n[6c4f6c88-b306-4f40-bc78-97cdd583c21a]\ndescription = \"format smallest two digit non-exceptional ordinal numeral 10\"\n\n[e257a43f-d2b1-457a-97df-25f0923fc62a]\ndescription = \"format non-exceptional ordinal numeral 11\"\n\n[bb1db695-4d64-457f-81b8-4f5a2107e3f4]\ndescription = \"format non-exceptional ordinal numeral 12\"\n\n[60a3187c-9403-4835-97de-4f10ebfd63e2]\ndescription = \"format non-exceptional ordinal numeral 13\"\n\n[2bdcebc5-c029-4874-b6cc-e9bec80d603a]\ndescription = \"format exceptional ordinal numeral 21\"\n\n[74ee2317-0295-49d2-baf0-d56bcefa14e3]\ndescription = \"format exceptional ordinal numeral 62\"\n\n[b37c332d-7f68-40e3-8503-e43cbd67a0c4]\ndescription = \"format exceptional ordinal numeral 100\"\n\n[0375f250-ce92-4195-9555-00e28ccc4d99]\ndescription = \"format exceptional ordinal numeral 101\"\n\n[0d8a4974-9a8a-45a4-aca7-a9fb473c9836]\ndescription = \"format non-exceptional ordinal numeral 112\"\n\n[06b62efe-199e-4ce7-970d-4bf73945713f]\ndescription = \"format exceptional ordinal numeral 123\"\n"
  },
  {
    "path": "exercises/practice/line-up/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/line-up/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/line-up/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/line-up/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/line-up/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/line-up/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/line-up/line-up.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { format } from './line-up.ts'\n\ndescribe('Line Up', () => {\n  it('format smallest non-exceptional ordinal numeral 4', () => {\n    expect(format('Gianna', 4)).toBe(\n      'Gianna, you are the 4th customer we serve today. Thank you!'\n    )\n  })\n\n  xit('format greatest single digit non-exceptional ordinal numeral 9', () => {\n    expect(format('Maarten', 9)).toBe(\n      'Maarten, you are the 9th customer we serve today. Thank you!'\n    )\n  })\n\n  xit('format non-exceptional ordinal numeral 5', () => {\n    expect(format('Petronila', 5)).toBe(\n      'Petronila, you are the 5th customer we serve today. Thank you!'\n    )\n  })\n\n  xit('format non-exceptional ordinal numeral 6', () => {\n    expect(format('Attakullakulla', 6)).toBe(\n      'Attakullakulla, you are the 6th customer we serve today. Thank you!'\n    )\n  })\n\n  xit('format non-exceptional ordinal numeral 7', () => {\n    expect(format('Kate', 7)).toBe(\n      'Kate, you are the 7th customer we serve today. Thank you!'\n    )\n  })\n\n  xit('format non-exceptional ordinal numeral 8', () => {\n    expect(format('Maximiliano', 8)).toBe(\n      'Maximiliano, you are the 8th customer we serve today. Thank you!'\n    )\n  })\n\n  xit('format exceptional ordinal numeral 1', () => {\n    expect(format('Mary', 1)).toBe(\n      'Mary, you are the 1st customer we serve today. Thank you!'\n    )\n  })\n\n  xit('format exceptional ordinal numeral 2', () => {\n    expect(format('Haruto', 2)).toBe(\n      'Haruto, you are the 2nd customer we serve today. Thank you!'\n    )\n  })\n\n  xit('format exceptional ordinal numeral 3', () => {\n    expect(format('Henriette', 3)).toBe(\n      'Henriette, you are the 3rd customer we serve today. Thank you!'\n    )\n  })\n\n  xit('format smallest two digit non-exceptional ordinal numeral 10', () => {\n    expect(format('Alvarez', 10)).toBe(\n      'Alvarez, you are the 10th customer we serve today. Thank you!'\n    )\n  })\n\n  xit('format non-exceptional ordinal numeral 11', () => {\n    expect(format('Jacqueline', 11)).toBe(\n      'Jacqueline, you are the 11th customer we serve today. Thank you!'\n    )\n  })\n\n  xit('format non-exceptional ordinal numeral 12', () => {\n    expect(format('Juan', 12)).toBe(\n      'Juan, you are the 12th customer we serve today. Thank you!'\n    )\n  })\n\n  xit('format non-exceptional ordinal numeral 13', () => {\n    expect(format('Patricia', 13)).toBe(\n      'Patricia, you are the 13th customer we serve today. Thank you!'\n    )\n  })\n\n  xit('format exceptional ordinal numeral 21', () => {\n    expect(format('Washi', 21)).toBe(\n      'Washi, you are the 21st customer we serve today. Thank you!'\n    )\n  })\n\n  xit('format exceptional ordinal numeral 62', () => {\n    expect(format('Nayra', 62)).toBe(\n      'Nayra, you are the 62nd customer we serve today. Thank you!'\n    )\n  })\n\n  xit('format exceptional ordinal numeral 100', () => {\n    expect(format('John', 100)).toBe(\n      'John, you are the 100th customer we serve today. Thank you!'\n    )\n  })\n\n  xit('format exceptional ordinal numeral 101', () => {\n    expect(format('Zeinab', 101)).toBe(\n      'Zeinab, you are the 101st customer we serve today. Thank you!'\n    )\n  })\n\n  xit('format exceptional ordinal numeral 112', () => {\n    expect(format('Knud', 112)).toBe(\n      'Knud, you are the 112th customer we serve today. Thank you!'\n    )\n  })\n\n  xit('format exceptional ordinal numeral 123', () => {\n    expect(format('Yma', 123)).toBe(\n      'Yma, you are the 123rd customer we serve today. Thank you!'\n    )\n  })\n})\n"
  },
  {
    "path": "exercises/practice/line-up/line-up.ts",
    "content": "export function format(name: unknown, number: unknown): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/line-up/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-line-up\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/line-up/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/line-up/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/linked-list/.docs/instructions.md",
    "content": "# Instructions\n\nYour team has decided to use a doubly linked list to represent each train route in the schedule.\nEach station along the train's route will be represented by a node in the linked list.\n\nYou don't need to worry about arrival and departure times at the stations.\nEach station will simply be represented by a number.\n\nRoutes can be extended, adding stations to the beginning or end of a route.\nThey can also be shortened by removing stations from the beginning or the end of a route.\n\nSometimes a station gets closed down, and in that case the station needs to be removed from the route, even if it is not at the beginning or end of the route.\n\nThe size of a route is measured not by how far the train travels, but by how many stations it stops at.\n\n~~~~exercism/note\nThe linked list is a fundamental data structure in computer science, often used in the implementation of other data structures.\nAs the name suggests, it is a list of nodes that are linked together.\nIt is a list of \"nodes\", where each node links to its neighbor or neighbors.\nIn a **singly linked list** each node links only to the node that follows it.\nIn a **doubly linked list** each node links to both the node that comes before, as well as the node that comes after.\n\nIf you want to dig deeper into linked lists, check out [this article][intro-linked-list] that explains it using nice drawings.\n\n[intro-linked-list]: https://medium.com/basecs/whats-a-linked-list-anyway-part-1-d8b7e6508b9d\n~~~~\n"
  },
  {
    "path": "exercises/practice/linked-list/.docs/introduction.md",
    "content": "# Introduction\n\nYou are working on a project to develop a train scheduling system for a busy railway network.\n\nYou've been asked to develop a prototype for the train routes in the scheduling system.\nEach route consists of a sequence of train stations that a given train stops at.\n"
  },
  {
    "path": "exercises/practice/linked-list/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"jspengeman\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"linked-list.ts\"\n    ],\n    \"test\": [\n      \"linked-list.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Implement a doubly linked list.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Classic computer science topic\"\n}\n"
  },
  {
    "path": "exercises/practice/linked-list/.meta/proof.ci.ts",
    "content": "class Node<T> {\n  private value: T\n  private next: Node<T> | undefined\n  private prev: Node<T> | undefined\n\n  constructor(value: T) {\n    this.value = value\n  }\n\n  public getNext(): Node<T> | undefined {\n    return this.next\n  }\n\n  public setNext(newNext: Node<T> | undefined): void {\n    this.next = newNext\n  }\n\n  public getPrev(): Node<T> | undefined {\n    return this.prev\n  }\n\n  public setPrev(newPrev: Node<T> | undefined): void {\n    this.prev = newPrev\n  }\n\n  public getValue(): T {\n    return this.value\n  }\n}\n\nexport class LinkedList<T> {\n  private head: Node<T> | undefined\n  private tail: Node<T> | undefined\n\n  public pop(): T | undefined {\n    if (!this.head) {\n      return undefined\n    }\n\n    const value = this.head.getValue()\n    this.head = this.head.getNext()\n    if (this.head) {\n      this.head.setPrev(undefined)\n    } else {\n      this.head = this.tail = undefined\n    }\n\n    return value\n  }\n\n  public push(value: T): void {\n    if (this.head) {\n      const newHead = new Node<T>(value)\n      newHead.setNext(this.head)\n      this.head.setPrev(newHead)\n      this.head = newHead\n    } else {\n      this.head = new Node<T>(value)\n      this.tail = this.head\n    }\n  }\n\n  public shift(): T | undefined {\n    if (!this.tail) {\n      return undefined\n    }\n\n    const value = this.tail.getValue()\n    this.tail = this.tail.getPrev()\n    if (this.tail) {\n      this.tail.setNext(undefined)\n    } else {\n      this.head = this.tail = undefined\n    }\n\n    return value\n  }\n\n  public unshift(value: T): void {\n    if (this.tail) {\n      const newTail = new Node<T>(value)\n      newTail.setPrev(this.tail)\n      this.tail.setNext(newTail)\n      this.tail = newTail\n    } else {\n      this.tail = new Node<T>(value)\n      this.head = this.tail\n    }\n  }\n\n  public count(): number {\n    let count = 0\n    let element: Node<T> | undefined = this.head\n\n    while (this.head && element) {\n      count++\n      element = element.getNext()\n    }\n    return count\n  }\n\n  public delete(value: T): void {\n    let element = this.head\n    while (element) {\n      if (element.getValue() === value) {\n        const nextNode = element.getNext()\n        const prevNode = element.getPrev()\n\n        if (nextNode) {\n          nextNode.setPrev(prevNode)\n        } else if (this.tail) {\n          this.tail = this.tail.getPrev()\n        }\n\n        if (prevNode) {\n          prevNode.setNext(nextNode)\n        } else if (this.head) {\n          this.head = this.head.getNext()\n        }\n\n        element = undefined\n      } else {\n        element = element.getNext()\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "exercises/practice/linked-list/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/linked-list/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/linked-list/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/linked-list/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/linked-list/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/linked-list/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/linked-list/linked-list.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { LinkedList } from './linked-list.ts'\n\ndescribe('LinkedList', () => {\n  it('add/extract elements to the end of the list with push/pop', () => {\n    const list = new LinkedList<number>()\n    list.push(10)\n    list.push(20)\n    expect(list.pop()).toBe(20)\n    expect(list.pop()).toBe(10)\n  })\n\n  xit('extract elements from the beginning of the list with shift', () => {\n    const list = new LinkedList<number>()\n    list.push(10)\n    list.push(20)\n    expect(list.shift()).toBe(10)\n    expect(list.shift()).toBe(20)\n  })\n\n  xit('add/extract elements from the beginning of the list with unshift/shift', () => {\n    const list = new LinkedList<number>()\n    list.unshift(10)\n    list.unshift(20)\n    expect(list.shift()).toBe(20)\n    expect(list.shift()).toBe(10)\n  })\n\n  xit('unshift/pop', () => {\n    const list = new LinkedList<number>()\n    list.unshift(10)\n    list.unshift(20)\n    expect(list.pop()).toBe(10)\n    expect(list.pop()).toBe(20)\n  })\n\n  xit('example', () => {\n    const list = new LinkedList<number>()\n    list.push(10)\n    list.push(20)\n    expect(list.pop()).toBe(20)\n    list.push(30)\n    expect(list.shift()).toBe(10)\n    list.unshift(40)\n    list.push(50)\n    expect(list.shift()).toBe(40)\n    expect(list.pop()).toBe(50)\n    expect(list.shift()).toBe(30)\n  })\n\n  xit('can count its elements', () => {\n    const list = new LinkedList<number>()\n    expect(list.count()).toBe(0)\n    list.push(10)\n    expect(list.count()).toBe(1)\n    list.push(20)\n    expect(list.count()).toBe(2)\n  })\n\n  xit('sets head/tail after popping last element', () => {\n    const list = new LinkedList<number>()\n    list.push(10)\n    list.pop()\n    list.unshift(20)\n    expect(list.count()).toBe(1)\n    expect(list.pop()).toBe(20)\n  })\n\n  xit('sets head/tail after shifting last element', () => {\n    const list = new LinkedList<number>()\n    list.unshift(10)\n    list.shift()\n    list.push(20)\n    expect(list.count()).toBe(1)\n    expect(list.shift()).toBe(20)\n  })\n\n  xit('deletes the element with the specified value from the list', () => {\n    const list = new LinkedList<number>()\n    list.push(10)\n    list.push(20)\n    list.push(30)\n    list.delete(20)\n    expect(list.count()).toBe(2)\n    expect(list.pop()).toBe(30)\n    expect(list.shift()).toBe(10)\n  })\n\n  xit('deletes the only element', () => {\n    const list = new LinkedList<number>()\n    list.push(10)\n    list.delete(10)\n    expect(list.count()).toBe(0)\n  })\n\n  xit('delete does not modify the list if the element is not found', () => {\n    const list = new LinkedList<number>()\n    list.push(10)\n    list.delete(20)\n    expect(list.count()).toBe(1)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/linked-list/linked-list.ts",
    "content": "export class LinkedList<TElement> {\n  public push(element: unknown) {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public pop(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public shift(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public unshift(element: unknown) {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public delete(element: unknown) {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public count(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/linked-list/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-linked-list\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/linked-list/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/linked-list/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/list-ops/.docs/instructions.append.md",
    "content": "# Instructions append\n\nUsing core language features to build and deconstruct arrays via destructuring, and using the array literal `[]` are allowed, but no functions from the `Array.prototype` should be used.\n\nIn order to be able to test your solution, ensure `forEach` is implemented.\n\n```typescript\nconst list = List.create(1, 2)\nlist.forEach((item) => console.log(item))\n// =>\n//    1\n//    2\n```\n"
  },
  {
    "path": "exercises/practice/list-ops/.docs/instructions.md",
    "content": "# Instructions\n\nImplement basic list operations.\n\nIn functional languages list operations like `length`, `map`, and `reduce` are very common.\nImplement a series of basic list operations, without using existing functions.\n\nThe precise number and names of the operations to be implemented will be track dependent to avoid conflicts with existing names, but the general operations you will implement include:\n\n- `append` (_given two lists, add all items in the second list to the end of the first list_);\n- `concatenate` (_given a series of lists, combine all items in all lists into one flattened list_);\n- `filter` (_given a predicate and a list, return the list of all items for which `predicate(item)` is True_);\n- `length` (_given a list, return the total number of items within it_);\n- `map` (_given a function and a list, return the list of the results of applying `function(item)` on all items_);\n- `foldl` (_given a function, a list, and initial accumulator, fold (reduce) each item into the accumulator from the left_);\n- `foldr` (_given a function, a list, and an initial accumulator, fold (reduce) each item into the accumulator from the right_);\n- `reverse` (_given a list, return a list with all the original items, but in reversed order_).\n\nNote, the ordering in which arguments are passed to the fold functions (`foldl`, `foldr`) is significant.\n"
  },
  {
    "path": "exercises/practice/list-ops/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"archanid\",\n    \"masters3d\",\n    \"paparomeo\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"list-ops.ts\"\n    ],\n    \"test\": [\n      \"list-ops.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Implement basic list operations.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  }\n}\n"
  },
  {
    "path": "exercises/practice/list-ops/.meta/proof.ci.ts",
    "content": "const Null: Cons<undefined> = {\n  get value() {\n    return undefined\n  },\n  get next() {\n    return this\n  },\n\n  get() {\n    return this.value\n  },\n\n  push<T>(item: T): Cons<T> {\n    // eslint-disable-next-line @typescript-eslint/no-use-before-define\n    return new Cons(item, this) as Cons<T>\n  },\n  length() {\n    return 0\n  },\n  append<T>(other: Cons<T>): Cons<T> {\n    return other\n  },\n  concatenate(): Cons<undefined> {\n    return this\n  },\n  forEach(): void {\n    /* done */\n  },\n  foldl<TValue = unknown, TReturn = unknown>(\n    _: (initial: TReturn, value: TValue) => TReturn,\n    initial?: TReturn\n  ): TReturn {\n    return initial as TReturn\n  },\n  foldr<TValue = unknown, TReturn = unknown>(\n    _: (initial: TReturn, value: TValue) => TReturn,\n    initial?: TReturn\n  ): TReturn {\n    return initial as TReturn\n  },\n  filter(): Cons<undefined> {\n    return Null\n  },\n  reverse(): Cons<undefined> {\n    return this\n  },\n  map<TReturn>(): Cons<TReturn> {\n    return this as Cons<TReturn>\n  },\n}\nclass Cons<T> {\n  constructor(\n    public readonly value: T,\n    public next: Cons<T> = Null as Cons<T>\n  ) {}\n\n  public get(i: number): T | undefined {\n    return i === 0 ? this.value : this.next.get(i - 1)\n  }\n\n  public push(item: T): this {\n    this.next = this.next.push(item)\n    return this\n  }\n\n  public length(): number {\n    return 1 + this.next.length()\n  }\n\n  public append(other: Cons<T>): Cons<T> {\n    return other.foldl((result, item) => result.push(item), this)\n  }\n\n  public concatenate(others: Cons<Cons<T>>): Cons<T> {\n    return others.foldl<Cons<T>>((result, other) => result.append(other), this)\n  }\n\n  public foldl<TReturn = unknown>(\n    callback: (initial: TReturn, value: T) => TReturn\n  ): TReturn\n  public foldl<TReturn = unknown>(\n    callback: (initial: TReturn, value: T) => TReturn,\n    initial: TReturn\n  ): TReturn\n  public foldl<TReturn = unknown>(\n    callback: (initial: TReturn | undefined, value: T) => TReturn,\n    initial?: TReturn\n  ): TReturn {\n    return this.next.foldl<TReturn>(callback, callback(initial, this.value))\n  }\n\n  public forEach(callback: (value: T) => void): void {\n    this.foldl((_, item) => callback(item))\n  }\n\n  public foldr<TReturn = unknown>(\n    callback: (initial: TReturn, value: T) => TReturn\n  ): TReturn\n  public foldr<TReturn = unknown>(\n    callback: (initial: TReturn, value: T) => TReturn,\n    initial: TReturn\n  ): TReturn\n  public foldr<TReturn = unknown>(\n    callback: (initial: TReturn, value: T) => TReturn,\n    initial?: TReturn\n  ): TReturn {\n    return callback(\n      this.next.foldr<TReturn>(\n        callback as (initial: TReturn, value: T | undefined) => TReturn,\n        initial as TReturn\n      ),\n      this.value\n    )\n  }\n\n  public filter(predicate: (value: T) => boolean): Cons<T> {\n    return this.foldl<Cons<T>>(\n      (result, item) => (predicate(item) && result.push(item)) || result,\n      Null as Cons<T>\n    )\n  }\n\n  public map<TReturn = unknown>(\n    expression: (value: T) => TReturn\n  ): Cons<TReturn> {\n    return this.foldl(\n      (result, item) => result.push(expression(item)),\n      Null as Cons<TReturn>\n    )\n  }\n\n  public reverse(): Cons<T> {\n    return this.next.reverse().push(this.value)\n  }\n}\nexport class List {\n  public static create<T>(...values: T[]): Cons<T> {\n    const [head, ...tail] = values\n\n    if (head === undefined) {\n      return Null as Cons<T>\n    }\n\n    return new Cons(head, List.create(...tail))\n  }\n}\n"
  },
  {
    "path": "exercises/practice/list-ops/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[485b9452-bf94-40f7-a3db-c3cf4850066a]\ndescription = \"append entries to a list and return the new list -> empty lists\"\n\n[2c894696-b609-4569-b149-8672134d340a]\ndescription = \"append entries to a list and return the new list -> list to empty list\"\n\n[e842efed-3bf6-4295-b371-4d67a4fdf19c]\ndescription = \"append entries to a list and return the new list -> empty list to list\"\n\n[71dcf5eb-73ae-4a0e-b744-a52ee387922f]\ndescription = \"append entries to a list and return the new list -> non-empty lists\"\n\n[28444355-201b-4af2-a2f6-5550227bde21]\ndescription = \"concatenate a list of lists -> empty list\"\n\n[331451c1-9573-42a1-9869-2d06e3b389a9]\ndescription = \"concatenate a list of lists -> list of lists\"\n\n[d6ecd72c-197f-40c3-89a4-aa1f45827e09]\ndescription = \"concatenate a list of lists -> list of nested lists\"\n\n[0524fba8-3e0f-4531-ad2b-f7a43da86a16]\ndescription = \"filter list returning only values that satisfy the filter function -> empty list\"\n\n[88494bd5-f520-4edb-8631-88e415b62d24]\ndescription = \"filter list returning only values that satisfy the filter function -> non-empty list\"\n\n[1cf0b92d-8d96-41d5-9c21-7b3c37cb6aad]\ndescription = \"returns the length of a list -> empty list\"\n\n[d7b8d2d9-2d16-44c4-9a19-6e5f237cb71e]\ndescription = \"returns the length of a list -> non-empty list\"\n\n[c0bc8962-30e2-4bec-9ae4-668b8ecd75aa]\ndescription = \"return a list of elements whose values equal the list value transformed by the mapping function -> empty list\"\n\n[11e71a95-e78b-4909-b8e4-60cdcaec0e91]\ndescription = \"return a list of elements whose values equal the list value transformed by the mapping function -> non-empty list\"\n\n[613b20b7-1873-4070-a3a6-70ae5f50d7cc]\ndescription = \"folds (reduces) the given list from the left with a function -> empty list\"\ninclude = false\n\n[e56df3eb-9405-416a-b13a-aabb4c3b5194]\ndescription = \"folds (reduces) the given list from the left with a function -> direction independent function applied to non-empty list\"\ninclude = false\n\n[d2cf5644-aee1-4dfc-9b88-06896676fe27]\ndescription = \"folds (reduces) the given list from the left with a function -> direction dependent function applied to non-empty list\"\ninclude = false\n\n[36549237-f765-4a4c-bfd9-5d3a8f7b07d2]\ndescription = \"folds (reduces) the given list from the left with a function -> empty list\"\nreimplements = \"613b20b7-1873-4070-a3a6-70ae5f50d7cc\"\n\n[7a626a3c-03ec-42bc-9840-53f280e13067]\ndescription = \"folds (reduces) the given list from the left with a function -> direction independent function applied to non-empty list\"\nreimplements = \"e56df3eb-9405-416a-b13a-aabb4c3b5194\"\n\n[d7fcad99-e88e-40e1-a539-4c519681f390]\ndescription = \"folds (reduces) the given list from the left with a function -> direction dependent function applied to non-empty list\"\nreimplements = \"d2cf5644-aee1-4dfc-9b88-06896676fe27\"\n\n[aeb576b9-118e-4a57-a451-db49fac20fdc]\ndescription = \"folds (reduces) the given list from the right with a function -> empty list\"\ninclude = false\n\n[c4b64e58-313e-4c47-9c68-7764964efb8e]\ndescription = \"folds (reduces) the given list from the right with a function -> direction independent function applied to non-empty list\"\ninclude = false\n\n[be396a53-c074-4db3-8dd6-f7ed003cce7c]\ndescription = \"folds (reduces) the given list from the right with a function -> direction dependent function applied to non-empty list\"\ninclude = false\n\n[17214edb-20ba-42fc-bda8-000a5ab525b0]\ndescription = \"folds (reduces) the given list from the right with a function -> empty list\"\nreimplements = \"aeb576b9-118e-4a57-a451-db49fac20fdc\"\n\n[e1c64db7-9253-4a3d-a7c4-5273b9e2a1bd]\ndescription = \"folds (reduces) the given list from the right with a function -> direction independent function applied to non-empty list\"\nreimplements = \"c4b64e58-313e-4c47-9c68-7764964efb8e\"\n\n[8066003b-f2ff-437e-9103-66e6df474844]\ndescription = \"folds (reduces) the given list from the right with a function -> direction dependent function applied to non-empty list\"\nreimplements = \"be396a53-c074-4db3-8dd6-f7ed003cce7c\"\n\n[94231515-050e-4841-943d-d4488ab4ee30]\ndescription = \"reverse the elements of the list -> empty list\"\n\n[fcc03d1e-42e0-4712-b689-d54ad761f360]\ndescription = \"reverse the elements of the list -> non-empty list\"\n\n[40872990-b5b8-4cb8-9085-d91fc0d05d26]\ndescription = \"reverse the elements of the list -> list of lists is not flattened\"\n"
  },
  {
    "path": "exercises/practice/list-ops/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/list-ops/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/list-ops/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/list-ops/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/list-ops/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/list-ops/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/list-ops/list-ops.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { List } from './list-ops.ts'\nimport type { MatcherFunction } from 'expect'\n\ntype JestUtils = {\n  utils: {\n    printReceived(object: unknown): string\n  }\n}\n\nconst toHaveValues: MatcherFunction<unknown[]> = function (\n  this: JestUtils,\n  received: unknown,\n  ...expected: unknown[]\n) {\n  if (typeof received !== 'object' || received === null) {\n    return {\n      pass: false,\n      message: () =>\n        `Expected ${this.utils.printReceived(received)} to be a non-null object`,\n    }\n  }\n\n  if (!('forEach' in received) || typeof received.forEach !== 'function') {\n    return {\n      pass: false,\n      message: (): string => `Implement .forEach(callback) on your list`,\n    }\n  }\n\n  const values: unknown[] = []\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n  received.forEach((item: unknown) => {\n    values.push(item)\n  })\n\n  const pass = JSON.stringify(values) === JSON.stringify(expected)\n  return {\n    pass,\n    message: (): string =>\n      pass\n        ? ''\n        : `Expected to see the following values: ${JSON.stringify(\n            expected\n          )}, actual: ${JSON.stringify(values)}`,\n  }\n}\n\nexpect.extend({\n  toHaveValues,\n})\n\ndeclare module 'expect' {\n  interface AsymmetricMatchers {\n    toHaveValues(...expected: unknown[]): void\n  }\n  interface Matchers<R> {\n    toHaveValues(...expected: unknown[]): R\n  }\n}\n\ndescribe('append entries to a list and return the new list', () => {\n  it('empty lists', () => {\n    const list1 = List.create()\n    const list2 = List.create()\n    expect(list1.append(list2)).toEqual(List.create())\n  })\n\n  xit('list to empty list', () => {\n    const list1 = List.create<number>()\n    const list2 = List.create(1, 2, 3, 4)\n    expect(list1.append(list2)).toEqual(list2)\n  })\n\n  xit('empty list to list', () => {\n    const list1 = List.create(1, 2, 3, 4)\n    const list2 = List.create<number>()\n    expect(list1.append(list2)).toEqual(list1)\n  })\n\n  xit('non-empty lists', () => {\n    const list1 = List.create(1, 2)\n    const list2 = List.create(2, 3, 4, 5)\n    expect(list1.append(list2)).toHaveValues(1, 2, 2, 3, 4, 5)\n  })\n})\n\ndescribe('concatenate lists and lists of lists into new list', () => {\n  xit('empty list', () => {\n    const list1 = List.create()\n    const list2 = List.create<ReturnType<typeof List.create>>()\n    expect(list1.concatenate(list2)).toHaveValues()\n  })\n\n  xit('list of lists', () => {\n    const list1 = List.create(1, 2)\n    const list2 = List.create(3)\n    const list3 = List.create<number>()\n    const list4 = List.create(4, 5, 6)\n    const listOfLists = List.create(list2, list3, list4)\n    expect(list1.concatenate(listOfLists)).toHaveValues(1, 2, 3, 4, 5, 6)\n  })\n})\n\ndescribe('filter list returning only values that satisfy the filter function', () => {\n  xit('empty list', () => {\n    const list1 = List.create<number>()\n    expect(list1.filter((el) => el % 2 === 1)).toHaveValues()\n  })\n\n  xit('non empty list', () => {\n    const list1 = List.create(1, 2, 3, 5)\n    expect(list1.filter((el) => el % 2 === 1)).toHaveValues(1, 3, 5)\n  })\n})\n\ndescribe('returns the length of a list', () => {\n  xit('empty list', () => {\n    const list1 = List.create()\n    expect(list1.length()).toEqual(0)\n  })\n\n  xit('non-empty list', () => {\n    const list1 = List.create(1, 2, 3, 4)\n    expect(list1.length()).toEqual(4)\n  })\n})\n\ndescribe('returns a list of elements whose values equal the list value transformed by the mapping function', () => {\n  xit('empty list', () => {\n    const list1 = List.create<number>()\n    expect(list1.map((el) => ++el)).toHaveValues()\n  })\n\n  xit('non-empty list', () => {\n    const list1 = List.create(1, 3, 5, 7)\n    expect(list1.map((el) => ++el)).toHaveValues(2, 4, 6, 8)\n  })\n})\n\ndescribe('folds (reduces) the given list from the left with a function', () => {\n  xit('empty list', () => {\n    const list1 = List.create<number>()\n    expect(list1.foldl((acc, el) => el * acc, 2)).toEqual(2)\n  })\n\n  xit('direction independent function applied to non-empty list', () => {\n    const list1 = List.create(1, 2, 3, 4)\n    expect(list1.foldl((acc, el) => acc + el, 5)).toEqual(15)\n  })\n\n  xit('direction dependent function applied to non-empty list', () => {\n    const list1 = List.create(1, 2, 3, 4)\n    expect(list1.foldl((acc, el) => el / acc, 24)).toEqual(64)\n  })\n})\n\ndescribe('folds (reduces) the given list from the right with a function', () => {\n  xit('empty list', () => {\n    const list1 = List.create<number>()\n    expect(list1.foldr((acc, el) => el * acc, 2)).toEqual(2)\n  })\n\n  xit('direction independent function applied to non-empty list', () => {\n    const list1 = List.create(1, 2, 3, 4)\n    expect(list1.foldr((acc, el) => acc + el, 5)).toEqual(15)\n  })\n\n  xit('direction dependent function applied to non-empty list', () => {\n    const list1 = List.create(1, 2, 3, 4)\n    expect(list1.foldr((acc, el) => el / acc, 24)).toEqual(9)\n  })\n})\n\ndescribe('reverse the elements of a list', () => {\n  xit('empty list', () => {\n    const list1 = List.create()\n    expect(list1.reverse()).toHaveValues()\n  })\n\n  xit('non-empty list', () => {\n    const list1 = List.create(1, 3, 5, 7)\n    expect(list1.reverse()).toHaveValues(7, 5, 3, 1)\n  })\n\n  xit('list of lists is not flattened', () => {\n    const list1 = List.create([1, 2], [3], [], [4, 5, 6])\n    expect(list1.reverse()).toHaveValues([4, 5, 6], [], [3], [1, 2])\n  })\n})\n"
  },
  {
    "path": "exercises/practice/list-ops/list-ops.ts",
    "content": "export class List {\n  public static create(...values: unknown[]): unknown {\n    // Do *not* construct any array literal ([]) in your solution.\n    // Do *not* construct any arrays through new Array in your solution.\n    // DO *not* use any of the Array.prototype methods in your solution.\n\n    // You may use the destructuring and spreading (...) syntax from Iterable.\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/list-ops/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-list-ops\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/list-ops/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/list-ops/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/luhn/.docs/instructions.md",
    "content": "# Instructions\n\nDetermine whether a number is valid according to the [Luhn formula][luhn].\n\nThe number will be provided as a string.\n\n## Validating a number\n\nStrings of length 1 or less are not valid.\nSpaces are allowed in the input, but they should be stripped before checking.\nAll other non-digit characters are disallowed.\n\n## Examples\n\n### Valid credit card number\n\nThe number to be checked is `4539 3195 0343 6467`.\n\nThe first step of the Luhn algorithm is to start at the end of the number and double every second digit, beginning with the second digit from the right and moving left.\n\n```text\n4539 3195 0343 6467\n↑ ↑  ↑ ↑  ↑ ↑  ↑ ↑  (double these)\n```\n\nIf the result of doubling a digit is greater than 9, we subtract 9 from that result.\nWe end up with:\n\n```text\n8569 6195 0383 3437\n```\n\nFinally, we sum all digits.\nIf the sum is evenly divisible by 10, the original number is valid.\n\n```text\n8 + 5 + 6 + 9 + 6 + 1 + 9 + 5 + 0 + 3 + 8 + 3 + 3 + 4 + 3 + 7 = 80\n```\n\n80 is evenly divisible by 10, so number `4539 3195 0343 6467` is valid!\n\n### Invalid Canadian SIN\n\nThe number to be checked is `066 123 478`.\n\nWe start at the end of the number and double every second digit, beginning with the second digit from the right and moving left.\n\n```text\n066 123 478\n ↑  ↑ ↑  ↑  (double these)\n```\n\nIf the result of doubling a digit is greater than 9, we subtract 9 from that result.\nWe end up with:\n\n```text\n036 226 458\n```\n\nWe sum the digits:\n\n```text\n0 + 3 + 6 + 2 + 2 + 6 + 4 + 5 + 8 = 36\n```\n\n36 is not evenly divisible by 10, so number `066 123 478` is not valid!\n\n[luhn]: https://en.wikipedia.org/wiki/Luhn_algorithm\n"
  },
  {
    "path": "exercises/practice/luhn/.docs/introduction.md",
    "content": "# Introduction\n\nAt the Global Verification Authority, you've just been entrusted with a critical assignment.\nAcross the city, from online purchases to secure logins, countless operations rely on the accuracy of numerical identifiers like credit card numbers, bank account numbers, transaction codes, and tracking IDs.\nThe Luhn algorithm is a simple checksum formula used to help identify mistyped numbers.\n\nA batch of identifiers has just arrived on your desk.\nAll of them must pass the Luhn test to ensure they're legitimate.\nIf any fail, they'll be flagged as invalid, preventing mistakes such as incorrect transactions or failed account verifications.\n\nCan you ensure this is done right? The integrity of many services depends on you.\n"
  },
  {
    "path": "exercises/practice/luhn/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\",\n    \"angelikatyborska\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"luhn.ts\"\n    ],\n    \"test\": [\n      \"luhn.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given a number determine whether or not it is valid per the Luhn formula.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"The Luhn Algorithm on Wikipedia\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/Luhn_algorithm\"\n}\n"
  },
  {
    "path": "exercises/practice/luhn/.meta/proof.ci.ts",
    "content": "export function valid(value: string): boolean {\n  const valueWithoutSpaces = value.replace(/\\s/g, '')\n  const digits = [...valueWithoutSpaces]\n\n  const sum = digits\n    // convert to integers\n    .map((d) => parseInt(d, 10))\n    .reverse()\n    // double even positions (odd indexes)\n    .map((d, i) => {\n      if (i % 2 !== 0) {\n        return d * 2\n      }\n      return d\n    })\n    // limit to digits less than 10\n    .map((d) => {\n      if (d > 9) {\n        return d - 9\n      }\n      return d\n    })\n    // sum all digits\n    .reduce((d, acc) => d + acc, 0)\n\n  return valueWithoutSpaces.length > 1 && sum % 10 === 0\n}\n"
  },
  {
    "path": "exercises/practice/luhn/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[792a7082-feb7-48c7-b88b-bbfec160865e]\ndescription = \"single digit strings can not be valid\"\n\n[698a7924-64d4-4d89-8daa-32e1aadc271e]\ndescription = \"a single zero is invalid\"\n\n[73c2f62b-9b10-4c9f-9a04-83cee7367965]\ndescription = \"a simple valid SIN that remains valid if reversed\"\n\n[9369092e-b095-439f-948d-498bd076be11]\ndescription = \"a simple valid SIN that becomes invalid if reversed\"\n\n[8f9f2350-1faf-4008-ba84-85cbb93ffeca]\ndescription = \"a valid Canadian SIN\"\n\n[1cdcf269-6560-44fc-91f6-5819a7548737]\ndescription = \"invalid Canadian SIN\"\n\n[656c48c1-34e8-4e60-9a5a-aad8a367810a]\ndescription = \"invalid credit card\"\n\n[20e67fad-2121-43ed-99a8-14b5b856adb9]\ndescription = \"invalid long number with an even remainder\"\n\n[7e7c9fc1-d994-457c-811e-d390d52fba5e]\ndescription = \"invalid long number with a remainder divisible by 5\"\n\n[ad2a0c5f-84ed-4e5b-95da-6011d6f4f0aa]\ndescription = \"valid number with an even number of digits\"\n\n[ef081c06-a41f-4761-8492-385e13c8202d]\ndescription = \"valid number with an odd number of spaces\"\n\n[bef66f64-6100-4cbb-8f94-4c9713c5e5b2]\ndescription = \"valid strings with a non-digit added at the end become invalid\"\n\n[2177e225-9ce7-40f6-b55d-fa420e62938e]\ndescription = \"valid strings with punctuation included become invalid\"\n\n[ebf04f27-9698-45e1-9afe-7e0851d0fe8d]\ndescription = \"valid strings with symbols included become invalid\"\n\n[08195c5e-ce7f-422c-a5eb-3e45fece68ba]\ndescription = \"single zero with space is invalid\"\n\n[12e63a3c-f866-4a79-8c14-b359fc386091]\ndescription = \"more than a single zero is valid\"\n\n[ab56fa80-5de8-4735-8a4a-14dae588663e]\ndescription = \"input digit 9 is correctly converted to output digit 9\"\n\n[b9887ee8-8337-46c5-bc45-3bcab51bc36f]\ndescription = \"very long input is valid\"\n\n[8a7c0e24-85ea-4154-9cf1-c2db90eabc08]\ndescription = \"valid luhn with an odd number of digits and non zero first digit\"\n\n[39a06a5a-5bad-4e0f-b215-b042d46209b1]\ndescription = \"using ascii value for non-doubled non-digit isn't allowed\"\n\n[f94cf191-a62f-4868-bc72-7253114aa157]\ndescription = \"using ascii value for doubled non-digit isn't allowed\"\n\n[8b72ad26-c8be-49a2-b99c-bcc3bf631b33]\ndescription = \"non-numeric, non-space char in the middle with a sum that's divisible by 10 isn't allowed\"\n"
  },
  {
    "path": "exercises/practice/luhn/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/luhn/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/luhn/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/luhn/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/luhn/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/luhn/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/luhn/luhn.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { valid } from './luhn.ts'\n\ndescribe('Luhn', () => {\n  it('single digit strings can not be valid', () => {\n    expect(valid('1')).toBeFalsy()\n  })\n\n  xit('a single zero is invalid', () => {\n    expect(valid('0')).toBeFalsy()\n  })\n\n  xit('a simple valid SIN that remains valid if reversed', () => {\n    expect(valid('059')).toBeTruthy()\n  })\n\n  xit('a simple valid SIN that becomes invalid if reversed', () => {\n    expect(valid('59')).toBeTruthy()\n  })\n\n  xit('a valid Canadian SIN', () => {\n    expect(valid('055 444 285')).toBeTruthy()\n  })\n\n  xit('invalid Canadian SIN', () => {\n    expect(valid('055 444 286')).toBeFalsy()\n  })\n\n  xit('invalid credit card', () => {\n    expect(valid('8273 1232 7352 0569')).toBeFalsy()\n  })\n\n  xit('invalid long number with an even remainder', () => {\n    expect(valid('1 2345 6789 1234 5678 9012')).toBeFalsy()\n  })\n\n  xit('invalid long number with a remainder divisible by 5', () => {\n    expect(valid('1 2345 6789 1234 5678 9013')).toBeFalsy()\n  })\n\n  xit('valid number with an even number of digits', () => {\n    expect(valid('095 245 88')).toBeTruthy()\n  })\n\n  xit('valid number with an odd number of spaces', () => {\n    expect(valid('234 567 891 234')).toBeTruthy()\n  })\n\n  xit('valid strings with a non-digit added at the end become invalid', () => {\n    expect(valid('059a')).toBeFalsy()\n  })\n\n  xit('valid strings with punctuation included become invalid', () => {\n    expect(valid('055-444-285')).toBeFalsy()\n  })\n\n  xit('valid strings with symbols included become invalid', () => {\n    expect(valid('055# 444$ 285')).toBeFalsy()\n  })\n\n  xit('single zero with space is invalid', () => {\n    expect(valid(' 0')).toBeFalsy()\n  })\n\n  xit('more than a single zero is valid', () => {\n    expect(valid('0000 0')).toBeTruthy()\n  })\n\n  xit('input digit 9 is correctly converted to output digit 9', () => {\n    expect(valid('091')).toBeTruthy()\n  })\n\n  xit('very long input is valid', () => {\n    expect(valid('9999999999 9999999999 9999999999 9999999999')).toBeTruthy()\n  })\n\n  xit('valid luhn with an odd number of digits and non zero first digit', () => {\n    expect(valid('109')).toBeTruthy()\n  })\n\n  xit(\"using ascii value for non-doubled non-digit isn't allowed\", () => {\n    expect(valid('055b 444 285')).toBeFalsy()\n  })\n\n  xit(\"using ascii value for doubled non-digit isn't allowed\", () => {\n    expect(valid(':9')).toBeFalsy()\n  })\n\n  xit(\"non-numeric, non-space char in the middle with a sum that's divisible by 10 isn't allowed\", () => {\n    expect(valid('59%59')).toBeFalsy()\n  })\n})\n"
  },
  {
    "path": "exercises/practice/luhn/luhn.ts",
    "content": "export function valid(digitString: unknown): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/luhn/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-luhn\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/luhn/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/luhn/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/matching-brackets/.docs/instructions.md",
    "content": "# Instructions\n\nGiven a string containing brackets `[]`, braces `{}`, parentheses `()`, or any combination thereof, verify that any and all pairs are matched and nested correctly.\nAny other characters should be ignored.\nFor example, `\"{what is (42)}?\"` is balanced and `\"[text}\"` is not.\n"
  },
  {
    "path": "exercises/practice/matching-brackets/.docs/introduction.md",
    "content": "# Introduction\n\nYou're given the opportunity to write software for the Bracketeer™, an ancient but powerful mainframe.\nThe software that runs on it is written in a proprietary language.\nMuch of its syntax is familiar, but you notice _lots_ of brackets, braces and parentheses.\nDespite the Bracketeer™ being powerful, it lacks flexibility.\nIf the source code has any unbalanced brackets, braces or parentheses, the Bracketeer™ crashes and must be rebooted.\nTo avoid such a scenario, you start writing code that can verify that brackets, braces, and parentheses are balanced before attempting to run it on the Bracketeer™.\n"
  },
  {
    "path": "exercises/practice/matching-brackets/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"matching-brackets.ts\"\n    ],\n    \"test\": [\n      \"matching-brackets.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Make sure the brackets and braces all match.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Ginna Baker\"\n}\n"
  },
  {
    "path": "exercises/practice/matching-brackets/.meta/proof.ci.ts",
    "content": "type LeftBracket = '(' | '[' | '{'\ntype RightBracket = ')' | ']' | '}'\ntype AnyBracket = LeftBracket | RightBracket\n\nfunction bracketsAreMatching(\n  leftBracket: AnyBracket,\n  rightBracket: AnyBracket\n): boolean {\n  return (\n    (leftBracket === '(' && rightBracket === ')') ||\n    (leftBracket === '[' && rightBracket === ']') ||\n    (leftBracket === '{' && rightBracket === '}')\n  )\n}\n\nexport function isPaired(input: string): boolean {\n  const brackets = input.replace(/[^{([\\])}]/g, '')\n\n  const openBrackets: AnyBracket[] = []\n\n  for (const letter of brackets) {\n    const bracket = letter as AnyBracket\n    if (openBrackets.length >= 1) {\n      const lastBracket = openBrackets[openBrackets.length - 1]\n      if (bracketsAreMatching(lastBracket, bracket)) {\n        openBrackets.pop()\n      } else {\n        openBrackets.push(bracket)\n      }\n    } else {\n      openBrackets.push(bracket)\n    }\n  }\n  return openBrackets.length === 0\n}\n"
  },
  {
    "path": "exercises/practice/matching-brackets/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[81ec11da-38dd-442a-bcf9-3de7754609a5]\ndescription = \"paired square brackets\"\n\n[287f0167-ac60-4b64-8452-a0aa8f4e5238]\ndescription = \"empty string\"\n\n[6c3615a3-df01-4130-a731-8ef5f5d78dac]\ndescription = \"unpaired brackets\"\n\n[9d414171-9b98-4cac-a4e5-941039a97a77]\ndescription = \"wrong ordered brackets\"\n\n[f0f97c94-a149-4736-bc61-f2c5148ffb85]\ndescription = \"wrong closing bracket\"\n\n[754468e0-4696-4582-a30e-534d47d69756]\ndescription = \"paired with whitespace\"\n\n[ba84f6ee-8164-434a-9c3e-b02c7f8e8545]\ndescription = \"partially paired brackets\"\n\n[3c86c897-5ff3-4a2b-ad9b-47ac3a30651d]\ndescription = \"simple nested brackets\"\n\n[2d137f2c-a19e-4993-9830-83967a2d4726]\ndescription = \"several paired brackets\"\n\n[2e1f7b56-c137-4c92-9781-958638885a44]\ndescription = \"paired and nested brackets\"\n\n[84f6233b-e0f7-4077-8966-8085d295c19b]\ndescription = \"unopened closing brackets\"\n\n[9b18c67d-7595-4982-b2c5-4cb949745d49]\ndescription = \"unpaired and nested brackets\"\n\n[a0205e34-c2ac-49e6-a88a-899508d7d68e]\ndescription = \"paired and wrong nested brackets\"\n\n[1d5c093f-fc84-41fb-8c2a-e052f9581602]\ndescription = \"paired and wrong nested brackets but innermost are correct\"\n\n[ef47c21b-bcfd-4998-844c-7ad5daad90a8]\ndescription = \"paired and incomplete brackets\"\n\n[a4675a40-a8be-4fc2-bc47-2a282ce6edbe]\ndescription = \"too many closing brackets\"\n\n[a345a753-d889-4b7e-99ae-34ac85910d1a]\ndescription = \"early unexpected brackets\"\n\n[21f81d61-1608-465a-b850-baa44c5def83]\ndescription = \"early mismatched brackets\"\n\n[99255f93-261b-4435-a352-02bdecc9bdf2]\ndescription = \"math expression\"\n\n[8e357d79-f302-469a-8515-2561877256a1]\ndescription = \"complex latex expression\"\n"
  },
  {
    "path": "exercises/practice/matching-brackets/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/matching-brackets/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/matching-brackets/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/matching-brackets/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/matching-brackets/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/matching-brackets/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/matching-brackets/matching-brackets.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { isPaired } from './matching-brackets.ts'\n\ndescribe('Matching Brackets', () => {\n  it('paired square brackets', () => {\n    expect(isPaired('[]')).toEqual(true)\n  })\n\n  xit('empty string', () => {\n    expect(isPaired('')).toEqual(true)\n  })\n\n  xit('unpaired brackets', () => {\n    expect(isPaired('[[')).toEqual(false)\n  })\n\n  xit('wrong ordered brackets', () => {\n    expect(isPaired('}{')).toEqual(false)\n  })\n\n  xit('wrong closing bracket', () => {\n    expect(isPaired('{]')).toEqual(false)\n  })\n\n  xit('paired with whitespace', () => {\n    expect(isPaired('{ }')).toEqual(true)\n  })\n\n  xit('partially paired brackets', () => {\n    expect(isPaired('{[])')).toEqual(false)\n  })\n\n  xit('simple nested brackets', () => {\n    expect(isPaired('{[]}')).toEqual(true)\n  })\n\n  xit('several paired brackets', () => {\n    expect(isPaired('{}[]')).toEqual(true)\n  })\n\n  xit('paired and nested brackets', () => {\n    expect(isPaired('([{}({}[])])')).toEqual(true)\n  })\n\n  xit('unopened closing brackets', () => {\n    expect(isPaired('{[)][]}')).toEqual(false)\n  })\n\n  xit('unpaired and nested brackets', () => {\n    expect(isPaired('([{])')).toEqual(false)\n  })\n\n  xit('paired and wrong nested brackets', () => {\n    expect(isPaired('[({]})')).toEqual(false)\n  })\n\n  xit('paired and wrong nested brackets but innermost are correct', () => {\n    expect(isPaired('[({}])')).toEqual(false)\n  })\n\n  xit('paired and incomplete brackets', () => {\n    expect(isPaired('{}[')).toEqual(false)\n  })\n\n  xit('too many closing brackets', () => {\n    expect(isPaired('[]]')).toEqual(false)\n  })\n\n  xit('early unexpected brackets', () => {\n    expect(isPaired(')()')).toEqual(false)\n  })\n\n  xit('early mismatched brackets', () => {\n    expect(isPaired('{)()')).toEqual(false)\n  })\n\n  xit('math expression', () => {\n    expect(isPaired('(((185 + 223.85) * 15) - 543)/2')).toEqual(true)\n  })\n\n  xit('complex latex expression', () => {\n    expect(\n      isPaired(\n        '\\\\left(\\\\begin{array}{cc} \\\\frac{1}{3} & x\\\\\\\\ \\\\mathrm{e}^{x} &... x^2 \\\\end{array}\\\\right)'\n      )\n    ).toEqual(true)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/matching-brackets/matching-brackets.ts",
    "content": "export function isPaired(input: unknown): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/matching-brackets/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-matching-brackets\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/matching-brackets/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/matching-brackets/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/matrix/.docs/instructions.md",
    "content": "# Instructions\n\nGiven a string representing a matrix of numbers, return the rows and columns of that matrix.\n\nSo given a string with embedded newlines like:\n\n```text\n9 8 7\n5 3 2\n6 6 7\n```\n\nrepresenting this matrix:\n\n```text\n    1  2  3\n  |---------\n1 | 9  8  7\n2 | 5  3  2\n3 | 6  6  7\n```\n\nyour code should be able to spit out:\n\n- A list of the rows, reading each row left-to-right while moving top-to-bottom across the rows,\n- A list of the columns, reading each column top-to-bottom while moving from left-to-right.\n\nThe rows for our example matrix:\n\n- 9, 8, 7\n- 5, 3, 2\n- 6, 6, 7\n\nAnd its columns:\n\n- 9, 5, 6\n- 8, 3, 6\n- 7, 2, 7\n"
  },
  {
    "path": "exercises/practice/matrix/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"matrix.ts\"\n    ],\n    \"test\": [\n      \"matrix.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given a string representing a matrix of numbers, return the rows and columns of that matrix.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Exercise by the JumpstartLab team for students at The Turing School of Software and Design.\",\n  \"source_url\": \"https://www.turing.edu/\"\n}\n"
  },
  {
    "path": "exercises/practice/matrix/.meta/proof.ci.ts",
    "content": "export class Matrix {\n  private description: string\n  public rows: number[][] = new Array<number[]>()\n  public columns: number[][] = new Array<number[]>()\n\n  constructor(description: string) {\n    this.description = description\n    this.parseMatrix()\n  }\n\n  private parseMatrix(): void {\n    this.parseRows()\n    this.parseColumns()\n  }\n\n  private parseRows(): void {\n    this.rows = this.description.split('\\n').map((row) => {\n      return row.split(' ').map((char) => {\n        return parseInt(char, 10)\n      })\n    })\n  }\n\n  private parseColumns(): void {\n    const rowsLength = this.rows.length\n    const columnsLength = this.rows[0].length\n    for (let i = 0; i < columnsLength; i++) {\n      this.columns.push([])\n      for (let j = 0; j < rowsLength; j++) {\n        this.columns[i].push(this.rows[j][i])\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "exercises/practice/matrix/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[ca733dab-9d85-4065-9ef6-a880a951dafd]\ndescription = \"extract row from one number matrix\"\n\n[5c93ec93-80e1-4268-9fc2-63bc7d23385c]\ndescription = \"can extract row\"\n\n[2f1aad89-ad0f-4bd2-9919-99a8bff0305a]\ndescription = \"extract row where numbers have different widths\"\n\n[68f7f6ba-57e2-4e87-82d0-ad09889b5204]\ndescription = \"can extract row from non-square matrix with no corresponding column\"\n\n[e8c74391-c93b-4aed-8bfe-f3c9beb89ebb]\ndescription = \"extract column from one number matrix\"\n\n[7136bdbd-b3dc-48c4-a10c-8230976d3727]\ndescription = \"can extract column\"\n\n[ad64f8d7-bba6-4182-8adf-0c14de3d0eca]\ndescription = \"can extract column from non-square matrix with no corresponding row\"\n\n[9eddfa5c-8474-440e-ae0a-f018c2a0dd89]\ndescription = \"extract column where numbers have different widths\"\n"
  },
  {
    "path": "exercises/practice/matrix/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/matrix/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/matrix/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/matrix/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/matrix/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/matrix/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/matrix/matrix.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { Matrix } from './matrix.ts'\n\ndescribe('Matrix', () => {\n  it('extract row from one number matrix', () => {\n    const expected = [1]\n    expect(new Matrix('1').rows[0]).toEqual(expected)\n  })\n\n  xit('can extract row', () => {\n    const expected = [3, 4]\n    expect(new Matrix('1 2\\n3 4').rows[1]).toEqual(expected)\n  })\n\n  xit('extract row where numbers have different widths', () => {\n    const expected = [10, 20]\n    expect(new Matrix('1 2\\n10 20').rows[1]).toEqual(expected)\n  })\n\n  xit('can extract row from non-square matrix', () => {\n    const expected = [7, 8, 9]\n    expect(new Matrix('1 2 3\\n4 5 6\\n7 8 9\\n8 7 6').rows[2]).toEqual(expected)\n  })\n\n  xit('extract column from one number matrix', () => {\n    const expected = [1]\n    expect(new Matrix('1').columns[0]).toEqual(expected)\n  })\n\n  xit('can extract column', () => {\n    const expected = [3, 6, 9]\n    expect(new Matrix('1 2 3\\n4 5 6\\n7 8 9').columns[2]).toEqual(expected)\n  })\n\n  xit('can extract column from non-square matrix', () => {\n    const expected = [3, 6, 9, 6]\n    expect(new Matrix('1 2 3\\n4 5 6\\n7 8 9\\n8 7 6').columns[2]).toEqual(\n      expected\n    )\n  })\n\n  xit('extract column where numbers have different widths', () => {\n    const expected = [1903, 3, 4]\n    expect(new Matrix('89 1903 3\\n18 3 1\\n9 4 800').columns[1]).toEqual(\n      expected\n    )\n  })\n})\n"
  },
  {
    "path": "exercises/practice/matrix/matrix.ts",
    "content": "export class Matrix {\n  constructor() {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  get rows(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  get columns(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/matrix/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-matrix\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/matrix/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/matrix/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/minesweeper/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to add the mine counts to empty squares in a completed Minesweeper board.\nThe board itself is a rectangle composed of squares that are either empty (`' '`) or a mine (`'*'`).\n\nFor each empty square, count the number of mines adjacent to it (horizontally, vertically, diagonally).\nIf the empty square has no adjacent mines, leave it empty.\nOtherwise replace it with the adjacent mines count.\n\nFor example, you may receive a 5 x 4 board like this (empty spaces are represented here with the '·' character for display on screen):\n\n```text\n·*·*·\n··*··\n··*··\n·····\n```\n\nWhich your code should transform into this:\n\n```text\n1*3*1\n13*31\n·2*2·\n·111·\n```\n"
  },
  {
    "path": "exercises/practice/minesweeper/.docs/introduction.md",
    "content": "# Introduction\n\n[Minesweeper][wikipedia] is a popular game where the user has to find the mines using numeric hints that indicate how many mines are directly adjacent (horizontally, vertically, diagonally) to a square.\n\n[wikipedia]: https://en.wikipedia.org/wiki/Minesweeper_(video_game)\n"
  },
  {
    "path": "exercises/practice/minesweeper/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"iignatov\",\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"minesweeper.ts\"\n    ],\n    \"test\": [\n      \"minesweeper.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Add the numbers to a minesweeper board.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  }\n}\n"
  },
  {
    "path": "exercises/practice/minesweeper/.meta/proof.ci.ts",
    "content": "const MINE = '*'\n\nconst DELTAS = [\n  [-1, -1],\n  [-1, 0],\n  [-1, 1],\n  [1, 1],\n  [1, 0],\n  [1, -1],\n  [0, 1],\n  [0, -1],\n]\n\nexport function annotate(rows: string[]): string[] {\n  if (noDataPresent(rows)) {\n    return rows\n  }\n\n  const inputBoard = rows.map((row) => [...row])\n\n  const result = inputBoard.map((row, x) =>\n    [...row].map((cell, y) => cellToMineOrCount(cell, inputBoard, x, y))\n  )\n\n  return stringify(result as string[][])\n}\n\nfunction cellToMineOrCount(\n  cell: string,\n  inputBoard: string[][],\n  x: number,\n  y: number\n): number | '*' | ' ' {\n  if (cell === MINE) {\n    return MINE\n  }\n  return countAdjacentMines(inputBoard, x, y) || ' '\n}\n\nfunction countAdjacentMines(board: string[][], x: number, y: number): number {\n  return DELTAS.filter((d) => adjacentSquareIsOnBoard(board, x, d)).filter(\n    (d) => adjacentSquareHasMine(board, x, y, d)\n  ).length\n}\n\nfunction stringify(board: string[][]): string[] {\n  return board.map((row) => row.join(''))\n}\n\nfunction noDataPresent(rows: string[]): boolean {\n  return rows.length === 0 || rows[0].length === 0\n}\n\nfunction adjacentSquareIsOnBoard(\n  board: string[][],\n  x: number,\n  d: number[]\n): string[] {\n  return board[x + d[0]]\n}\n\nfunction adjacentSquareHasMine(\n  board: string[][],\n  x: number,\n  y: number,\n  d: number[]\n): boolean {\n  return board[x + d[0]][y + d[1]] === MINE\n}\n"
  },
  {
    "path": "exercises/practice/minesweeper/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[0c5ec4bd-dea7-4138-8651-1203e1cb9f44]\ndescription = \"no rows\"\n\n[650ac4c0-ad6b-4b41-acde-e4ea5852c3b8]\ndescription = \"no columns\"\n\n[6fbf8f6d-a03b-42c9-9a58-b489e9235478]\ndescription = \"no mines\"\n\n[61aff1c4-fb31-4078-acad-cd5f1e635655]\ndescription = \"minefield with only mines\"\n\n[84167147-c504-4896-85d7-246b01dea7c5]\ndescription = \"mine surrounded by spaces\"\n\n[cb878f35-43e3-4c9d-93d9-139012cccc4a]\ndescription = \"space surrounded by mines\"\n\n[7037f483-ddb4-4b35-b005-0d0f4ef4606f]\ndescription = \"horizontal line\"\n\n[e359820f-bb8b-4eda-8762-47b64dba30a6]\ndescription = \"horizontal line, mines at edges\"\n\n[c5198b50-804f-47e9-ae02-c3b42f7ce3ab]\ndescription = \"vertical line\"\n\n[0c79a64d-703d-4660-9e90-5adfa5408939]\ndescription = \"vertical line, mines at edges\"\n\n[4b098563-b7f3-401c-97c6-79dd1b708f34]\ndescription = \"cross\"\n\n[04a260f1-b40a-4e89-839e-8dd8525abe0e]\ndescription = \"large minefield\"\n"
  },
  {
    "path": "exercises/practice/minesweeper/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/minesweeper/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/minesweeper/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/minesweeper/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/minesweeper/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/minesweeper/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/minesweeper/minesweeper.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { annotate } from './minesweeper.ts'\n\ndescribe('Minesweeper annotate', () => {\n  it('handles no rows', () => {\n    expect(annotate([])).toEqual([])\n  })\n\n  xit('handles no columns', () => {\n    expect(annotate([''])).toEqual([''])\n  })\n\n  xit('handles no mines', () => {\n    const input = ['   ', '   ', '   ']\n    const expected = ['   ', '   ', '   ']\n    expect(annotate(input)).toEqual(expected)\n  })\n\n  xit('handles board with only mines', () => {\n    const input = ['***', '***', '***']\n    const expected = ['***', '***', '***']\n    expect(annotate(input)).toEqual(expected)\n  })\n\n  xit('handles mine surrounded by spaces', () => {\n    const input = ['   ', ' * ', '   ']\n    const expected = ['111', '1*1', '111']\n    expect(annotate(input)).toEqual(expected)\n  })\n\n  xit('handles space surrounded by mines', () => {\n    const input = ['***', '* *', '***']\n    const expected = ['***', '*8*', '***']\n    expect(annotate(input)).toEqual(expected)\n  })\n\n  xit('handles horizontal line', () => {\n    const input = [' * * ']\n    const expected = ['1*2*1']\n    expect(annotate(input)).toEqual(expected)\n  })\n\n  xit('handles horizontal line, mines at edges', () => {\n    const input = ['*   *']\n    const expected = ['*1 1*']\n    expect(annotate(input)).toEqual(expected)\n  })\n\n  xit('handles vertical line', () => {\n    const input = [' ', '*', ' ', '*', ' ']\n    const expected = ['1', '*', '2', '*', '1']\n    expect(annotate(input)).toEqual(expected)\n  })\n\n  xit('handles vertical line, mines at edges', () => {\n    const input = ['*', ' ', ' ', ' ', '*']\n    const expected = ['*', '1', ' ', '1', '*']\n    expect(annotate(input)).toEqual(expected)\n  })\n\n  xit('handles cross', () => {\n    const input = ['  *  ', '  *  ', '*****', '  *  ', '  *  ']\n    const expected = [' 2*2 ', '25*52', '*****', '25*52', ' 2*2 ']\n    expect(annotate(input)).toEqual(expected)\n  })\n\n  xit('handles large board', () => {\n    const input = [' *  * ', '  *   ', '    * ', '   * *', ' *  * ', '      ']\n    const expected = [\n      '1*22*1',\n      '12*322',\n      ' 123*2',\n      '112*4*',\n      '1*22*2',\n      '111111',\n    ]\n    expect(annotate(input)).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/minesweeper/minesweeper.ts",
    "content": "export function annotate(field: unknown): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/minesweeper/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-minesweeper\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/minesweeper/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/minesweeper/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/nth-prime/.docs/instructions.md",
    "content": "# Instructions\n\nGiven a number n, determine what the nth prime is.\n\nBy listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.\n\nIf your language provides methods in the standard library to deal with prime numbers, pretend they don't exist and implement them yourself.\n"
  },
  {
    "path": "exercises/practice/nth-prime/.meta/config.json",
    "content": "{\n  \"authors\": [],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"nth-prime.ts\"\n    ],\n    \"test\": [\n      \"nth-prime.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given a number n, determine what the nth prime is.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"A variation on Problem 7 at Project Euler\",\n  \"source_url\": \"https://projecteuler.net/problem=7\"\n}\n"
  },
  {
    "path": "exercises/practice/nth-prime/.meta/proof.ci.ts",
    "content": "const isPrime = (n: number): boolean => {\n  for (let i = 2; i * i <= n; i++) {\n    if (n % i === 0) {\n      return false\n    }\n  }\n  return true\n}\n\nconst range = (min: number, max: number): number[] => {\n  const result: number[] = []\n  for (let i = min; i < max; i++) {\n    result.push(i)\n  }\n  return result\n}\n\nexport function nth(nthPrime: number): number {\n  if (nthPrime === 0) {\n    throw new Error('Prime is not possible')\n  }\n\n  return range(2, 2e6).filter(isPrime)[nthPrime - 1]\n}\n"
  },
  {
    "path": "exercises/practice/nth-prime/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[75c65189-8aef-471a-81de-0a90c728160c]\ndescription = \"first prime\"\n\n[2c38804c-295f-4701-b728-56dea34fd1a0]\ndescription = \"second prime\"\n\n[56692534-781e-4e8c-b1f9-3e82c1640259]\ndescription = \"sixth prime\"\n\n[fce1e979-0edb-412d-93aa-2c744e8f50ff]\ndescription = \"big prime\"\n\n[bd0a9eae-6df7-485b-a144-80e13c7d55b2]\ndescription = \"there is no zeroth prime\"\n"
  },
  {
    "path": "exercises/practice/nth-prime/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/nth-prime/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/nth-prime/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/nth-prime/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/nth-prime/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/nth-prime/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/nth-prime/nth-prime.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { nth } from './nth-prime.ts'\n\ndescribe('Prime', () => {\n  it('first', () => {\n    expect(nth(1)).toEqual(2)\n  })\n\n  xit('second', () => {\n    expect(nth(2)).toEqual(3)\n  })\n\n  xit('sixth', () => {\n    expect(nth(6)).toEqual(13)\n  })\n\n  xit('big prime', () => {\n    expect(nth(10001)).toEqual(104743)\n  })\n\n  xit('weird case', () => {\n    expect(() => nth(0)).toThrow('Prime is not possible')\n  })\n})\n"
  },
  {
    "path": "exercises/practice/nth-prime/nth-prime.ts",
    "content": "export function nth() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/nth-prime/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-nth-prime\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/nth-prime/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/nth-prime/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/nucleotide-count/.docs/instructions.md",
    "content": "# Instructions\n\nEach of us inherits from our biological parents a set of chemical instructions known as DNA that influence how our bodies are constructed.\nAll known life depends on DNA!\n\n> Note: You do not need to understand anything about nucleotides or DNA to complete this exercise.\n\nDNA is a long chain of other chemicals and the most important are the four nucleotides, adenine, cytosine, guanine and thymine.\nA single DNA chain can contain billions of these four nucleotides and the order in which they occur is important!\nWe call the order of these nucleotides in a bit of DNA a \"DNA sequence\".\n\nWe represent a DNA sequence as an ordered collection of these four nucleotides and a common way to do that is with a string of characters such as \"ATTACG\" for a DNA sequence of 6 nucleotides.\n'A' for adenine, 'C' for cytosine, 'G' for guanine, and 'T' for thymine.\n\nGiven a string representing a DNA sequence, count how many of each nucleotide is present.\nIf the string contains characters that aren't A, C, G, or T then it is invalid and you should signal an error.\n\nFor example:\n\n```text\n\"GATTACA\" -> 'A': 3, 'C': 1, 'G': 1, 'T': 2\n\"INVALID\" -> error\n```\n"
  },
  {
    "path": "exercises/practice/nucleotide-count/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"nucleotide-count.ts\"\n    ],\n    \"test\": [\n      \"nucleotide-count.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given a DNA string, compute how many times each nucleotide occurs in the string.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"The Calculating DNA Nucleotides_problem at Rosalind\",\n  \"source_url\": \"https://rosalind.info/problems/dna/\"\n}\n"
  },
  {
    "path": "exercises/practice/nucleotide-count/.meta/proof.ci.ts",
    "content": "type Counts = Record<'A' | 'C' | 'G' | 'T', number>\n\nexport function nucleotideCounts(strand: string): Counts {\n  const nucleotideOccurrences: Counts = {\n    A: 0,\n    C: 0,\n    G: 0,\n    T: 0,\n  }\n\n  strand.split('').forEach((nucleotide) => {\n    if (nucleotide in nucleotideOccurrences) {\n      if (nucleotide === 'A') {\n        nucleotideOccurrences.A++\n      }\n      if (nucleotide === 'C') {\n        nucleotideOccurrences.C++\n      }\n      if (nucleotide === 'G') {\n        nucleotideOccurrences.G++\n      }\n      if (nucleotide === 'T') {\n        nucleotideOccurrences.T++\n      }\n    } else {\n      throw new Error('Invalid nucleotide in strand')\n    }\n  })\n\n  return nucleotideOccurrences\n}\n"
  },
  {
    "path": "exercises/practice/nucleotide-count/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[3e5c30a8-87e2-4845-a815-a49671ade970]\ndescription = \"empty strand\"\n\n[a0ea42a6-06d9-4ac6-828c-7ccaccf98fec]\ndescription = \"can count one nucleotide in single-character input\"\n\n[eca0d565-ed8c-43e7-9033-6cefbf5115b5]\ndescription = \"strand with repeated nucleotide\"\n\n[40a45eac-c83f-4740-901a-20b22d15a39f]\ndescription = \"strand with multiple nucleotides\"\n\n[b4c47851-ee9e-4b0a-be70-a86e343bd851]\ndescription = \"strand with invalid nucleotides\"\n"
  },
  {
    "path": "exercises/practice/nucleotide-count/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/nucleotide-count/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/nucleotide-count/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/nucleotide-count/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/nucleotide-count/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/nucleotide-count/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/nucleotide-count/nucleotide-count.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { nucleotideCounts } from './nucleotide-count.ts'\n\ndescribe('count all nucleotides in a strand', () => {\n  it('empty strand', () => {\n    const expected = {\n      A: 0,\n      C: 0,\n      G: 0,\n      T: 0,\n    }\n    expect(nucleotideCounts('')).toEqual(expected)\n  })\n\n  xit('can count one nucleotide in single-character input', () => {\n    const expected = {\n      A: 0,\n      C: 0,\n      G: 1,\n      T: 0,\n    }\n    expect(nucleotideCounts('G')).toEqual(expected)\n  })\n\n  xit('strand with repeated nucleotide', () => {\n    const expected = {\n      A: 0,\n      C: 0,\n      G: 7,\n      T: 0,\n    }\n    expect(nucleotideCounts('GGGGGGG')).toEqual(expected)\n  })\n\n  xit('strand with multiple nucleotides', () => {\n    const expected = {\n      A: 20,\n      C: 12,\n      G: 17,\n      T: 21,\n    }\n    expect(\n      nucleotideCounts(\n        'AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC'\n      )\n    ).toEqual(expected)\n  })\n\n  xit('strand with invalid nucleotides', () => {\n    const expected = 'Invalid nucleotide in strand'\n    expect(() => {\n      nucleotideCounts('AGXXACT')\n    }).toThrow(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/nucleotide-count/nucleotide-count.ts",
    "content": "export function nucleotideCounts(/* Parameters go here */) {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/nucleotide-count/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-nucleotide-count\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/nucleotide-count/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/nucleotide-count/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/ocr-numbers/.docs/instructions.md",
    "content": "# Instructions\n\nOptical Character Recognition or OCR is software that converts images of text into machine-readable text.\nGiven a grid of characters representing some digits, convert the grid to a string of digits.\nIf the grid has multiple rows of cells, the rows should be separated in the output with a `\",\"`.\n\n- The grid is made of one of more lines of cells.\n- Each line of the grid is made of one or more cells.\n- Each cell is three columns wide and four rows high (3x4) and represents one digit.\n- Digits are drawn using pipes (`\"|\"`), underscores (`\"_\"`), and spaces (`\" \"`).\n\n## Edge cases\n\n- If the input is not a valid size, your program should indicate there is an error.\n- If the input is the correct size, but a cell is not recognizable, your program should output a `\"?\"` for that character.\n\n## Examples\n\nThe following input (without the comments) is converted to `\"1234567890\"`.\n\n```text\n      _  _     _  _  _  _  _  _  #\n    | _| _||_||_ |_   ||_||_|| | # Decimal numbers.\n    ||_  _|  | _||_|  ||_| _||_| #\n                                 # The fourth line is always blank,\n```\n\nThe following input is converted to `\"123,456,789\"`.\n\n<!-- prettier-ignore-start -->\n\n```text\n    _  _ \n  | _| _|\n  ||_  _|\n         \n    _  _ \n|_||_ |_ \n  | _||_|\n         \n _  _  _ \n  ||_||_|\n  ||_| _|\n         \n```\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "exercises/practice/ocr-numbers/.docs/introduction.md",
    "content": "# Introduction\n\nYour best friend Marta recently landed their dream job working with a local history museum's collections.\nKnowing of your interests in programming, they confide in you about an issue at work for an upcoming exhibit on computing history.\nA local university's math department had donated several boxes of historical printouts, but given the poor condition of the documents, the decision has been made to digitize the text.\nHowever, the university's old printer had some quirks in how text was represented, and your friend could use your help to extract the data successfully.\n"
  },
  {
    "path": "exercises/practice/ocr-numbers/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"mdowds\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"ocr-numbers.ts\"\n    ],\n    \"test\": [\n      \"ocr-numbers.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given a 3 x 4 grid of pipes, underscores, and spaces, determine which number is represented, or whether it is garbled.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Inspired by the Bank OCR kata\",\n  \"source_url\": \"https://codingdojo.org/kata/BankOCR/\"\n}\n"
  },
  {
    "path": "exercises/practice/ocr-numbers/.meta/proof.ci.ts",
    "content": "interface Patterns {\n  [key: number]: string[]\n}\n\nconst PATTERNS: Patterns = {\n  0: [' _ ', '| |', '|_|', '   '],\n  1: ['   ', '  |', '  |', '   '],\n  2: [' _ ', ' _|', '|_ ', '   '],\n  3: [' _ ', ' _|', ' _|', '   '],\n  4: ['   ', '|_|', '  |', '   '],\n  5: [' _ ', '|_ ', ' _|', '   '],\n  6: [' _ ', '|_ ', '|_|', '   '],\n  7: [' _ ', '  |', '  |', '   '],\n  8: [' _ ', '|_|', '|_|', '   '],\n  9: [' _ ', '|_|', ' _|', '   '],\n}\n\ntype Digit = number | '?'\n\nconst splitIntoRows = (text: string): string[] => {\n  const rows: string[] = []\n  const lines = text.split('\\n')\n  for (let rowNumber = 0; rowNumber < lines.length; rowNumber += 4) {\n    let row = ''\n    for (let rowLine = 0; rowLine < 4; rowLine += 1) {\n      row += `${lines[rowNumber + rowLine]}\\n`\n    }\n    rows.push(row.slice(0, -1))\n  }\n  return rows\n}\n\nconst splitIntoDigits = (row: string): string[] => {\n  const digits: string[] = []\n  const rows = row.split('\\n')\n  for (let digitNumber = 0; digitNumber < rows[0].length; digitNumber += 3) {\n    let digit = ''\n    for (let rowNumber = 0; rowNumber < rows.length; rowNumber += 1) {\n      digit += rows[rowNumber].substr(digitNumber, 3)\n    }\n    digits.push(digit)\n  }\n  return digits\n}\n\nconst getDigit = (text: string): Digit => {\n  const digit = (\n    Object.values(PATTERNS) as (typeof PATTERNS)[keyof typeof PATTERNS][]\n  )\n    .map((x) => x.join(''))\n    .indexOf(text)\n  if (digit === -1) {\n    return '?'\n  }\n  return digit\n}\n\nconst valuesInRow = (row: string): string =>\n  splitIntoDigits(row).map(getDigit).join('')\n\nexport const convert = (text: string): string =>\n  splitIntoRows(text).map(valuesInRow).join(',')\n"
  },
  {
    "path": "exercises/practice/ocr-numbers/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[5ee54e1a-b554-4bf3-a056-9a7976c3f7e8]\ndescription = \"Recognizes 0\"\n\n[027ada25-17fd-4d78-aee6-35a19623639d]\ndescription = \"Recognizes 1\"\n\n[3cce2dbd-01d9-4f94-8fae-419a822e89bb]\ndescription = \"Unreadable but correctly sized inputs return ?\"\n\n[cb19b733-4e36-4cf9-a4a1-6e6aac808b9a]\ndescription = \"Input with a number of lines that is not a multiple of four raises an error\"\n\n[235f7bd1-991b-4587-98d4-84206eec4cc6]\ndescription = \"Input with a number of columns that is not a multiple of three raises an error\"\n\n[4a841794-73c9-4da9-a779-1f9837faff66]\ndescription = \"Recognizes 110101100\"\n\n[70c338f9-85b1-4296-a3a8-122901cdfde8]\ndescription = \"Garbled numbers in a string are replaced with ?\"\n\n[ea494ff4-3610-44d7-ab7e-72fdef0e0802]\ndescription = \"Recognizes 2\"\n\n[1acd2c00-412b-4268-93c2-bd7ff8e05a2c]\ndescription = \"Recognizes 3\"\n\n[eaec6a15-be17-4b6d-b895-596fae5d1329]\ndescription = \"Recognizes 4\"\n\n[440f397a-f046-4243-a6ca-81ab5406c56e]\ndescription = \"Recognizes 5\"\n\n[f4c9cf6a-f1e2-4878-bfc3-9b85b657caa0]\ndescription = \"Recognizes 6\"\n\n[e24ebf80-c611-41bb-a25a-ac2c0f232df5]\ndescription = \"Recognizes 7\"\n\n[b79cad4f-e264-4818-9d9e-77766792e233]\ndescription = \"Recognizes 8\"\n\n[5efc9cfc-9227-4688-b77d-845049299e66]\ndescription = \"Recognizes 9\"\n\n[f60cb04a-42be-494e-a535-3451c8e097a4]\ndescription = \"Recognizes string of decimal numbers\"\n\n[b73ecf8b-4423-4b36-860d-3710bdb8a491]\ndescription = \"Numbers separated by empty lines are recognized. Lines are joined by commas.\"\n"
  },
  {
    "path": "exercises/practice/ocr-numbers/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/ocr-numbers/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/ocr-numbers/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/ocr-numbers/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/ocr-numbers/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/ocr-numbers/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/ocr-numbers/ocr-numbers.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { convert } from './ocr-numbers.ts'\n\ndescribe('ocr', () => {\n  it('recognizes zero', () => {\n    expect(convert(' _ \\n' + '| |\\n' + '|_|\\n' + '   ')).toBe('0')\n  })\n\n  xit('recognizes one', () => {\n    expect(convert('   \\n' + '  |\\n' + '  |\\n' + '   ')).toBe('1')\n  })\n\n  xit('recognizes two', () => {\n    expect(convert(' _ \\n' + ' _|\\n' + '|_ \\n' + '   ')).toBe('2')\n  })\n\n  xit('recognizes three', () => {\n    expect(convert(' _ \\n' + ' _|\\n' + ' _|\\n' + '   ')).toBe('3')\n  })\n\n  xit('recognizes four', () => {\n    expect(convert('   \\n' + '|_|\\n' + '  |\\n' + '   ')).toBe('4')\n  })\n\n  xit('recognizes five', () => {\n    expect(convert(' _ \\n' + '|_ \\n' + ' _|\\n' + '   ')).toBe('5')\n  })\n\n  xit('recognizes six', () => {\n    expect(convert(' _ \\n' + '|_ \\n' + '|_|\\n' + '   ')).toBe('6')\n  })\n\n  xit('recognizes seven', () => {\n    expect(convert(' _ \\n' + '  |\\n' + '  |\\n' + '   ')).toBe('7')\n  })\n\n  xit('recognizes eight', () => {\n    expect(convert(' _ \\n' + '|_|\\n' + '|_|\\n' + '   ')).toBe('8')\n  })\n\n  xit('recognizes nine', () => {\n    expect(convert(' _ \\n' + '|_|\\n' + ' _|\\n' + '   ')).toBe('9')\n  })\n\n  xit('recognizes ten', () => {\n    expect(convert('    _ \\n' + '  || |\\n' + '  ||_|\\n' + '      ')).toBe('10')\n  })\n\n  xit('identifies garble', () => {\n    expect(convert('   \\n' + '| |\\n' + '| |\\n' + '   ')).toBe('?')\n  })\n\n  xit('converts 110101100', () => {\n    expect(\n      convert(\n        '       _     _        _  _ \\n' +\n          '  |  || |  || |  |  || || |\\n' +\n          '  |  ||_|  ||_|  |  ||_||_|\\n' +\n          '                           '\n      )\n    ).toBe('110101100')\n  })\n\n  xit('identifies garble mixed in', () => {\n    expect(\n      convert(\n        '       _     _           _ \\n' +\n          '  |  || |  || |     || || |\\n' +\n          '  |  | _|  ||_|  |  ||_||_|\\n' +\n          '                           '\n      )\n    ).toBe('11?10?1?0')\n  })\n\n  xit('converts 1234567890', () => {\n    expect(\n      convert(\n        '    _  _     _  _  _  _  _  _ \\n' +\n          '  | _| _||_||_ |_   ||_||_|| |\\n' +\n          '  ||_  _|  | _||_|  ||_| _||_|\\n' +\n          '                              '\n      )\n    ).toBe('1234567890')\n  })\n\n  xit('converts 123 456 789', () => {\n    expect(\n      convert(\n        '    _  _ \\n' +\n          '  | _| _|\\n' +\n          '  ||_  _|\\n' +\n          '         \\n' +\n          '    _  _ \\n' +\n          '|_||_ |_ \\n' +\n          '  | _||_|\\n' +\n          '         \\n' +\n          ' _  _  _ \\n' +\n          '  ||_||_|\\n' +\n          '  ||_| _|\\n' +\n          '         '\n      )\n    ).toBe('123,456,789')\n  })\n})\n"
  },
  {
    "path": "exercises/practice/ocr-numbers/ocr-numbers.ts",
    "content": "export function convert(/* Parameters go here */) {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/ocr-numbers/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-ocr-numbers\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/ocr-numbers/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/ocr-numbers/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/palindrome-products/.docs/instructions.md",
    "content": "# Instructions\n\nDetect palindrome products in a given range.\n\nA palindromic number is a number that remains the same when its digits are reversed.\nFor example, `121` is a palindromic number but `112` is not.\n\nGiven a range of numbers, find the largest and smallest palindromes which\nare products of two numbers within that range.\n\nYour solution should return the largest and smallest palindromes, along with the factors of each within the range.\nIf the largest or smallest palindrome has more than one pair of factors within the range, then return all the pairs.\n\n## Example 1\n\nGiven the range `[1, 9]` (both inclusive)...\n\nAnd given the list of all possible products within this range:\n`[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 18, 15, 21, 24, 27, 20, 28, 32, 36, 25, 30, 35, 40, 45, 42, 48, 54, 49, 56, 63, 64, 72, 81]`\n\nThe palindrome products are all single digit numbers (in this case):\n`[1, 2, 3, 4, 5, 6, 7, 8, 9]`\n\nThe smallest palindrome product is `1`.\nIts factors are `(1, 1)`.\nThe largest palindrome product is `9`.\nIts factors are `(1, 9)` and `(3, 3)`.\n\n## Example 2\n\nGiven the range `[10, 99]` (both inclusive)...\n\nThe smallest palindrome product is `121`.\nIts factors are `(11, 11)`.\nThe largest palindrome product is `9009`.\nIts factors are `(91, 99)`.\n"
  },
  {
    "path": "exercises/practice/palindrome-products/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"averaart\",\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"palindrome-products.ts\"\n    ],\n    \"test\": [\n      \"palindrome-products.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Detect palindrome products in a given range.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": true,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Problem 4 at Project Euler\",\n  \"source_url\": \"https://projecteuler.net/problem=4\"\n}\n"
  },
  {
    "path": "exercises/practice/palindrome-products/.meta/proof.ci.ts",
    "content": "interface Input {\n  maxFactor: number\n  minFactor?: number\n}\n\ntype Factors = [number, number][]\ninterface PalindromeShape {\n  value: number | null\n  factors: Factors\n}\n\nconst reverseString = (str: string): string => str.split('').reverse().join('')\n\nclass Palindrome implements PalindromeShape {\n  public readonly value: number\n  public readonly factors: Factors\n\n  constructor(factor1: number, factor2: number) {\n    this.value = factor1 * factor2\n    this.factors = [[factor1, factor2].sort() as [number, number]]\n  }\n\n  public withFactors(factors: Factors[number]): this {\n    this.factors.push(factors.sort())\n    this.factors.sort()\n\n    return this\n  }\n\n  public valid(): boolean {\n    const s = `${this.value}`\n    return s === reverseString(s)\n  }\n\n  public merge(other: Palindrome): this {\n    other.factors.forEach((f) => {\n      this.factors.push(f)\n    })\n    this.factors.sort()\n\n    return this\n  }\n}\nclass Palindromes {\n  constructor(\n    public maxFactor: number,\n    public minFactor = 1\n  ) {}\n\n  public get largest(): PalindromeShape {\n    let best = new Palindrome(this.minFactor, this.minFactor)\n    for (let m = this.maxFactor; m >= this.minFactor; m -= 1) {\n      let p = null\n      for (let n = m; n >= this.minFactor && (!p || !p.valid()); n -= 1) {\n        p = new Palindrome(m, n)\n        if (p.valid()) {\n          if (best.value < p.value) {\n            best = p\n          } else if (best.value === p.value) {\n            best = p.merge(best)\n          }\n        }\n      }\n    }\n    if (best.valid()) {\n      return best\n    }\n\n    return { value: null, factors: [] }\n  }\n\n  public get smallest(): PalindromeShape {\n    let smallest: PalindromeShape = { value: null, factors: [] }\n    for (let m = this.minFactor; m <= this.maxFactor; m += 1) {\n      for (let n = this.minFactor; n <= this.maxFactor; n += 1) {\n        const p = new Palindrome(m, n)\n        if (p.valid() && (!smallest.value || smallest.value > p.value)) {\n          smallest = p\n        }\n      }\n    }\n\n    return smallest\n  }\n}\n\nexport function generate(params: Input): Palindromes {\n  if ((params.minFactor || 1) > params.maxFactor) {\n    throw new Error('min must be <= max')\n  }\n  return new Palindromes(params.maxFactor, params.minFactor || 1)\n}\n"
  },
  {
    "path": "exercises/practice/palindrome-products/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[5cff78fe-cf02-459d-85c2-ce584679f887]\ndescription = \"find the smallest palindrome from single digit factors\"\n\n[0853f82c-5fc4-44ae-be38-fadb2cced92d]\ndescription = \"find the largest palindrome from single digit factors\"\n\n[66c3b496-bdec-4103-9129-3fcb5a9063e1]\ndescription = \"find the smallest palindrome from double digit factors\"\n\n[a10682ae-530a-4e56-b89d-69664feafe53]\ndescription = \"find the largest palindrome from double digit factors\"\n\n[cecb5a35-46d1-4666-9719-fa2c3af7499d]\ndescription = \"find the smallest palindrome from triple digit factors\"\n\n[edab43e1-c35f-4ea3-8c55-2f31dddd92e5]\ndescription = \"find the largest palindrome from triple digit factors\"\n\n[4f802b5a-9d74-4026-a70f-b53ff9234e4e]\ndescription = \"find the smallest palindrome from four digit factors\"\n\n[787525e0-a5f9-40f3-8cb2-23b52cf5d0be]\ndescription = \"find the largest palindrome from four digit factors\"\n\n[58fb1d63-fddb-4409-ab84-a7a8e58d9ea0]\ndescription = \"empty result for smallest if no palindrome in the range\"\n\n[9de9e9da-f1d9-49a5-8bfc-3d322efbdd02]\ndescription = \"empty result for largest if no palindrome in the range\"\n\n[12e73aac-d7ee-4877-b8aa-2aa3dcdb9f8a]\ndescription = \"error result for smallest if min is more than max\"\n\n[eeeb5bff-3f47-4b1e-892f-05829277bd74]\ndescription = \"error result for largest if min is more than max\"\n\n[16481711-26c4-42e0-9180-e2e4e8b29c23]\ndescription = \"smallest product does not use the smallest factor\"\n"
  },
  {
    "path": "exercises/practice/palindrome-products/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/palindrome-products/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/palindrome-products/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/palindrome-products/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/palindrome-products/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/palindrome-products/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/palindrome-products/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-palindrome-products\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/palindrome-products/palindrome-products.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { generate } from './palindrome-products.ts'\n\ndescribe('Palindromes', () => {\n  it('smallest palindrome from single digit factors', () => {\n    const palindromes = generate({ maxFactor: 9, minFactor: 1 })\n    const smallest = palindromes.smallest\n    const expected = { value: 1, factors: [[1, 1]] }\n\n    expect(smallest.value).toEqual(expected.value)\n    expect(sortFactors(smallest.factors)).toEqual(expected.factors)\n  })\n\n  xit('largest palindrome from single digit factors', () => {\n    const palindromes = generate({ maxFactor: 9, minFactor: 1 })\n    const largest = palindromes.largest\n    const expected = {\n      value: 9,\n      factors: [\n        [1, 9],\n        [3, 3],\n      ],\n    }\n\n    expect(largest.value).toEqual(expected.value)\n    expect(sortFactors(largest.factors)).toEqual(expected.factors)\n  })\n\n  xit('smallest palindrome from double digit factors', () => {\n    const palindromes = generate({ maxFactor: 99, minFactor: 10 })\n    const smallest = palindromes.smallest\n    const expected = { value: 121, factors: [[11, 11]] }\n\n    expect(smallest.value).toEqual(expected.value)\n    expect(sortFactors(smallest.factors)).toEqual(expected.factors)\n  })\n\n  xit('largest palindrome from double digit factors', () => {\n    const palindromes = generate({ maxFactor: 99, minFactor: 10 })\n    const largest = palindromes.largest\n    const expected = { value: 9009, factors: [[91, 99]] }\n\n    expect(largest.value).toEqual(expected.value)\n    expect(sortFactors(largest.factors)).toEqual(expected.factors)\n  })\n\n  xit('smallest palindrome from triple digit factors', () => {\n    const palindromes = generate({\n      maxFactor: 999,\n      minFactor: 100,\n    })\n    const smallest = palindromes.smallest\n    const expected = { value: 10201, factors: [[101, 101]] }\n\n    expect(smallest.value).toEqual(expected.value)\n    expect(sortFactors(smallest.factors)).toEqual(expected.factors)\n  })\n\n  xit('largest palindrome from triple digit factors', () => {\n    const palindromes = generate({\n      maxFactor: 999,\n      minFactor: 100,\n    })\n    const largest = palindromes.largest\n    const expected = { value: 906609, factors: [[913, 993]] }\n\n    expect(largest.value).toEqual(expected.value)\n    expect(sortFactors(largest.factors)).toEqual(expected.factors)\n  })\n\n  xit('smallest palindrome from four digit factors', () => {\n    const palindromes = generate({\n      maxFactor: 9999,\n      minFactor: 1000,\n    })\n    const smallest = palindromes.smallest\n    const expected = { value: 1002001, factors: [[1001, 1001]] }\n\n    expect(smallest.value).toEqual(expected.value)\n    expect(sortFactors(smallest.factors)).toEqual(expected.factors)\n  })\n\n  xit('largest palindrome from four digit factors', () => {\n    const palindromes = generate({\n      maxFactor: 9999,\n      minFactor: 1000,\n    })\n    const largest = palindromes.largest\n    const expected = { value: 99000099, factors: [[9901, 9999]] }\n\n    expect(largest.value).toEqual(expected.value)\n    expect(sortFactors(largest.factors)).toEqual(expected.factors)\n  })\n\n  xit('empty result for smallest if no palindrome in range', () => {\n    const palindromes = generate({\n      maxFactor: 1003,\n      minFactor: 1002,\n    })\n    const smallest = palindromes.smallest\n\n    expect(smallest.value).toBe(null)\n    expect(smallest.factors).toEqual([])\n  })\n\n  xit('empty result for largest if no palindrome in range', () => {\n    const palindromes = generate({ maxFactor: 15, minFactor: 15 })\n    const largest = palindromes.largest\n\n    expect(largest.value).toBe(null)\n    expect(largest.factors).toEqual([])\n  })\n\n  xit('error for smallest if min is more than max', () => {\n    expect(() => {\n      const palindromes = generate({\n        maxFactor: 1,\n        minFactor: 10000,\n      })\n\n      // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n      palindromes.smallest\n    }).toThrow(new Error('min must be <= max'))\n  })\n\n  xit('error for largest if min is more than max', () => {\n    expect(() => {\n      const palindromes = generate({ maxFactor: 1, minFactor: 2 })\n\n      // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n      palindromes.largest\n    }).toThrow(new Error('min must be <= max'))\n  })\n\n  xit('smallest product does not use the smallest factor', () => {\n    const palindromes = generate({\n      maxFactor: 4000,\n      minFactor: 3215,\n    })\n    const smallest = palindromes.smallest\n    const expected = { value: 10988901, factors: [[3297, 3333]] }\n\n    expect(smallest.value).toEqual(expected.value)\n    expect(sortFactors(smallest.factors)).toEqual(expected.factors)\n  })\n})\n\ntype Factors = ReturnType<typeof generate>['smallest']['factors']\nfunction sortFactors(factors: Factors): Factors {\n  return factors.map((f) => f.sort()).sort()\n}\n"
  },
  {
    "path": "exercises/practice/palindrome-products/palindrome-products.ts",
    "content": "interface Input {\n  maxFactor: number\n  minFactor?: number\n}\n\nexport function generate(params: Input): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/palindrome-products/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/palindrome-products/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/pangram/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to figure out if a sentence is a pangram.\n\nA pangram is a sentence using every letter of the alphabet at least once.\nIt is case insensitive, so it doesn't matter if a letter is lower-case (e.g. `k`) or upper-case (e.g. `K`).\n\nFor this exercise, a sentence is a pangram if it contains each of the 26 letters in the English alphabet.\n"
  },
  {
    "path": "exercises/practice/pangram/.docs/introduction.md",
    "content": "# Introduction\n\nYou work for a company that sells fonts through their website.\nThey'd like to show a different sentence each time someone views a font on their website.\nTo give a comprehensive sense of the font, the random sentences should use **all** the letters in the English alphabet.\n\nThey're running a competition to get suggestions for sentences that they can use.\nYou're in charge of checking the submissions to see if they are valid.\n\n~~~~exercism/note\nPangram comes from Greek, παν γράμμα, pan gramma, which means \"every letter\".\n\nThe best known English pangram is:\n\n> The quick brown fox jumps over the lazy dog.\n~~~~\n"
  },
  {
    "path": "exercises/practice/pangram/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"masters3d\"\n  ],\n  \"contributors\": [\n    \"CRivasGomez\",\n    \"DFXLuna\",\n    \"lukaszklis\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"pangram.ts\"\n    ],\n    \"test\": [\n      \"pangram.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Determine if a sentence is a pangram.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Wikipedia\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/Pangram\"\n}\n"
  },
  {
    "path": "exercises/practice/pangram/.meta/proof.ci.ts",
    "content": "const aToZ = [...Array<string>(26)].map((_, index) => {\n  return String.fromCharCode(index + 65)\n})\n\nexport function isPangram(value: string): boolean {\n  const myMap = new Map<string, number>()\n  aToZ.forEach((key: string) => {\n    myMap.set(key.toLowerCase(), 0)\n  })\n\n  for (const each of value) {\n    const item = myMap.get(each) || 0\n    myMap.set(each.toLowerCase(), item + 1)\n  }\n\n  for (const each of myMap.values()) {\n    if (each === 0) {\n      return false\n    }\n  }\n  return true\n}\n"
  },
  {
    "path": "exercises/practice/pangram/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[64f61791-508e-4f5c-83ab-05de042b0149]\ndescription = \"empty sentence\"\n\n[74858f80-4a4d-478b-8a5e-c6477e4e4e84]\ndescription = \"perfect lower case\"\n\n[61288860-35ca-4abe-ba08-f5df76ecbdcd]\ndescription = \"only lower case\"\n\n[6564267d-8ac5-4d29-baf2-e7d2e304a743]\ndescription = \"missing the letter 'x'\"\n\n[c79af1be-d715-4cdb-a5f2-b2fa3e7e0de0]\ndescription = \"missing the letter 'h'\"\n\n[d835ec38-bc8f-48e4-9e36-eb232427b1df]\ndescription = \"with underscores\"\n\n[8cc1e080-a178-4494-b4b3-06982c9be2a8]\ndescription = \"with numbers\"\n\n[bed96b1c-ff95-45b8-9731-fdbdcb6ede9a]\ndescription = \"missing letters replaced by numbers\"\n\n[938bd5d8-ade5-40e2-a2d9-55a338a01030]\ndescription = \"mixed case and punctuation\"\n\n[2577bf54-83c8-402d-a64b-a2c0f7bb213a]\ndescription = \"case insensitive\"\ninclude = false\n\n[7138e389-83e4-4c6e-8413-1e40a0076951]\ndescription = \"a-m and A-M are 26 different characters but not a pangram\"\nreimplements = \"2577bf54-83c8-402d-a64b-a2c0f7bb213a\"\n"
  },
  {
    "path": "exercises/practice/pangram/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/pangram/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/pangram/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/pangram/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/pangram/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/pangram/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/pangram/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-pangram\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/pangram/pangram.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { isPangram } from './pangram.ts'\n\ndescribe('Pangram()', () => {\n  it('empty sentence', () => {\n    expect(isPangram('')).toBe(false)\n  })\n\n  xit('perfect lower case', () => {\n    expect(isPangram('abcdefghijklmnopqrstuvwxyz')).toBe(true)\n  })\n\n  xit('only lower case', () => {\n    expect(isPangram('the quick brown fox jumps over the lazy dog')).toBe(true)\n  })\n\n  xit(\"missing the letter 'x'\", () => {\n    expect(\n      isPangram('a quick movement of the enemy will jeopardize five gunboats')\n    ).toBe(false)\n  })\n\n  xit(\"missing the letter 'h'\", () => {\n    expect(isPangram('five boxing wizards jump quickly at it')).toBe(false)\n  })\n\n  xit('with underscores', () => {\n    expect(isPangram('the_quick_brown_fox_jumps_over_the_lazy_dog')).toBe(true)\n  })\n\n  xit('with numbers', () => {\n    expect(isPangram('the 1 quick brown fox jumps over the 2 lazy dogs')).toBe(\n      true\n    )\n  })\n\n  xit('missing letters replaced by numbers', () => {\n    expect(isPangram('7h3 qu1ck brown fox jumps ov3r 7h3 lazy dog')).toBe(false)\n  })\n\n  xit('mixed case and punctuation', () => {\n    expect(isPangram('\"Five quacking Zephyrs jolt my wax bed.\"')).toBe(true)\n  })\n\n  xit('a-m and A-M are 26 different characters but not a pangram', () => {\n    expect(isPangram('abcdefghijklm ABCDEFGHIJKLM')).toBe(false)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/pangram/pangram.ts",
    "content": "export function isPangram() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/pangram/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/pangram/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/pascals-triangle/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to output the first N rows of Pascal's triangle.\n\n[Pascal's triangle][wikipedia] is a triangular array of positive integers.\n\nIn Pascal's triangle, the number of values in a row is equal to its row number (which starts at one).\nTherefore, the first row has one value, the second row has two values, and so on.\n\nThe first (topmost) row has a single value: `1`.\nSubsequent rows' values are computed by adding the numbers directly to the right and left of the current position in the previous row.\n\nIf the previous row does _not_ have a value to the left or right of the current position (which only happens for the leftmost and rightmost positions), treat that position's value as zero (effectively \"ignoring\" it in the summation).\n\n## Example\n\nLet's look at the first 5 rows of Pascal's Triangle:\n\n```text\n    1\n   1 1\n  1 2 1\n 1 3 3 1\n1 4 6 4 1\n```\n\nThe topmost row has one value, which is `1`.\n\nThe leftmost and rightmost values have only one preceding position to consider, which is the position to its right respectively to its left.\nWith the topmost value being `1`, it follows from this that all the leftmost and rightmost values are also `1`.\n\nThe other values all have two positions to consider.\nFor example, the fifth row's (`1 4 6 4 1`) middle value is `6`, as the values to its left and right in the preceding row are `3` and `3`:\n\n[wikipedia]: https://en.wikipedia.org/wiki/Pascal%27s_triangle\n"
  },
  {
    "path": "exercises/practice/pascals-triangle/.docs/introduction.md",
    "content": "# Introduction\n\nWith the weather being great, you're not looking forward to spending an hour in a classroom.\nAnnoyed, you enter the class room, where you notice a strangely satisfying triangle shape on the blackboard.\nWhilst waiting for your math teacher to arrive, you can't help but notice some patterns in the triangle: the outer values are all ones, each subsequent row has one more value than its previous row and the triangle is symmetrical.\nWeird!\n\nNot long after you sit down, your teacher enters the room and explains that this triangle is the famous [Pascal's triangle][wikipedia].\n\nOver the next hour, your teacher reveals some amazing things hidden in this triangle:\n\n- It can be used to compute how many ways you can pick K elements from N values.\n- It contains the Fibonacci sequence.\n- If you color odd and even numbers differently, you get a beautiful pattern called the [Sierpiński triangle][wikipedia-sierpinski-triangle].\n\nThe teacher implores you and your classmates to look up other uses, and assures you that there are lots more!\nAt that moment, the school bell rings.\nYou realize that for the past hour, you were completely absorbed in learning about Pascal's triangle.\nYou quickly grab your laptop from your bag and go outside, ready to enjoy both the sunshine _and_ the wonders of Pascal's triangle.\n\n[wikipedia]: https://en.wikipedia.org/wiki/Pascal%27s_triangle\n[wikipedia-sierpinski-triangle]: https://en.wikipedia.org/wiki/Sierpi%C5%84ski_triangle\n"
  },
  {
    "path": "exercises/practice/pascals-triangle/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"anuragsoni\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"pascals-triangle.ts\"\n    ],\n    \"test\": [\n      \"pascals-triangle.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Compute Pascal's triangle up to a given number of rows.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Pascal's Triangle at Wolfram Math World\",\n  \"source_url\": \"https://www.wolframalpha.com/input/?i=Pascal%27s+triangle\"\n}\n"
  },
  {
    "path": "exercises/practice/pascals-triangle/.meta/proof.ci.ts",
    "content": "export class Triangle {\n  public readonly rows: number[][]\n  public readonly lastRow: number[]\n\n  constructor(rows: number) {\n    this.rows = this.fillRows(rows)\n    this.lastRow = this.rows[this.rows.length - 1]\n  }\n\n  private newRow(prevRow: number[]): number[] {\n    let prev = 0\n    const nextRow = []\n    for (const x of prevRow) {\n      nextRow.push(prev + x)\n      prev = x\n    }\n    nextRow.push(1)\n    return nextRow\n  }\n\n  private fillRows(rows: number): number[][] {\n    const result = []\n    let prevRow: number[] = []\n    for (let x = 0; x < rows; x++) {\n      const nextRow = this.newRow(prevRow)\n      result.push(nextRow)\n      prevRow = nextRow\n    }\n    return result\n  }\n}\n"
  },
  {
    "path": "exercises/practice/pascals-triangle/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[9920ce55-9629-46d5-85d6-4201f4a4234d]\ndescription = \"zero rows\"\n\n[70d643ce-a46d-4e93-af58-12d88dd01f21]\ndescription = \"single row\"\n\n[a6e5a2a2-fc9a-4b47-9f4f-ed9ad9fbe4bd]\ndescription = \"two rows\"\n\n[97206a99-79ba-4b04-b1c5-3c0fa1e16925]\ndescription = \"three rows\"\n\n[565a0431-c797-417c-a2c8-2935e01ce306]\ndescription = \"four rows\"\n\n[06f9ea50-9f51-4eb2-b9a9-c00975686c27]\ndescription = \"five rows\"\n\n[c3912965-ddb4-46a9-848e-3363e6b00b13]\ndescription = \"six rows\"\n\n[6cb26c66-7b57-4161-962c-81ec8c99f16b]\ndescription = \"ten rows\"\n"
  },
  {
    "path": "exercises/practice/pascals-triangle/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/pascals-triangle/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/pascals-triangle/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/pascals-triangle/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/pascals-triangle/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/pascals-triangle/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/pascals-triangle/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-pascals-triangle\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/pascals-triangle/pascals-triangle.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { Triangle } from './pascals-triangle.ts'\n\ndescribe('Triangle', () => {\n  it('with one row', () => {\n    expect(new Triangle(1).rows).toEqual([[1]])\n  })\n\n  xit('with two rows', () => {\n    expect(new Triangle(2).rows).toEqual([[1], [1, 1]])\n  })\n\n  xit('with three rows', () => {\n    expect(new Triangle(3).rows).toEqual([[1], [1, 1], [1, 2, 1]])\n  })\n\n  xit('last row', () => {\n    expect(new Triangle(4).lastRow).toEqual([1, 3, 3, 1])\n  })\n\n  xit('fifth row', () => {\n    expect(new Triangle(5).lastRow).toEqual([1, 4, 6, 4, 1])\n  })\n\n  xit('twentieth row', () => {\n    const twentieth = [\n      1, 19, 171, 969, 3876, 11628, 27132, 50388, 75582, 92378, 92378, 75582,\n      50388, 27132, 11628, 3876, 969, 171, 19, 1,\n    ]\n    expect(new Triangle(20).lastRow).toEqual(twentieth)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/pascals-triangle/pascals-triangle.ts",
    "content": "export class Triangle {}\n"
  },
  {
    "path": "exercises/practice/pascals-triangle/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/pascals-triangle/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/perfect-numbers/.docs/instructions.md",
    "content": "# Instructions\n\nDetermine if a number is perfect, abundant, or deficient based on Nicomachus' (60 - 120 CE) classification scheme for positive integers.\n\nThe Greek mathematician [Nicomachus][nicomachus] devised a classification scheme for positive integers, identifying each as belonging uniquely to the categories of [perfect](#perfect), [abundant](#abundant), or [deficient](#deficient) based on their [aliquot sum][aliquot-sum].\nThe _aliquot sum_ is defined as the sum of the factors of a number not including the number itself.\nFor example, the aliquot sum of `15` is `1 + 3 + 5 = 9`.\n\n## Perfect\n\nA number is perfect when it equals its aliquot sum.\nFor example:\n\n- `6` is a perfect number because `1 + 2 + 3 = 6`\n- `28` is a perfect number because `1 + 2 + 4 + 7 + 14 = 28`\n\n## Abundant\n\nA number is abundant when it is less than its aliquot sum.\nFor example:\n\n- `12` is an abundant number because `1 + 2 + 3 + 4 + 6 = 16`\n- `24` is an abundant number because `1 + 2 + 3 + 4 + 6 + 8 + 12 = 36`\n\n## Deficient\n\nA number is deficient when it is greater than its aliquot sum.\nFor example:\n\n- `8` is a deficient number because `1 + 2 + 4 = 7`\n- Prime numbers are deficient\n\n## Task\n\nImplement a way to determine whether a given number is [perfect](#perfect).\nDepending on your language track, you may also need to implement a way to determine whether a given number is [abundant](#abundant) or [deficient](#deficient).\n\n[nicomachus]: https://en.wikipedia.org/wiki/Nicomachus\n[aliquot-sum]: https://en.wikipedia.org/wiki/Aliquot_sum\n"
  },
  {
    "path": "exercises/practice/perfect-numbers/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"G-Rath\",\n    \"masters3d\",\n    \"SleeplessByte\",\n    \"vjba\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"perfect-numbers.ts\"\n    ],\n    \"test\": [\n      \"perfect-numbers.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Determine if a number is perfect, abundant, or deficient based on Nicomachus' (60 - 120 CE) classification scheme for positive integers.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Taken from Chapter 2 of Functional Thinking by Neal Ford.\",\n  \"source_url\": \"https://www.oreilly.com/library/view/functional-thinking/9781449365509/\"\n}\n"
  },
  {
    "path": "exercises/practice/perfect-numbers/.meta/proof.ci.ts",
    "content": "export function classify(n: number): string {\n  let i\n  let sum\n  let result\n\n  // Check if the input is valid\n  if (n <= 0) {\n    throw new Error('Classification is only possible for natural numbers.')\n  }\n\n  // Factorize the current number.\n  const divsArray = getDivisors(n)\n\n  // Sum the factors.\n  sum = 0\n  for (i = 0; i < divsArray.length; i++) {\n    sum = sum + divsArray[i]\n  }\n\n  // Check if the number is perfect.\n  if (sum === n) {\n    result = 'perfect'\n  } else if (sum > n) {\n    result = 'abundant'\n  } else {\n    result = 'deficient'\n  }\n\n  return result\n}\n\nfunction getDivisors(n: number): number[] {\n  const divs: number[] = []\n\n  // Accepts only natural numbers greater than 1.\n  if (n <= 1) {\n    return divs\n  }\n\n  // 1 always divides everyone!\n  divs.push(1)\n\n  // Calculate the divisors up the the half of the number + 1\n  for (let i = 2; i <= n / 2; i++) {\n    if (n % i === 0) {\n      divs.push(i)\n    }\n  }\n\n  return divs\n}\n"
  },
  {
    "path": "exercises/practice/perfect-numbers/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[163e8e86-7bfd-4ee2-bd68-d083dc3381a3]\ndescription = \"Perfect numbers -> Smallest perfect number is classified correctly\"\n\n[169a7854-0431-4ae0-9815-c3b6d967436d]\ndescription = \"Perfect numbers -> Medium perfect number is classified correctly\"\n\n[ee3627c4-7b36-4245-ba7c-8727d585f402]\ndescription = \"Perfect numbers -> Large perfect number is classified correctly\"\n\n[80ef7cf8-9ea8-49b9-8b2d-d9cb3db3ed7e]\ndescription = \"Abundant numbers -> Smallest abundant number is classified correctly\"\n\n[3e300e0d-1a12-4f11-8c48-d1027165ab60]\ndescription = \"Abundant numbers -> Medium abundant number is classified correctly\"\n\n[ec7792e6-8786-449c-b005-ce6dd89a772b]\ndescription = \"Abundant numbers -> Large abundant number is classified correctly\"\n\n[05f15b93-849c-45e9-9c7d-1ea131ef7d10]\ndescription = \"Abundant numbers -> Perfect square abundant number is classified correctly\"\n\n[e610fdc7-2b6e-43c3-a51c-b70fb37413ba]\ndescription = \"Deficient numbers -> Smallest prime deficient number is classified correctly\"\n\n[0beb7f66-753a-443f-8075-ad7fbd9018f3]\ndescription = \"Deficient numbers -> Smallest non-prime deficient number is classified correctly\"\n\n[1c802e45-b4c6-4962-93d7-1cad245821ef]\ndescription = \"Deficient numbers -> Medium deficient number is classified correctly\"\n\n[47dd569f-9e5a-4a11-9a47-a4e91c8c28aa]\ndescription = \"Deficient numbers -> Large deficient number is classified correctly\"\n\n[a696dec8-6147-4d68-afad-d38de5476a56]\ndescription = \"Deficient numbers -> Edge case (no factors other than itself) is classified correctly\"\n\n[72445cee-660c-4d75-8506-6c40089dc302]\ndescription = \"Invalid inputs -> Zero is rejected (as it is not a positive integer)\"\n\n[2d72ce2c-6802-49ac-8ece-c790ba3dae13]\ndescription = \"Invalid inputs -> Negative integer is rejected (as it is not a positive integer)\"\n"
  },
  {
    "path": "exercises/practice/perfect-numbers/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/perfect-numbers/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/perfect-numbers/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/perfect-numbers/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/perfect-numbers/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/perfect-numbers/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/perfect-numbers/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-perfect-numbers\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/perfect-numbers/perfect-numbers.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { classify } from './perfect-numbers.ts'\n\ndescribe('Perfect numbers', () => {\n  it('Smallest perfect number is classified correctly', () => {\n    const expected = 'perfect'\n    expect(classify(6)).toEqual(expected)\n  })\n\n  xit('Medium perfect number is classified correctly', () => {\n    const expected = 'perfect'\n    expect(classify(28)).toEqual(expected)\n  })\n\n  xit('Large perfect number is classified correctly', () => {\n    const expected = 'perfect'\n    expect(classify(33550336)).toEqual(expected)\n  })\n})\n\ndescribe('Abundant numbers', () => {\n  xit('Smallest abundant number is classified correctly', () => {\n    const expected = 'abundant'\n    expect(classify(12)).toEqual(expected)\n  })\n\n  xit('Medium abundant number is classified correctly', () => {\n    const expected = 'abundant'\n    expect(classify(30)).toEqual(expected)\n  })\n\n  xit('Large abundant number is classified correctly', () => {\n    const expected = 'abundant'\n    expect(classify(33550335)).toEqual(expected)\n  })\n\n  xit('Perfect square abundant number is classified correctly', () => {\n    const expected = 'abundant'\n    expect(classify(196)).toEqual(expected)\n  })\n})\n\ndescribe('Deficient numbers', () => {\n  xit('Smallest prime deficient number is classified correctly', () => {\n    const expected = 'deficient'\n    expect(classify(2)).toEqual(expected)\n  })\n\n  xit('Smallest non-prime deficient number is classified correctly', () => {\n    const expected = 'deficient'\n    expect(classify(4)).toEqual(expected)\n  })\n\n  xit('Medium deficient number is classified correctly', () => {\n    const expected = 'deficient'\n    expect(classify(32)).toEqual(expected)\n  })\n\n  xit('Large deficient number is classified correctly', () => {\n    const expected = 'deficient'\n    expect(classify(33550337)).toEqual(expected)\n  })\n\n  xit('Edge case (no factors other than itself) is classified correctly', () => {\n    const expected = 'deficient'\n    expect(classify(1)).toEqual(expected)\n  })\n})\n\ndescribe('Invalid inputs', () => {\n  xit('Zero is rejected (not a natural number)', () => {\n    expect(() => {\n      classify(0)\n    }).toThrow('Classification is only possible for natural numbers.')\n  })\n\n  xit('Negative integer is rejected (not a natural number)', () => {\n    expect(() => {\n      classify(-1)\n    }).toThrow('Classification is only possible for natural numbers.')\n  })\n})\n"
  },
  {
    "path": "exercises/practice/perfect-numbers/perfect-numbers.ts",
    "content": "export function classify() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/perfect-numbers/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/perfect-numbers/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/phone-number/.docs/instructions.md",
    "content": "# Instructions\n\nClean up phone numbers so that they can be sent SMS messages.\n\nThe **North American Numbering Plan (NANP)** is a telephone numbering system used by many countries in North America like the United States, Canada or Bermuda.\nAll NANP-countries share the same international country code: `1`.\n\nNANP numbers are ten-digit numbers consisting of a three-digit Numbering Plan Area code, commonly known as _area code_, followed by a seven-digit local number.\nThe first three digits of the local number represent the _exchange code_, followed by the unique four-digit number which is the _subscriber number_.\n\nThe format is usually represented as\n\n```text\nNXX NXX-XXXX\n```\n\nwhere `N` is any digit from 2 through 9 and `X` is any digit from 0 through 9.\n\nSometimes they also have the country code (represented as `1` or `+1`) prefixed.\n\nYour task is to clean up differently formatted telephone numbers by removing punctuation and the country code if present.\n\nFor example, the inputs\n\n- `+1 (613)-995-0253`\n- `613-995-0253`\n- `1 613 995 0253`\n- `613.995.0253`\n\nshould all produce the output\n\n`6139950253`\n\n**Note:** As this exercise only deals with telephone numbers used in NANP-countries, only 1 is considered a valid country code.\n"
  },
  {
    "path": "exercises/practice/phone-number/.docs/introduction.md",
    "content": "# Introduction\n\nYou've joined LinkLine, a leading communications company working to ensure reliable connections for everyone.\nThe team faces a big challenge: users submit phone numbers in all sorts of formats — dashes, spaces, dots, parentheses, and even prefixes.\nSome numbers are valid, while others are impossible to use.\n\nYour mission is to turn this chaos into order.\nYou'll clean up valid numbers, formatting them appropriately for use in the system.\nAt the same time, you'll identify and filter out any invalid entries.\n\nThe success of LinkLine's operations depends on your ability to separate the useful from the unusable.\nAre you ready to take on the challenge and keep the connections running smoothly?\n"
  },
  {
    "path": "exercises/practice/phone-number/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"masters3d\"\n  ],\n  \"contributors\": [\n    \"ffflorian\",\n    \"lukaszklis\",\n    \"SleeplessByte\",\n    \"snowfrogdev\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"phone-number.ts\"\n    ],\n    \"test\": [\n      \"phone-number.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Clean up user-entered phone numbers so that they can be sent SMS messages.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Exercise by the JumpstartLab team for students at The Turing School of Software and Design.\",\n  \"source_url\": \"https://www.turing.edu/\"\n}\n"
  },
  {
    "path": "exercises/practice/phone-number/.meta/proof.ci.ts",
    "content": "export const clean = (number: string): string => {\n  if (/[a-zA-Z]/.test(number)) {\n    throw new Error('Letters not permitted')\n  } else if (/[@:!]/.test(number)) {\n    throw new Error('Punctuations not permitted')\n  }\n\n  let strippedNumber = number.replace(/\\D/g, '')\n  const numberLength = strippedNumber.length\n\n  if (numberLength === 11) {\n    if (strippedNumber.substring(0, 1) !== '1') {\n      throw new Error('11 digits must start with 1')\n    } else {\n      strippedNumber = strippedNumber.substring(1)\n    }\n  }\n\n  if (numberLength < 10) {\n    throw new Error('Must not be fewer than 10 digits')\n  }\n\n  if (numberLength > 11) {\n    throw new Error('Must not be greater than 11 digits')\n  }\n\n  if (strippedNumber.substring(0, 1) === '0') {\n    throw new Error('Area code cannot start with zero')\n  } else if (strippedNumber.substring(0, 1) === '1') {\n    throw new Error('Area code cannot start with one')\n  }\n\n  if (strippedNumber.substring(3, 4) === '0') {\n    throw new Error('Exchange code cannot start with zero')\n  } else if (strippedNumber.substring(3, 4) === '1') {\n    throw new Error('Exchange code cannot start with one')\n  }\n\n  return strippedNumber\n}\n"
  },
  {
    "path": "exercises/practice/phone-number/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[79666dce-e0f1-46de-95a1-563802913c35]\ndescription = \"cleans the number\"\n\n[c360451f-549f-43e4-8aba-fdf6cb0bf83f]\ndescription = \"cleans numbers with dots\"\n\n[08f94c34-9a37-46a2-a123-2a8e9727395d]\ndescription = \"cleans numbers with multiple spaces\"\n\n[598d8432-0659-4019-a78b-1c6a73691d21]\ndescription = \"invalid when 9 digits\"\ninclude = false\n\n[2de74156-f646-42b5-8638-0ef1d8b58bc2]\ndescription = \"invalid when 9 digits\"\nreimplements = \"598d8432-0659-4019-a78b-1c6a73691d21\"\n\n[57061c72-07b5-431f-9766-d97da7c4399d]\ndescription = \"invalid when 11 digits does not start with a 1\"\n\n[9962cbf3-97bb-4118-ba9b-38ff49c64430]\ndescription = \"valid when 11 digits and starting with 1\"\n\n[fa724fbf-054c-4d91-95da-f65ab5b6dbca]\ndescription = \"valid when 11 digits and starting with 1 even with punctuation\"\n\n[c6a5f007-895a-4fc5-90bc-a7e70f9b5cad]\ndescription = \"invalid when more than 11 digits\"\ninclude = false\n\n[4a1509b7-8953-4eec-981b-c483358ff531]\ndescription = \"invalid when more than 11 digits\"\nreimplements = \"c6a5f007-895a-4fc5-90bc-a7e70f9b5cad\"\n\n[63f38f37-53f6-4a5f-bd86-e9b404f10a60]\ndescription = \"invalid with letters\"\ninclude = false\n\n[eb8a1fc0-64e5-46d3-b0c6-33184208e28a]\ndescription = \"invalid with letters\"\nreimplements = \"63f38f37-53f6-4a5f-bd86-e9b404f10a60\"\n\n[4bd97d90-52fd-45d3-b0db-06ab95b1244e]\ndescription = \"invalid with punctuations\"\ninclude = false\n\n[065f6363-8394-4759-b080-e6c8c351dd1f]\ndescription = \"invalid with punctuations\"\nreimplements = \"4bd97d90-52fd-45d3-b0db-06ab95b1244e\"\n\n[d77d07f8-873c-4b17-8978-5f66139bf7d7]\ndescription = \"invalid if area code starts with 0\"\n\n[c7485cfb-1e7b-4081-8e96-8cdb3b77f15e]\ndescription = \"invalid if area code starts with 1\"\n\n[4d622293-6976-413d-b8bf-dd8a94d4e2ac]\ndescription = \"invalid if exchange code starts with 0\"\n\n[4cef57b4-7d8e-43aa-8328-1e1b89001262]\ndescription = \"invalid if exchange code starts with 1\"\n\n[9925b09c-1a0d-4960-a197-5d163cbe308c]\ndescription = \"invalid if area code starts with 0 on valid 11-digit number\"\n\n[3f809d37-40f3-44b5-ad90-535838b1a816]\ndescription = \"invalid if area code starts with 1 on valid 11-digit number\"\n\n[e08e5532-d621-40d4-b0cc-96c159276b65]\ndescription = \"invalid if exchange code starts with 0 on valid 11-digit number\"\n\n[57b32f3d-696a-455c-8bf1-137b6d171cdf]\ndescription = \"invalid if exchange code starts with 1 on valid 11-digit number\"\n"
  },
  {
    "path": "exercises/practice/phone-number/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/phone-number/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/phone-number/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/phone-number/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/phone-number/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/phone-number/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/phone-number/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-phone-number\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/phone-number/phone-number.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { clean } from './phone-number.ts'\n\ndescribe('Phone Number', () => {\n  describe('Cleanup user-entered phone numbers', () => {\n    it('cleans the number', () => {\n      expect(clean('(223) 456-7890')).toEqual('2234567890')\n    })\n\n    xit('cleans numbers with dots', () => {\n      expect(clean('223.456.7890')).toEqual('2234567890')\n    })\n\n    xit('cleans numbers with multiple spaces', () => {\n      expect(clean('223 456   7890   ')).toEqual('2234567890')\n    })\n\n    xit('invalid when 9 digits', () => {\n      expect(() => clean('123456789')).toThrow(\n        new Error('Must not be fewer than 10 digits')\n      )\n    })\n\n    xit('invalid when 11 digits does not start with a 1', () => {\n      expect(() => clean('22234567890')).toThrow(\n        new Error('11 digits must start with 1')\n      )\n    })\n\n    xit('valid when 11 digits and starting with 1', () => {\n      expect(clean('12234567890')).toEqual('2234567890')\n    })\n\n    xit('valid when 11 digits and starting with 1 even with punctuation', () => {\n      expect(clean('+1 (223) 456-7890')).toEqual('2234567890')\n    })\n\n    xit('invalid when more than 11 digits', () => {\n      expect(() => clean('321234567890')).toThrow(\n        new Error('Must not be greater than 11 digits')\n      )\n    })\n\n    xit('invalid with letters', () => {\n      expect(() => clean('523-abc-7890')).toThrow(\n        new Error('Letters not permitted')\n      )\n    })\n\n    xit('invalid with punctuations', () => {\n      expect(() => clean('523-@:!-7890')).toThrow(\n        new Error('Punctuations not permitted')\n      )\n    })\n\n    xit('invalid if area code starts with 0', () => {\n      expect(() => clean('(023) 456-7890')).toThrow(\n        new Error('Area code cannot start with zero')\n      )\n    })\n\n    xit('invalid if area code starts with 1', () => {\n      expect(() => clean('(123) 456-7890')).toThrow(\n        new Error('Area code cannot start with one')\n      )\n    })\n\n    xit('invalid if exchange code starts with 0', () => {\n      expect(() => clean('(223) 056-7890')).toThrow(\n        new Error('Exchange code cannot start with zero')\n      )\n    })\n\n    xit('invalid if exchange code starts with 1', () => {\n      expect(() => clean('(223) 156-7890')).toThrow(\n        new Error('Exchange code cannot start with one')\n      )\n    })\n\n    xit('invalid if area code starts with 0 on valid 11-digit number', () => {\n      expect(() => clean('1 (023) 456-7890')).toThrow(\n        new Error('Area code cannot start with zero')\n      )\n    })\n\n    xit('invalid if area code starts with 1 on valid 11-digit number', () => {\n      expect(() => clean('1 (123) 456-7890')).toThrow(\n        new Error('Area code cannot start with one')\n      )\n    })\n\n    xit('invalid if exchange code starts with 0 on valid 11-digit number', () => {\n      expect(() => clean('1 (223) 056-7890')).toThrow(\n        new Error('Exchange code cannot start with zero')\n      )\n    })\n\n    xit('invalid if exchange code starts with 1 on valid 11-digit number', () => {\n      expect(() => clean('1 (223) 156-7890')).toThrow(\n        new Error('Exchange code cannot start with one')\n      )\n    })\n  })\n})\n"
  },
  {
    "path": "exercises/practice/phone-number/phone-number.ts",
    "content": "export function clean() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/phone-number/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/phone-number/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/pig-latin/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to translate text from English to Pig Latin.\nThe translation is defined using four rules, which look at the pattern of vowels and consonants at the beginning of a word.\nThese rules look at each word's use of vowels and consonants:\n\n- vowels: the letters `a`, `e`, `i`, `o`, and `u`\n- consonants: the other 21 letters of the English alphabet\n\n## Rule 1\n\nIf a word begins with a vowel, or starts with `\"xr\"` or `\"yt\"`, add an `\"ay\"` sound to the end of the word.\n\nFor example:\n\n- `\"apple\"` -> `\"appleay\"` (starts with vowel)\n- `\"xray\"` -> `\"xrayay\"` (starts with `\"xr\"`)\n- `\"yttria\"` -> `\"yttriaay\"` (starts with `\"yt\"`)\n\n## Rule 2\n\nIf a word begins with one or more consonants, first move those consonants to the end of the word and then add an `\"ay\"` sound to the end of the word.\n\nFor example:\n\n- `\"pig\"` -> `\"igp\"` -> `\"igpay\"` (starts with single consonant)\n- `\"chair\"` -> `\"airch\"` -> `\"airchay\"` (starts with multiple consonants)\n- `\"thrush\"` -> `\"ushthr\"` -> `\"ushthray\"` (starts with multiple consonants)\n\n## Rule 3\n\nIf a word starts with zero or more consonants followed by `\"qu\"`, first move those consonants (if any) and the `\"qu\"` part to the end of the word, and then add an `\"ay\"` sound to the end of the word.\n\nFor example:\n\n- `\"quick\"` -> `\"ickqu\"` -> `\"ickquay\"` (starts with `\"qu\"`, no preceding consonants)\n- `\"square\"` -> `\"aresqu\"` -> `\"aresquay\"` (starts with one consonant followed by `\"qu`\")\n\n## Rule 4\n\nIf a word starts with one or more consonants followed by `\"y\"`, first move the consonants preceding the `\"y\"`to the end of the word, and then add an `\"ay\"` sound to the end of the word.\n\nSome examples:\n\n- `\"my\"` -> `\"ym\"` -> `\"ymay\"` (starts with single consonant followed by `\"y\"`)\n- `\"rhythm\"` -> `\"ythmrh\"` -> `\"ythmrhay\"` (starts with multiple consonants followed by `\"y\"`)\n"
  },
  {
    "path": "exercises/practice/pig-latin/.docs/introduction.md",
    "content": "# Introduction\n\nYour parents have challenged you and your sibling to a game of two-on-two basketball.\nConfident they'll win, they let you score the first couple of points, but then start taking over the game.\nNeeding a little boost, you start speaking in [Pig Latin][pig-latin], which is a made-up children's language that's difficult for non-children to understand.\nThis will give you the edge to prevail over your parents!\n\n[pig-latin]: https://en.wikipedia.org/wiki/Pig_latin\n"
  },
  {
    "path": "exercises/practice/pig-latin/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"pig-latin.ts\"\n    ],\n    \"test\": [\n      \"pig-latin.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Implement a program that translates from English to Pig Latin.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"The Pig Latin exercise at Test First Teaching by Ultrasaurus\",\n  \"source_url\": \"https://github.com/ultrasaurus/test-first-teaching/tree/master/learn_ruby/pig_latin\"\n}\n"
  },
  {
    "path": "exercises/practice/pig-latin/.meta/proof.ci.ts",
    "content": "export function translate(phrase: string): string {\n  const words = phrase.split(' ')\n  const translated: string[] = []\n\n  words.forEach((word) => {\n    const parts = word.match(/^([^aeiou]?qu|[^aeiou]*)(.+)/)\n    const beginning = parts![1]\n    const ending = parts![2]\n\n    if (beginning.length === 0) {\n      translated.push(`${word}ay`)\n    } else {\n      translated.push(`${ending}${beginning}ay`)\n    }\n  })\n\n  return translated.join(' ')\n}\n"
  },
  {
    "path": "exercises/practice/pig-latin/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[11567f84-e8c6-4918-aedb-435f0b73db57]\ndescription = \"ay is added to words that start with vowels -> word beginning with a\"\n\n[f623f581-bc59-4f45-9032-90c3ca9d2d90]\ndescription = \"ay is added to words that start with vowels -> word beginning with e\"\n\n[7dcb08b3-23a6-4e8a-b9aa-d4e859450d58]\ndescription = \"ay is added to words that start with vowels -> word beginning with i\"\n\n[0e5c3bff-266d-41c8-909f-364e4d16e09c]\ndescription = \"ay is added to words that start with vowels -> word beginning with o\"\n\n[614ba363-ca3c-4e96-ab09-c7320799723c]\ndescription = \"ay is added to words that start with vowels -> word beginning with u\"\n\n[bf2538c6-69eb-4fa7-a494-5a3fec911326]\ndescription = \"ay is added to words that start with vowels -> word beginning with a vowel and followed by a qu\"\n\n[e5be8a01-2d8a-45eb-abb4-3fcc9582a303]\ndescription = \"first letter and ay are moved to the end of words that start with consonants -> word beginning with p\"\n\n[d36d1e13-a7ed-464d-a282-8820cb2261ce]\ndescription = \"first letter and ay are moved to the end of words that start with consonants -> word beginning with k\"\n\n[d838b56f-0a89-4c90-b326-f16ff4e1dddc]\ndescription = \"first letter and ay are moved to the end of words that start with consonants -> word beginning with x\"\n\n[bce94a7a-a94e-4e2b-80f4-b2bb02e40f71]\ndescription = \"first letter and ay are moved to the end of words that start with consonants -> word beginning with q without a following u\"\n\n[e59dbbe8-ccee-4619-a8e9-ce017489bfc0]\ndescription = \"first letter and ay are moved to the end of words that start with consonants -> word beginning with consonant and vowel containing qu\"\n\n[c01e049a-e3e2-451c-bf8e-e2abb7e438b8]\ndescription = \"some letter clusters are treated like a single consonant -> word beginning with ch\"\n\n[9ba1669e-c43f-4b93-837a-cfc731fd1425]\ndescription = \"some letter clusters are treated like a single consonant -> word beginning with qu\"\n\n[92e82277-d5e4-43d7-8dd3-3a3b316c41f7]\ndescription = \"some letter clusters are treated like a single consonant -> word beginning with qu and a preceding consonant\"\n\n[79ae4248-3499-4d5b-af46-5cb05fa073ac]\ndescription = \"some letter clusters are treated like a single consonant -> word beginning with th\"\n\n[e0b3ae65-f508-4de3-8999-19c2f8e243e1]\ndescription = \"some letter clusters are treated like a single consonant -> word beginning with thr\"\n\n[20bc19f9-5a35-4341-9d69-1627d6ee6b43]\ndescription = \"some letter clusters are treated like a single consonant -> word beginning with sch\"\n\n[54b796cb-613d-4509-8c82-8fbf8fc0af9e]\ndescription = \"some letter clusters are treated like a single vowel -> word beginning with yt\"\n\n[8c37c5e1-872e-4630-ba6e-d20a959b67f6]\ndescription = \"some letter clusters are treated like a single vowel -> word beginning with xr\"\n\n[a4a36d33-96f3-422c-a233-d4021460ff00]\ndescription = \"position of y in a word determines if it is a consonant or a vowel -> y is treated like a consonant at the beginning of a word\"\n\n[adc90017-1a12-4100-b595-e346105042c7]\ndescription = \"position of y in a word determines if it is a consonant or a vowel -> y is treated like a vowel at the end of a consonant cluster\"\n\n[29b4ca3d-efe5-4a95-9a54-8467f2e5e59a]\ndescription = \"position of y in a word determines if it is a consonant or a vowel -> y as second letter in two letter word\"\n\n[44616581-5ce3-4a81-82d0-40c7ab13d2cf]\ndescription = \"phrases are translated -> a whole phrase\"\n"
  },
  {
    "path": "exercises/practice/pig-latin/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/pig-latin/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/pig-latin/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/pig-latin/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/pig-latin/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/pig-latin/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/pig-latin/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-pig-latin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/pig-latin/pig-latin.test.ts",
    "content": "import { describe, xdescribe, it, expect, xit } from '@jest/globals'\nimport { translate } from './pig-latin.ts'\n\ndescribe('ay is added to words that start with vowels', () => {\n  it('word beginning with a', () => {\n    const expected = 'appleay'\n    expect(translate('apple')).toEqual(expected)\n  })\n\n  xit('word beginning with e', () => {\n    const expected = 'earay'\n    expect(translate('ear')).toEqual(expected)\n  })\n\n  xit('word beginning with i', () => {\n    const expected = 'iglooay'\n    expect(translate('igloo')).toEqual(expected)\n  })\n\n  xit('word beginning with o', () => {\n    const expected = 'objectay'\n    expect(translate('object')).toEqual(expected)\n  })\n\n  xit('word beginning with u', () => {\n    const expected = 'underay'\n    expect(translate('under')).toEqual(expected)\n  })\n\n  xit('word beginning with a vowel and followed by a qu', () => {\n    const expected = 'equalay'\n    expect(translate('equal')).toEqual(expected)\n  })\n})\n\nxdescribe('first letter and ay are moved to the end of words that start with consonants', () => {\n  xit('word beginning with p', () => {\n    const expected = 'igpay'\n    expect(translate('pig')).toEqual(expected)\n  })\n\n  xit('word beginning with k', () => {\n    const expected = 'oalakay'\n    expect(translate('koala')).toEqual(expected)\n  })\n\n  xit('word beginning with x', () => {\n    const expected = 'enonxay'\n    expect(translate('xenon')).toEqual(expected)\n  })\n\n  xit('word beginning with q without a following u', () => {\n    const expected = 'atqay'\n    expect(translate('qat')).toEqual(expected)\n  })\n\n  xit('word beginning with consonant and vowel containing qu', () => {\n    const expected = 'iquidlay'\n    expect(translate('liquid')).toEqual(expected)\n  })\n})\n\nxdescribe('some letter clusters are treated like a single consonant', () => {\n  xit('word beginning with ch', () => {\n    const expected = 'airchay'\n    expect(translate('chair')).toEqual(expected)\n  })\n\n  xit('word beginning with qu', () => {\n    const expected = 'eenquay'\n    expect(translate('queen')).toEqual(expected)\n  })\n\n  xit('word beginning with qu and a preceding consonant', () => {\n    const expected = 'aresquay'\n    expect(translate('square')).toEqual(expected)\n  })\n\n  xit('word beginning with th', () => {\n    const expected = 'erapythay'\n    expect(translate('therapy')).toEqual(expected)\n  })\n\n  xit('word beginning with thr', () => {\n    const expected = 'ushthray'\n    expect(translate('thrush')).toEqual(expected)\n  })\n\n  xit('word beginning with sch', () => {\n    const expected = 'oolschay'\n    expect(translate('school')).toEqual(expected)\n  })\n})\n\nxdescribe('position of y in a word determines if it is a consonant or a vowel', () => {\n  xit('y is treated like a consonant at the beginning of a word', () => {\n    const expected = 'ellowyay'\n    expect(translate('yellow')).toEqual(expected)\n  })\n\n  xit('y as second letter in two letter word', () => {\n    const expected = 'ymay'\n    expect(translate('my')).toEqual(expected)\n  })\n})\n\nxdescribe('phrases are translated', () => {\n  xit('a whole phrase', () => {\n    const expected = 'ickquay astfay unray'\n    expect(translate('quick fast run')).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/pig-latin/pig-latin.ts",
    "content": "export function translate() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/pig-latin/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/pig-latin/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/prime-factors/.docs/instructions.md",
    "content": "# Instructions\n\nCompute the prime factors of a given natural number.\n\nA prime number is only evenly divisible by itself and 1.\n\nNote that 1 is not a prime number.\n\n## Example\n\nWhat are the prime factors of 60?\n\n- Our first divisor is 2.\n  2 goes into 60, leaving 30.\n- 2 goes into 30, leaving 15.\n  - 2 doesn't go cleanly into 15.\n    So let's move on to our next divisor, 3.\n- 3 goes cleanly into 15, leaving 5.\n  - 3 does not go cleanly into 5.\n    The next possible factor is 4.\n  - 4 does not go cleanly into 5.\n    The next possible factor is 5.\n- 5 does go cleanly into 5.\n- We're left only with 1, so now, we're done.\n\nOur successful divisors in that computation represent the list of prime factors of 60: 2, 2, 3, and 5.\n\nYou can check this yourself:\n\n```text\n2 * 2 * 3 * 5\n= 4 * 15\n= 60\n```\n\nSuccess!\n"
  },
  {
    "path": "exercises/practice/prime-factors/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"jspengeman\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"prime-factors.ts\"\n    ],\n    \"test\": [\n      \"prime-factors.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Compute the prime factors of a given natural number.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"The Prime Factors Kata by Uncle Bob\",\n  \"source_url\": \"https://web.archive.org/web/20221026171801/http://butunclebob.com/ArticleS.UncleBob.ThePrimeFactorsKata\"\n}\n"
  },
  {
    "path": "exercises/practice/prime-factors/.meta/proof.ci.ts",
    "content": "export function calculatePrimeFactors(num: number): number[] {\n  const factors = []\n  let currentFactor = 2\n  while (num !== 1) {\n    if (num % currentFactor === 0) {\n      factors.push(currentFactor)\n      num /= currentFactor\n      currentFactor = 2\n    } else {\n      currentFactor++\n    }\n  }\n  return factors\n}\n"
  },
  {
    "path": "exercises/practice/prime-factors/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[924fc966-a8f5-4288-82f2-6b9224819ccd]\ndescription = \"no factors\"\n\n[17e30670-b105-4305-af53-ddde182cb6ad]\ndescription = \"prime number\"\n\n[238d57c8-4c12-42ef-af34-ae4929f94789]\ndescription = \"another prime number\"\n\n[f59b8350-a180-495a-8fb1-1712fbee1158]\ndescription = \"square of a prime\"\n\n[756949d3-3158-4e3d-91f2-c4f9f043ee70]\ndescription = \"product of first prime\"\n\n[bc8c113f-9580-4516-8669-c5fc29512ceb]\ndescription = \"cube of a prime\"\n\n[7d6a3300-a4cb-4065-bd33-0ced1de6cb44]\ndescription = \"product of second prime\"\n\n[073ac0b2-c915-4362-929d-fc45f7b9a9e4]\ndescription = \"product of third prime\"\n\n[6e0e4912-7fb6-47f3-a9ad-dbcd79340c75]\ndescription = \"product of first and second prime\"\n\n[00485cd3-a3fe-4fbe-a64a-a4308fc1f870]\ndescription = \"product of primes and non-primes\"\n\n[02251d54-3ca1-4a9b-85e1-b38f4b0ccb91]\ndescription = \"product of primes\"\n\n[070cf8dc-e202-4285-aa37-8d775c9cd473]\ndescription = \"factors include a large prime\"\n"
  },
  {
    "path": "exercises/practice/prime-factors/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/prime-factors/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/prime-factors/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/prime-factors/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/prime-factors/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/prime-factors/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/prime-factors/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-prime-factors\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/prime-factors/prime-factors.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { calculatePrimeFactors } from './prime-factors.ts'\n\ndescribe('calculatePrimeFactors', () => {\n  it('returns an empty array for 1', () =>\n    expect(calculatePrimeFactors(1)).toEqual([]))\n\n  xit('factors 2', () => expect(calculatePrimeFactors(2)).toEqual([2]))\n\n  xit('factors 3', () => expect(calculatePrimeFactors(3)).toEqual([3]))\n\n  xit('factors 4', () => expect(calculatePrimeFactors(4)).toEqual([2, 2]))\n\n  xit('factors 6', () => expect(calculatePrimeFactors(6)).toEqual([2, 3]))\n\n  xit('factors 8', () => expect(calculatePrimeFactors(8)).toEqual([2, 2, 2]))\n\n  xit('factors 9', () => expect(calculatePrimeFactors(9)).toEqual([3, 3]))\n\n  xit('factors 12', () => expect(calculatePrimeFactors(12)).toEqual([2, 2, 3]))\n\n  xit('factors 27', () => expect(calculatePrimeFactors(27)).toEqual([3, 3, 3]))\n\n  xit('factors 625', () =>\n    expect(calculatePrimeFactors(625)).toEqual([5, 5, 5, 5]))\n\n  xit('factors 901255', () =>\n    expect(calculatePrimeFactors(901255)).toEqual([5, 17, 23, 461]))\n\n  xit('factors 93819012551', () =>\n    expect(calculatePrimeFactors(93819012551)).toEqual([11, 9539, 894119]))\n})\n"
  },
  {
    "path": "exercises/practice/prime-factors/prime-factors.ts",
    "content": "export function calculatePrimeFactors() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/prime-factors/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/prime-factors/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/prism/.docs/instructions.md",
    "content": "# Instructions\n\nBefore activating the laser array, you must predict the exact order in which crystals will be hit, identified by their sample IDs.\n\n## Example Test Case\n\nConsider this crystal array configuration:\n\n```json\n{\n  \"start\": { \"x\": 0, \"y\": 0, \"angle\": 0 },\n  \"prisms\": [\n    { \"id\": 3, \"x\": 30, \"y\": 10, \"angle\": 45 },\n    { \"id\": 1, \"x\": 10, \"y\": 10, \"angle\": -90 },\n    { \"id\": 2, \"x\": 10, \"y\": 0, \"angle\": 90 },\n    { \"id\": 4, \"x\": 20, \"y\": 0, \"angle\": 0 }\n  ]\n}\n```\n\n## What's Happening\n\nThe laser starts at the origin `(0, 0)` and fires horizontally to the right at angle 0°.\nHere's the step-by-step beam path:\n\n**Step 1**: The beam travels along the x-axis (y = 0) and first encounters **Crystal #2** at position `(10, 0)`.\nThis crystal has a refraction angle of 90°, which means it bends the beam perpendicular to its current path.\nThe beam, originally traveling at 0°, is now redirected to 90° (straight up).\n\n**Step 2**: The beam now travels vertically upward from position `(10, 0)` and strikes **Crystal #1** at position `(10, 10)`.\nThis crystal has a refraction angle of -90°, bending the beam by -90° relative to its current direction.\nThe beam was traveling at 90°, so after refraction it's now at 0° (90° + (-90°) = 0°), traveling horizontally to the right again.\n\n**Step 3**: From position `(10, 10)`, the beam travels horizontally and encounters **Crystal #3** at position `(30, 10)`.\nThis crystal refracts the beam by 45°, changing its direction to 45°.\nThe beam continues into empty space beyond the array.\n"
  },
  {
    "path": "exercises/practice/prism/.docs/introduction.md",
    "content": "# Introduction\n\nYou're a researcher at **PRISM** (Precariously Redirected Illumination Safety Management), working with a precision laser calibration system that tests experimental crystal prisms.\nThese crystals are being developed for next-generation optical computers, and each one has unique refractive properties based on its molecular structure.\nThe lab's laser system can damage crystals if they receive unexpected illumination, so precise path prediction is critical.\n"
  },
  {
    "path": "exercises/practice/prism/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"BNAndras\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"prism.ts\"\n    ],\n    \"test\": [\n      \"prism.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Calculate the path of a laser through reflective prisms.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"FraSanga\",\n  \"source_url\": \"https://github.com/exercism/problem-specifications/pull/2625\"\n}\n"
  },
  {
    "path": "exercises/practice/prism/.meta/proof.ci.ts",
    "content": "type Point = {\n  x: number\n  y: number\n  angle: number\n}\n\ntype Prism = Point & {\n  id: number\n}\n\nexport const findSequence = (start: Point, prisms: Prism[]): number[] => {\n  let { x, y, angle } = start\n  const sequence = []\n\n  while (true) {\n    const rad = (angle * Math.PI) / 180\n    const dirX = Math.cos(rad)\n    const dirY = Math.sin(rad)\n\n    let nearest: Prism\n    let nearestDist = Infinity\n\n    for (const prism of prisms) {\n      const dx = prism.x - x\n      const dy = prism.y - y\n\n      const dist = dx * dirX + dy * dirY\n      const baseTolerance = 1e-6\n      if (dist <= baseTolerance) continue\n\n      const crossProductSquared =\n        (dx - dist * dirX) ** 2 + (dy - dist * dirY) ** 2\n      const relativeTolerance = baseTolerance * Math.max(1, dist * dist)\n      if (crossProductSquared >= relativeTolerance) continue\n\n      if (dist < nearestDist) {\n        nearestDist = dist\n        nearest = prism\n      }\n    }\n\n    if (!nearest) break\n\n    sequence.push(nearest.id)\n    x = nearest.x\n    y = nearest.y\n    angle = (angle + nearest.angle) % 360\n  }\n\n  return sequence\n}\n"
  },
  {
    "path": "exercises/practice/prism/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[ec65d3b3-f7bf-4015-8156-0609c141c4c4]\ndescription = \"zero prisms\"\n\n[ec0ca17c-0c5f-44fb-89ba-b76395bdaf1c]\ndescription = \"one prism one hit\"\n\n[0db955f2-0a27-4c82-ba67-197bd6202069]\ndescription = \"one prism zero hits\"\n\n[8d92485b-ebc0-4ee9-9b88-cdddb16b52da]\ndescription = \"going up zero hits\"\n\n[78295b3c-7438-492d-8010-9c63f5c223d7]\ndescription = \"going down zero hits\"\n\n[acc723ea-597b-4a50-8d1b-b980fe867d4c]\ndescription = \"going left zero hits\"\n\n[3f19b9df-9eaa-4f18-a2db-76132f466d17]\ndescription = \"negative angle\"\n\n[96dacffb-d821-4cdf-aed8-f152ce063195]\ndescription = \"large angle\"\n\n[513a7caa-957f-4c5d-9820-076842de113c]\ndescription = \"upward refraction two hits\"\n\n[d452b7c7-9761-4ea9-81a9-2de1d73eb9ef]\ndescription = \"downward refraction two hits\"\n\n[be1a2167-bf4c-4834-acc9-e4d68e1a0203]\ndescription = \"same prism twice\"\n\n[df5a60dd-7c7d-4937-ac4f-c832dae79e2e]\ndescription = \"simple path\"\n\n[8d9a3cc8-e846-4a3b-a137-4bfc4aa70bd1]\ndescription = \"multiple prisms floating point precision\"\n\n[e077fc91-4e4a-46b3-a0f5-0ba00321da56]\ndescription = \"complex path with multiple prisms floating point precision\"\n"
  },
  {
    "path": "exercises/practice/prism/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/prism/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/prism/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/prism/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/prism/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/prism/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/prism/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-prism\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/prism/prism.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { findSequence } from './prism.ts'\n\ndescribe('Prism', () => {\n  it('zero prisms', () => {\n    const start = { x: 0, y: 0, angle: 0 }\n    const prisms: { id: number; x: number; y: number; angle: number }[] = []\n    const result = findSequence(start, prisms)\n    const expected: number[] = []\n    expect(result).toEqual(expected)\n  })\n\n  xit('one prism one hit', () => {\n    const start = { x: 0, y: 0, angle: 0 }\n    const prisms = [{ id: 1, x: 10, y: 0, angle: 0 }]\n    const result = findSequence(start, prisms)\n    const expected = [1]\n    expect(result).toEqual(expected)\n  })\n\n  xit('one prism zero hits', () => {\n    const start = { x: 0, y: 0, angle: 0 }\n    const prisms = [{ id: 1, x: -10, y: 0, angle: 0 }]\n    const result = findSequence(start, prisms)\n    const expected: number[] = []\n    expect(result).toEqual(expected)\n  })\n\n  xit('going up zero hits', () => {\n    const start = { x: 0, y: 0, angle: 90 }\n    const prisms = [\n      { id: 3, x: 0, y: -10, angle: 0 },\n      { id: 1, x: -10, y: 0, angle: 0 },\n      { id: 2, x: 10, y: 0, angle: 0 },\n    ]\n    const result = findSequence(start, prisms)\n    const expected: number[] = []\n    expect(result).toEqual(expected)\n  })\n\n  xit('going down zero hits', () => {\n    const start = { x: 0, y: 0, angle: -90 }\n    const prisms = [\n      { id: 1, x: 10, y: 0, angle: 0 },\n      { id: 2, x: 0, y: 10, angle: 0 },\n      { id: 3, x: -10, y: 0, angle: 0 },\n    ]\n    const result = findSequence(start, prisms)\n    const expected: number[] = []\n    expect(result).toEqual(expected)\n  })\n\n  xit('going left zero hits', () => {\n    const start = { x: 0, y: 0, angle: 180 }\n    const prisms = [\n      { id: 2, x: 0, y: 10, angle: 0 },\n      { id: 3, x: 10, y: 0, angle: 0 },\n      { id: 1, x: 0, y: -10, angle: 0 },\n    ]\n    const result = findSequence(start, prisms)\n    const expected: number[] = []\n    expect(result).toEqual(expected)\n  })\n\n  xit('negative angle', () => {\n    const start = { x: 0, y: 0, angle: -180 }\n    const prisms = [\n      { id: 1, x: 0, y: -10, angle: 0 },\n      { id: 2, x: 0, y: 10, angle: 0 },\n      { id: 3, x: 10, y: 0, angle: 0 },\n    ]\n    const result = findSequence(start, prisms)\n    const expected: number[] = []\n    expect(result).toEqual(expected)\n  })\n\n  xit('large angle', () => {\n    const start = { x: 0, y: 0, angle: 2340 }\n    const prisms = [{ id: 1, x: 10, y: 0, angle: 0 }]\n    const result = findSequence(start, prisms)\n    const expected: number[] = []\n    expect(result).toEqual(expected)\n  })\n\n  xit('upward refraction two hits', () => {\n    const start = { x: 0, y: 0, angle: 0 }\n    const prisms = [\n      { id: 1, x: 10, y: 10, angle: 0 },\n      { id: 2, x: 10, y: 0, angle: 90 },\n    ]\n    const result = findSequence(start, prisms)\n    const expected = [2, 1]\n    expect(result).toEqual(expected)\n  })\n\n  xit('downward refraction two hits', () => {\n    const start = { x: 0, y: 0, angle: 0 }\n    const prisms = [\n      { id: 1, x: 10, y: 0, angle: -90 },\n      { id: 2, x: 10, y: -10, angle: 0 },\n    ]\n    const result = findSequence(start, prisms)\n    const expected = [1, 2]\n    expect(result).toEqual(expected)\n  })\n\n  xit('same prism twice', () => {\n    const start = { x: 0, y: 0, angle: 0 }\n    const prisms = [\n      { id: 2, x: 10, y: 0, angle: 0 },\n      { id: 1, x: 20, y: 0, angle: -180 },\n    ]\n    const result = findSequence(start, prisms)\n    const expected = [2, 1, 2]\n    expect(result).toEqual(expected)\n  })\n\n  xit('simple path', () => {\n    const start = { x: 0, y: 0, angle: 0 }\n    const prisms = [\n      { id: 3, x: 30, y: 10, angle: 45 },\n      { id: 1, x: 10, y: 10, angle: -90 },\n      { id: 2, x: 10, y: 0, angle: 90 },\n      { id: 4, x: 20, y: 0, angle: 0 },\n    ]\n    const result = findSequence(start, prisms)\n    const expected = [2, 1, 3]\n    expect(result).toEqual(expected)\n  })\n\n  xit('multiple prisms floating point precision', () => {\n    const start = { x: 0, y: 0, angle: -6.429 }\n    const prisms = [\n      { id: 26, x: 5.8, y: 73.4, angle: 6.555 },\n      { id: 24, x: 36.2, y: 65.2, angle: -0.304 },\n      { id: 20, x: 20.4, y: 82.8, angle: 45.17 },\n      { id: 31, x: -20.2, y: 48.8, angle: 30.615 },\n      { id: 30, x: 24.0, y: 0.6, angle: 28.771 },\n      { id: 29, x: 31.4, y: 79.4, angle: 61.327 },\n      { id: 28, x: 36.4, y: 31.4, angle: -18.157 },\n      { id: 22, x: 47.0, y: 57.8, angle: 54.745 },\n      { id: 38, x: 36.4, y: 79.2, angle: 49.05 },\n      { id: 10, x: 37.8, y: 55.2, angle: 11.978 },\n      { id: 18, x: -26.0, y: 42.6, angle: 22.661 },\n      { id: 25, x: 38.8, y: 76.2, angle: 51.958 },\n      { id: 2, x: 0.0, y: 42.4, angle: -21.817 },\n      { id: 35, x: 21.4, y: 44.8, angle: -171.579 },\n      { id: 7, x: 14.2, y: -1.6, angle: 19.081 },\n      { id: 33, x: 11.2, y: 44.4, angle: -165.941 },\n      { id: 11, x: 15.4, y: 82.6, angle: 66.262 },\n      { id: 16, x: 30.8, y: 6.6, angle: 35.852 },\n      { id: 15, x: -3.0, y: 79.2, angle: 53.782 },\n      { id: 4, x: 29.0, y: 75.4, angle: 17.016 },\n      { id: 23, x: 41.6, y: 59.8, angle: 70.763 },\n      { id: 8, x: -10.0, y: 15.8, angle: -9.24 },\n      { id: 13, x: 48.6, y: 51.8, angle: 45.812 },\n      { id: 1, x: 13.2, y: 77.0, angle: 17.937 },\n      { id: 34, x: -8.8, y: 36.8, angle: -4.199 },\n      { id: 21, x: 24.4, y: 75.8, angle: 20.783 },\n      { id: 17, x: -4.4, y: 74.6, angle: 24.709 },\n      { id: 9, x: 30.8, y: 41.8, angle: -165.413 },\n      { id: 32, x: 4.2, y: 78.6, angle: 40.892 },\n      { id: 37, x: -15.8, y: 47.0, angle: 33.29 },\n      { id: 6, x: 1.0, y: 80.6, angle: 51.295 },\n      { id: 36, x: -27.0, y: 47.8, angle: 92.52 },\n      { id: 14, x: -2.0, y: 34.4, angle: -52.001 },\n      { id: 5, x: 23.2, y: 80.2, angle: 31.866 },\n      { id: 27, x: -5.6, y: 32.8, angle: -75.303 },\n      { id: 12, x: -1.0, y: 0.2, angle: 0.0 },\n      { id: 3, x: -6.6, y: 3.2, angle: 46.72 },\n      { id: 19, x: -13.8, y: 24.2, angle: -9.205 },\n    ]\n    const result = findSequence(start, prisms)\n    const expected = [\n      7, 30, 16, 28, 13, 22, 23, 10, 9, 24, 25, 38, 29, 4, 35, 21, 5, 20, 11, 1,\n      33, 26, 32, 6, 15, 17, 2, 14, 27, 34, 37, 31, 36, 18, 19, 8, 3, 12,\n    ]\n    expect(result).toEqual(expected)\n  })\n\n  xit('complex path with multiple prisms floating point precision', () => {\n    const start = { x: 0, y: 0, angle: 0.0 }\n    const prisms = [\n      { id: 46, x: 37.4, y: 20.6, angle: -88.332 },\n      { id: 72, x: -24.2, y: 23.4, angle: -90.774 },\n      { id: 25, x: 78.6, y: 7.8, angle: 98.562 },\n      { id: 60, x: -58.8, y: 31.6, angle: 115.56 },\n      { id: 22, x: 75.2, y: 28.0, angle: 63.515 },\n      { id: 2, x: 89.8, y: 27.8, angle: 91.176 },\n      { id: 23, x: 9.8, y: 30.8, angle: 30.829 },\n      { id: 69, x: 22.8, y: 20.6, angle: -88.315 },\n      { id: 44, x: -0.8, y: 15.6, angle: -116.565 },\n      { id: 36, x: -24.2, y: 8.2, angle: -90.0 },\n      { id: 53, x: -1.2, y: 0.0, angle: 0.0 },\n      { id: 52, x: 14.2, y: 24.0, angle: -143.896 },\n      { id: 5, x: -65.2, y: 21.6, angle: 93.128 },\n      { id: 66, x: 5.4, y: 15.6, angle: 31.608 },\n      { id: 51, x: -72.6, y: 21.0, angle: -100.976 },\n      { id: 65, x: 48.0, y: 10.2, angle: 87.455 },\n      { id: 21, x: -41.8, y: 0.0, angle: 68.352 },\n      { id: 18, x: -46.2, y: 19.2, angle: -128.362 },\n      { id: 10, x: 74.4, y: 0.4, angle: 90.939 },\n      { id: 15, x: 67.6, y: 0.4, angle: 84.958 },\n      { id: 35, x: 14.8, y: -0.4, angle: 89.176 },\n      { id: 1, x: 83.0, y: 0.2, angle: 89.105 },\n      { id: 68, x: 14.6, y: 28.0, angle: -29.867 },\n      { id: 67, x: 79.8, y: 18.6, angle: -136.643 },\n      { id: 38, x: 53.0, y: 14.6, angle: -90.848 },\n      { id: 31, x: -58.0, y: 6.6, angle: -61.837 },\n      { id: 74, x: -30.8, y: 0.4, angle: 85.966 },\n      { id: 48, x: -4.6, y: 10.0, angle: -161.222 },\n      { id: 12, x: 59.0, y: 5.0, angle: -91.164 },\n      { id: 33, x: -16.4, y: 18.4, angle: 90.734 },\n      { id: 4, x: 82.6, y: 27.6, angle: 71.127 },\n      { id: 75, x: -10.2, y: 30.6, angle: -1.108 },\n      { id: 28, x: 38.0, y: 0.0, angle: 86.863 },\n      { id: 11, x: 64.4, y: -0.2, angle: 92.353 },\n      { id: 9, x: -51.4, y: 31.6, angle: 67.249 },\n      { id: 26, x: -39.8, y: 30.8, angle: 61.113 },\n      { id: 30, x: -34.2, y: 0.6, angle: 111.33 },\n      { id: 56, x: -51.0, y: 0.2, angle: 70.445 },\n      { id: 41, x: -12.0, y: 0.0, angle: 91.219 },\n      { id: 24, x: 63.8, y: 14.4, angle: 86.586 },\n      { id: 70, x: -72.8, y: 13.4, angle: -87.238 },\n      { id: 3, x: 22.4, y: 7.0, angle: -91.685 },\n      { id: 13, x: 34.4, y: 7.0, angle: 90.0 },\n      { id: 16, x: -47.4, y: 11.4, angle: -136.02 },\n      { id: 6, x: 90.0, y: 0.2, angle: 90.415 },\n      { id: 54, x: 44.0, y: 27.8, angle: 85.969 },\n      { id: 32, x: -9.0, y: 0.0, angle: 91.615 },\n      { id: 8, x: -31.6, y: 30.8, angle: 0.535 },\n      { id: 39, x: -12.0, y: 8.2, angle: 90.0 },\n      { id: 14, x: -79.6, y: 32.4, angle: 92.342 },\n      { id: 42, x: 65.8, y: 20.8, angle: -85.867 },\n      { id: 40, x: -65.0, y: 14.0, angle: 87.109 },\n      { id: 45, x: 10.6, y: 18.8, angle: 23.697 },\n      { id: 71, x: -24.2, y: 18.6, angle: -88.531 },\n      { id: 7, x: -72.6, y: 6.4, angle: -89.148 },\n      { id: 62, x: -32.0, y: 24.8, angle: -140.8 },\n      { id: 49, x: 34.4, y: -0.2, angle: 89.415 },\n      { id: 63, x: 74.2, y: 12.6, angle: -138.429 },\n      { id: 59, x: 82.8, y: 13.0, angle: -140.177 },\n      { id: 34, x: -9.4, y: 23.2, angle: -88.238 },\n      { id: 76, x: -57.6, y: 0.0, angle: 1.2 },\n      { id: 43, x: 7.0, y: 0.0, angle: 116.565 },\n      { id: 20, x: 45.8, y: -0.2, angle: 1.469 },\n      { id: 37, x: -16.6, y: 13.2, angle: 84.785 },\n      { id: 58, x: -79.0, y: -0.2, angle: 89.481 },\n      { id: 50, x: -24.2, y: 12.8, angle: -86.987 },\n      { id: 64, x: 59.2, y: 10.2, angle: -92.203 },\n      { id: 61, x: -72.0, y: 26.4, angle: -83.66 },\n      { id: 47, x: 45.4, y: 5.8, angle: -82.992 },\n      { id: 17, x: -52.2, y: 17.8, angle: -52.938 },\n      { id: 57, x: -61.8, y: 32.0, angle: 84.627 },\n      { id: 29, x: 47.2, y: 28.2, angle: 92.954 },\n      { id: 27, x: -4.6, y: 0.2, angle: 87.397 },\n      { id: 55, x: -61.4, y: 26.4, angle: 94.086 },\n      { id: 73, x: -40.4, y: 13.4, angle: -62.229 },\n      { id: 19, x: 53.2, y: 20.6, angle: -87.181 },\n    ]\n    const result = findSequence(start, prisms)\n    const expected = [\n      43, 44, 66, 45, 52, 35, 49, 13, 3, 69, 46, 28, 20, 11, 24, 38, 19, 42, 15,\n      10, 63, 25, 59, 1, 6, 2, 4, 67, 22, 29, 65, 64, 12, 47, 54, 68, 23, 75, 8,\n      26, 18, 9, 60, 17, 31, 7, 70, 40, 5, 51, 61, 55, 57, 14, 58, 76, 56, 16,\n      21, 30, 73, 62, 74, 41, 39, 36, 50, 37, 33, 71, 72, 34, 32, 27, 48, 53,\n    ]\n    expect(result).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/prism/prism.ts",
    "content": "export function findSequence(start: unknown, prisms: unknown): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/prism/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/prism/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/protein-translation/.docs/instructions.md",
    "content": "# Instructions\n\nYour job is to translate RNA sequences into proteins.\n\nRNA strands are made up of three-nucleotide sequences called **codons**.\nEach codon translates to an **amino acid**.\nWhen joined together, those amino acids make a protein.\n\nIn the real world, there are 64 codons, which in turn correspond to 20 amino acids.\nHowever, for this exercise, you’ll only use a few of the possible 64.\nThey are listed below:\n\n| Codon              | Amino Acid    |\n| ------------------ | ------------- |\n| AUG                | Methionine    |\n| UUU, UUC           | Phenylalanine |\n| UUA, UUG           | Leucine       |\n| UCU, UCC, UCA, UCG | Serine        |\n| UAU, UAC           | Tyrosine      |\n| UGU, UGC           | Cysteine      |\n| UGG                | Tryptophan    |\n| UAA, UAG, UGA      | STOP          |\n\nFor example, the RNA string “AUGUUUUCU” has three codons: “AUG”, “UUU” and “UCU”.\nThese map to Methionine, Phenylalanine, and Serine.\n\n## “STOP” Codons\n\nYou’ll note from the table above that there are three **“STOP” codons**.\nIf you encounter any of these codons, ignore the rest of the sequence — the protein is complete.\n\nFor example, “AUGUUUUCUUAAAUG” contains a STOP codon (“UAA”).\nOnce we reach that point, we stop processing.\nWe therefore only consider the part before it (i.e. “AUGUUUUCU”), not any further codons after it (i.e. “AUG”).\n\nLearn more about [protein translation on Wikipedia][protein-translation].\n\n[protein-translation]: https://en.wikipedia.org/wiki/Translation_(biology)\n"
  },
  {
    "path": "exercises/practice/protein-translation/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"protein-translation.ts\"\n    ],\n    \"test\": [\n      \"protein-translation.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Translate RNA sequences into proteins.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Tyler Long\"\n}\n"
  },
  {
    "path": "exercises/practice/protein-translation/.meta/proof.ci.ts",
    "content": "const ACID_PROTEIN_MAP = {\n  AUG: 'Methionine',\n  UUU: 'Phenylalanine',\n  UUC: 'Phenylalanine',\n  UUA: 'Leucine',\n  UUG: 'Leucine',\n  UCU: 'Serine',\n  UCC: 'Serine',\n  UCA: 'Serine',\n  UCG: 'Serine',\n  UAU: 'Tyrosine',\n  UAC: 'Tyrosine',\n  UGU: 'Cysteine',\n  UGC: 'Cysteine',\n  UGG: 'Tryptophan',\n  UAA: 'STOP',\n  UAG: 'STOP',\n  UGA: 'STOP',\n} as const\n\ntype Codon = keyof typeof ACID_PROTEIN_MAP\ntype Protein = (typeof ACID_PROTEIN_MAP)[Codon]\n\nconst getProtein = (codon: string): Protein | 'INVALID' =>\n  ACID_PROTEIN_MAP[codon as Codon] || 'INVALID'\n\nexport const translate = (rnaStrand: string): Protein[] => {\n  const proteins: (typeof ACID_PROTEIN_MAP)[keyof typeof ACID_PROTEIN_MAP][] =\n    []\n\n  if (rnaStrand) {\n    for (let i = 0; i < rnaStrand.length; i += 3) {\n      const protein = getProtein(rnaStrand.substring(i, i + 3))\n\n      if (protein) {\n        if (protein === 'STOP') {\n          break\n        }\n\n        if (protein === 'INVALID') {\n          throw new Error('Invalid codon')\n        }\n\n        proteins.push(protein)\n      }\n    }\n  }\n\n  return proteins\n}\n"
  },
  {
    "path": "exercises/practice/protein-translation/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[2c44f7bf-ba20-43f7-a3bf-f2219c0c3f98]\ndescription = \"Empty RNA sequence results in no proteins\"\n\n[96d3d44f-34a2-4db4-84cd-fff523e069be]\ndescription = \"Methionine RNA sequence\"\n\n[1b4c56d8-d69f-44eb-be0e-7b17546143d9]\ndescription = \"Phenylalanine RNA sequence 1\"\n\n[81b53646-bd57-4732-b2cb-6b1880e36d11]\ndescription = \"Phenylalanine RNA sequence 2\"\n\n[42f69d4f-19d2-4d2c-a8b0-f0ae9ee1b6b4]\ndescription = \"Leucine RNA sequence 1\"\n\n[ac5edadd-08ed-40a3-b2b9-d82bb50424c4]\ndescription = \"Leucine RNA sequence 2\"\n\n[8bc36e22-f984-44c3-9f6b-ee5d4e73f120]\ndescription = \"Serine RNA sequence 1\"\n\n[5c3fa5da-4268-44e5-9f4b-f016ccf90131]\ndescription = \"Serine RNA sequence 2\"\n\n[00579891-b594-42b4-96dc-7ff8bf519606]\ndescription = \"Serine RNA sequence 3\"\n\n[08c61c3b-fa34-4950-8c4a-133945570ef6]\ndescription = \"Serine RNA sequence 4\"\n\n[54e1e7d8-63c0-456d-91d2-062c72f8eef5]\ndescription = \"Tyrosine RNA sequence 1\"\n\n[47bcfba2-9d72-46ad-bbce-22f7666b7eb1]\ndescription = \"Tyrosine RNA sequence 2\"\n\n[3a691829-fe72-43a7-8c8e-1bd083163f72]\ndescription = \"Cysteine RNA sequence 1\"\n\n[1b6f8a26-ca2f-43b8-8262-3ee446021767]\ndescription = \"Cysteine RNA sequence 2\"\n\n[1e91c1eb-02c0-48a0-9e35-168ad0cb5f39]\ndescription = \"Tryptophan RNA sequence\"\n\n[e547af0b-aeab-49c7-9f13-801773a73557]\ndescription = \"STOP codon RNA sequence 1\"\n\n[67640947-ff02-4f23-a2ef-816f8a2ba72e]\ndescription = \"STOP codon RNA sequence 2\"\n\n[9c2ad527-ebc9-4ace-808b-2b6447cb54cb]\ndescription = \"STOP codon RNA sequence 3\"\n\n[f4d9d8ee-00a8-47bf-a1e3-1641d4428e54]\ndescription = \"Sequence of two protein codons translates into proteins\"\n\n[dd22eef3-b4f1-4ad6-bb0b-27093c090a9d]\ndescription = \"Sequence of two different protein codons translates into proteins\"\n\n[d0f295df-fb70-425c-946c-ec2ec185388e]\ndescription = \"Translate RNA strand into correct protein list\"\n\n[e30e8505-97ec-4e5f-a73e-5726a1faa1f4]\ndescription = \"Translation stops if STOP codon at beginning of sequence\"\n\n[5358a20b-6f4c-4893-bce4-f929001710f3]\ndescription = \"Translation stops if STOP codon at end of two-codon sequence\"\n\n[ba16703a-1a55-482f-bb07-b21eef5093a3]\ndescription = \"Translation stops if STOP codon at end of three-codon sequence\"\n\n[4089bb5a-d5b4-4e71-b79e-b8d1f14a2911]\ndescription = \"Translation stops if STOP codon in middle of three-codon sequence\"\n\n[2c2a2a60-401f-4a80-b977-e0715b23b93d]\ndescription = \"Translation stops if STOP codon in middle of six-codon sequence\"\n\n[f6f92714-769f-4187-9524-e353e8a41a80]\ndescription = \"Sequence of two non-STOP codons does not translate to a STOP codon\"\n\n[1e75ea2a-f907-4994-ae5c-118632a1cb0f]\ndescription = \"Non-existing codon can't translate\"\n\n[9eac93f3-627a-4c90-8653-6d0a0595bc6f]\ndescription = \"Unknown amino acids, not part of a codon, can't translate\"\nreimplements = \"1e75ea2a-f907-4994-ae5c-118632a1cb0f\"\n\n[9d73899f-e68e-4291-b1e2-7bf87c00f024]\ndescription = \"Incomplete RNA sequence can't translate\"\n\n[43945cf7-9968-402d-ab9f-b8a28750b050]\ndescription = \"Incomplete RNA sequence can translate if valid until a STOP codon\"\n"
  },
  {
    "path": "exercises/practice/protein-translation/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/protein-translation/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/protein-translation/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/protein-translation/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/protein-translation/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/protein-translation/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/protein-translation/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-protein-translation\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/protein-translation/protein-translation.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { translate } from './protein-translation.ts'\n\ndescribe('Translate input RNA sequences into proteins', () => {\n  it('Methionine RNA sequence', () => {\n    const expected = ['Methionine']\n    expect(translate('AUG')).toEqual(expected)\n  })\n\n  xit('Phenylalanine RNA sequence 1', () => {\n    const expected = ['Phenylalanine']\n    expect(translate('UUU')).toEqual(expected)\n  })\n\n  xit('Phenylalanine RNA sequence 2', () => {\n    const expected = ['Phenylalanine']\n    expect(translate('UUC')).toEqual(expected)\n  })\n\n  xit('Leucine RNA sequence 1', () => {\n    const expected = ['Leucine']\n    expect(translate('UUA')).toEqual(expected)\n  })\n\n  xit('Leucine RNA sequence 2', () => {\n    const expected = ['Leucine']\n    expect(translate('UUG')).toEqual(expected)\n  })\n\n  xit('Serine RNA sequence 1', () => {\n    const expected = ['Serine']\n    expect(translate('UCU')).toEqual(expected)\n  })\n\n  xit('Serine RNA sequence 2', () => {\n    const expected = ['Serine']\n    expect(translate('UCC')).toEqual(expected)\n  })\n\n  xit('Serine RNA sequence 3', () => {\n    const expected = ['Serine']\n    expect(translate('UCA')).toEqual(expected)\n  })\n\n  xit('Serine RNA sequence 4', () => {\n    const expected = ['Serine']\n    expect(translate('UCG')).toEqual(expected)\n  })\n\n  xit('Tyrosine RNA sequence 1', () => {\n    const expected = ['Tyrosine']\n    expect(translate('UAU')).toEqual(expected)\n  })\n\n  xit('Tyrosine RNA sequence 2', () => {\n    const expected = ['Tyrosine']\n    expect(translate('UAC')).toEqual(expected)\n  })\n\n  xit('Cysteine RNA sequence 1', () => {\n    const expected = ['Cysteine']\n    expect(translate('UGU')).toEqual(expected)\n  })\n\n  xit('Cysteine RNA sequence 2', () => {\n    const expected = ['Cysteine']\n    expect(translate('UGC')).toEqual(expected)\n  })\n\n  xit('Tryptophan RNA sequence', () => {\n    const expected = ['Tryptophan']\n    expect(translate('UGG')).toEqual(expected)\n  })\n\n  xit('STOP codon RNA sequence 1', () => {\n    const expected: string[] = []\n    expect(translate('UAA')).toEqual(expected)\n  })\n\n  xit('STOP codon RNA sequence 2', () => {\n    const expected: string[] = []\n    expect(translate('UAG')).toEqual(expected)\n  })\n\n  xit('STOP codon RNA sequence 3', () => {\n    const expected: string[] = []\n    expect(translate('UGA')).toEqual(expected)\n  })\n\n  xit('Sequence of two protein codons translates into proteins', () => {\n    const expected = ['Phenylalanine', 'Phenylalanine']\n    expect(translate('UUUUUU')).toEqual(expected)\n  })\n\n  xit('Sequence of two different protein codons translates into proteins', () => {\n    const expected = ['Leucine', 'Leucine']\n    expect(translate('UUAUUG')).toEqual(expected)\n  })\n\n  xit('Translate RNA strand into correct protein list', () => {\n    const expected = ['Methionine', 'Phenylalanine', 'Tryptophan']\n    expect(translate('AUGUUUUGG')).toEqual(expected)\n  })\n\n  xit('Translation stops if STOP codon at beginning of sequence', () => {\n    const expected: string[] = []\n    expect(translate('UAGUGG')).toEqual(expected)\n  })\n\n  xit('Translation stops if STOP codon at end of two-codon sequence', () => {\n    const expected = ['Tryptophan']\n    expect(translate('UGGUAG')).toEqual(expected)\n  })\n\n  xit('Translation stops if STOP codon at end of three-codon sequence', () => {\n    const expected = ['Methionine', 'Phenylalanine']\n    expect(translate('AUGUUUUAA')).toEqual(expected)\n  })\n\n  xit('Translation stops if STOP codon in middle of three-codon sequence', () => {\n    const expected = ['Tryptophan']\n    expect(translate('UGGUAGUGG')).toEqual(expected)\n  })\n\n  xit('Translation stops if STOP codon in middle of six-codon sequence', () => {\n    const expected = ['Tryptophan', 'Cysteine', 'Tyrosine']\n    expect(translate('UGGUGUUAUUAAUGGUUU')).toEqual(expected)\n  })\n\n  xit('Sequence of two non-STOP codons does not translate to a STOP codon', () => {\n    const expected = ['Methionine', 'Methionine']\n    expect(translate('AUGAUG')).toEqual(expected)\n  })\n\n  xit(\"Unknown amino acids, not part of a codon, can't translate\", () => {\n    expect(() => {\n      translate('XYZ')\n    }).toThrow('Invalid codon')\n  })\n\n  xit(\"Incomplete RNA sequence can't translate\", () => {\n    expect(() => {\n      translate('AUGU')\n    }).toThrow('Invalid codon')\n  })\n\n  xit('Incomplete RNA sequence can translate if valid until a STOP codon', () => {\n    const expected = ['Phenylalanine', 'Phenylalanine']\n    expect(translate('UUCUUCUAAUGGU')).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/protein-translation/protein-translation.ts",
    "content": "export function translate() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/protein-translation/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/protein-translation/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/proverb/.docs/instructions.md",
    "content": "# Instructions\n\nFor want of a horseshoe nail, a kingdom was lost, or so the saying goes.\n\nGiven a list of inputs, generate the relevant proverb.\nFor example, given the list `[\"nail\", \"shoe\", \"horse\", \"rider\", \"message\", \"battle\", \"kingdom\"]`, you will output the full text of this proverbial rhyme:\n\n```text\nFor want of a nail the shoe was lost.\nFor want of a shoe the horse was lost.\nFor want of a horse the rider was lost.\nFor want of a rider the message was lost.\nFor want of a message the battle was lost.\nFor want of a battle the kingdom was lost.\nAnd all for the want of a nail.\n```\n\nNote that the list of inputs may vary; your solution should be able to handle lists of arbitrary length and content.\nNo line of the output text should be a static, unchanging string; all should vary according to the input given.\n"
  },
  {
    "path": "exercises/practice/proverb/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"proverb.ts\"\n    ],\n    \"test\": [\n      \"proverb.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"For want of a horseshoe nail, a kingdom was lost, or so the saying goes. Output the full text of this proverbial rhyme.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Wikipedia\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/For_Want_of_a_Nail\"\n}\n"
  },
  {
    "path": "exercises/practice/proverb/.meta/proof.ci.ts",
    "content": "const conclusion = (firstArg: string): string =>\n  `And all for the want of a ${firstArg}.`\n\nexport const proverb = (...args: string[]): string => {\n  const allExceptLastArg = args.slice(0, -1)\n  const chainOfEvents = allExceptLastArg.map(\n    (arg, index) => `For want of a ${arg} the ${args[index + 1]} was lost.`\n  )\n\n  chainOfEvents.push(conclusion(args[0]))\n\n  return chainOfEvents.join('\\n')\n}\n"
  },
  {
    "path": "exercises/practice/proverb/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[e974b73e-7851-484f-8d6d-92e07fe742fc]\ndescription = \"zero pieces\"\n\n[2fcd5f5e-8b82-4e74-b51d-df28a5e0faa4]\ndescription = \"one piece\"\n\n[d9d0a8a1-d933-46e2-aa94-eecf679f4b0e]\ndescription = \"two pieces\"\n\n[c95ef757-5e94-4f0d-a6cb-d2083f5e5a83]\ndescription = \"three pieces\"\n\n[433fb91c-35a2-4d41-aeab-4de1e82b2126]\ndescription = \"full proverb\"\n\n[c1eefa5a-e8d9-41c7-91d4-99fab6d6b9f7]\ndescription = \"four pieces modernized\"\n"
  },
  {
    "path": "exercises/practice/proverb/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/proverb/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/proverb/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/proverb/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/proverb/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/proverb/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/proverb/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-proverb\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/proverb/proverb.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { proverb } from './proverb.ts'\n\ndescribe('Proverb', () => {\n  it('a single consequence', () => {\n    const expected = `For want of a nail the shoe was lost.\\nAnd all for the want of a nail.`\n    expect(proverb('nail', 'shoe')).toEqual(expected)\n  })\n\n  xit('a short chain of consequences', () => {\n    const expected = `For want of a nail the shoe was lost.\\nFor want of a shoe the horse was lost.\\nAnd all for the want of a nail.`\n    expect(proverb('nail', 'shoe', 'horse')).toEqual(expected)\n  })\n\n  xit('a longer chain of consequences', () => {\n    const expected = `For want of a nail the shoe was lost.\\nFor want of a shoe the horse was lost.\\nFor want of a horse the rider was lost.\\nAnd all for the want of a nail.`\n    expect(proverb('nail', 'shoe', 'horse', 'rider')).toEqual(expected)\n  })\n\n  xit('proverb function does not hard code the rhyme dictionary', () => {\n    const expected = `For want of a key the value was lost.\\nAnd all for the want of a key.`\n    expect(proverb('key', 'value')).toEqual(expected)\n  })\n\n  xit('the whole proverb', () => {\n    const expected = `For want of a nail the shoe was lost.\\nFor want of a shoe the horse was lost.\\nFor want of a horse the rider was lost.\\nFor want of a rider the message was lost.\\nFor want of a message the battle was lost.\\nFor want of a battle the kingdom was lost.\\nAnd all for the want of a nail.`\n    expect(\n      proverb('nail', 'shoe', 'horse', 'rider', 'message', 'battle', 'kingdom')\n    ).toEqual(expected)\n  })\n\n  xit('proverb is the same each time', () => {\n    expect(proverb('nail', 'shoe')).toEqual(proverb('nail', 'shoe'))\n  })\n})\n"
  },
  {
    "path": "exercises/practice/proverb/proverb.ts",
    "content": "export function proverb() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/proverb/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/proverb/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/pythagorean-triplet/.docs/instructions.md",
    "content": "# Description\n\nA Pythagorean triplet is a set of three natural numbers, {a, b, c}, for which,\n\n```text\na² + b² = c²\n```\n\nand such that,\n\n```text\na < b < c\n```\n\nFor example,\n\n```text\n3² + 4² = 5².\n```\n\nGiven an input integer N, find all Pythagorean triplets for which `a + b + c = N`.\n\nFor example, with N = 1000, there is exactly one Pythagorean triplet for which `a + b + c = 1000`: `{200, 375, 425}`.\n"
  },
  {
    "path": "exercises/practice/pythagorean-triplet/.docs/introduction.md",
    "content": "# Introduction\n\nYou are an accomplished problem-solver, known for your ability to tackle the most challenging mathematical puzzles.\nOne evening, you receive an urgent letter from an inventor called the Triangle Tinkerer, who is working on a groundbreaking new project.\nThe letter reads:\n\n> Dear Mathematician,\n>\n> I need your help.\n> I am designing a device that relies on the unique properties of Pythagorean triplets — sets of three integers that satisfy the equation a² + b² = c².\n> This device will revolutionize navigation, but for it to work, I must program it with every possible triplet where the sum of a, b, and c equals a specific number, N.\n> Calculating these triplets by hand would take me years, but I hear you are more than up to the task.\n>\n> Time is of the essence.\n> The future of my invention — and perhaps even the future of mathematical innovation — rests on your ability to solve this problem.\n\nMotivated by the importance of the task, you set out to find all Pythagorean triplets that satisfy the condition.\nYour work could have far-reaching implications, unlocking new possibilities in science and engineering.\nCan you rise to the challenge and make history?\n"
  },
  {
    "path": "exercises/practice/pythagorean-triplet/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"mdowds\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"mdmower\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"pythagorean-triplet.ts\"\n    ],\n    \"test\": [\n      \"pythagorean-triplet.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given an integer N, find all Pythagorean triplets for which a + b + c = N.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": true,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"A variation of Problem 9 from Project Euler\",\n  \"source_url\": \"https://projecteuler.net/problem=9\"\n}\n"
  },
  {
    "path": "exercises/practice/pythagorean-triplet/.meta/proof.ci.ts",
    "content": "type Options = {\n  minFactor?: number\n  maxFactor?: number\n  sum: number\n}\n\ntype TripletArray = [number, number, number]\n\nclass Triplet {\n  constructor(\n    private readonly a: TripletArray[0],\n    private readonly b: TripletArray[1],\n    private readonly c: TripletArray[2]\n  ) {}\n\n  public toArray(): TripletArray {\n    return [this.a, this.b, this.c]\n  }\n\n  public get pythagorean(): boolean {\n    return this.a * this.a + this.b * this.b === this.c * this.c\n  }\n\n  public get sum(): number {\n    return this.a + this.b + this.c\n  }\n}\n\nexport function triplets({ minFactor, maxFactor, sum }: Options): Triplet[] {\n  const min = minFactor || 1\n  const max = maxFactor || sum - 1\n\n  const isDesired = (triplet: Triplet): boolean => {\n    return triplet.pythagorean && (!sum || triplet.sum === sum)\n  }\n\n  const result: Triplet[] = []\n\n  for (let a = min; a < max - 1; a += 1) {\n    for (let b = a + 1; b < max; b += 1) {\n      for (let c = b + 1; c <= max; c += 1) {\n        const triplet = new Triplet(a, b, c)\n\n        if (isDesired(triplet)) {\n          result.push(triplet)\n        }\n      }\n    }\n  }\n\n  return result\n}\n"
  },
  {
    "path": "exercises/practice/pythagorean-triplet/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[a19de65d-35b8-4480-b1af-371d9541e706]\ndescription = \"triplets whose sum is 12\"\n\n[48b21332-0a3d-43b2-9a52-90b2a6e5c9f5]\ndescription = \"triplets whose sum is 108\"\n\n[dffc1266-418e-4daa-81af-54c3e95c3bb5]\ndescription = \"triplets whose sum is 1000\"\n\n[5f86a2d4-6383-4cce-93a5-e4489e79b186]\ndescription = \"no matching triplets for 1001\"\n\n[bf17ba80-1596-409a-bb13-343bdb3b2904]\ndescription = \"returns all matching triplets\"\n\n[9d8fb5d5-6c6f-42df-9f95-d3165963ac57]\ndescription = \"several matching triplets\"\n\n[f5be5734-8aa0-4bd1-99a2-02adcc4402b4]\ndescription = \"triplets for large number\"\n"
  },
  {
    "path": "exercises/practice/pythagorean-triplet/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/pythagorean-triplet/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/pythagorean-triplet/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/pythagorean-triplet/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/pythagorean-triplet/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/pythagorean-triplet/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/pythagorean-triplet/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-pythagorean-triplet\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/pythagorean-triplet/pythagorean-triplet.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { triplets } from './pythagorean-triplet.ts'\n\ntype Triplet = [number, number, number]\n\nfunction tripletsWithSum(sum: number, options = {}): Triplet[] {\n  return triplets({ ...options, sum }).map((triplet) =>\n    triplet.toArray().sort((a, b) => a - b)\n  )\n}\n\ndescribe('Triplet', () => {\n  it('triplets whose sum is 12', () => {\n    expect(tripletsWithSum(12)).toEqual([[3, 4, 5]])\n  })\n\n  xit('triplets whose sum is 108', () => {\n    expect(tripletsWithSum(108)).toEqual([[27, 36, 45]])\n  })\n\n  xit('triplets whose sum is 1000', () => {\n    expect(tripletsWithSum(1000)).toEqual([[200, 375, 425]])\n  })\n\n  xit('no matching triplets for 1001', () => {\n    expect(tripletsWithSum(1001)).toEqual([])\n  })\n\n  xit('returns all matching triplets', () => {\n    expect(tripletsWithSum(90)).toEqual([\n      [9, 40, 41],\n      [15, 36, 39],\n    ])\n  })\n\n  xit('several matching triplets', () => {\n    expect(tripletsWithSum(840)).toEqual([\n      [40, 399, 401],\n      [56, 390, 394],\n      [105, 360, 375],\n      [120, 350, 370],\n      [140, 336, 364],\n      [168, 315, 357],\n      [210, 280, 350],\n      [240, 252, 348],\n    ])\n  })\n\n  xit('returns triplets with no factor smaller than minimum factor', () => {\n    expect(tripletsWithSum(90, { minFactor: 10 })).toEqual([[15, 36, 39]])\n  })\n\n  xit('returns triplets with no factor larger than maximum factor', () => {\n    expect(tripletsWithSum(840, { maxFactor: 349 })).toEqual([[240, 252, 348]])\n  })\n\n  xit('returns triplets with factors in range', () => {\n    expect(tripletsWithSum(840, { maxFactor: 352, minFactor: 150 })).toEqual([\n      [210, 280, 350],\n      [240, 252, 348],\n    ])\n  })\n\n  it.skip('triplets for large number', () => {\n    expect(tripletsWithSum(30000)).toEqual([\n      [1200, 14375, 14425],\n      [1875, 14000, 14125],\n      [5000, 12000, 13000],\n      [6000, 11250, 12750],\n      [7500, 10000, 12500],\n    ])\n  })\n})\n"
  },
  {
    "path": "exercises/practice/pythagorean-triplet/pythagorean-triplet.ts",
    "content": "type Options = {\n  minFactor?: number\n  maxFactor?: number\n  sum: number\n}\n\nexport function triplets({}: Options): Triplet[] {\n  throw new Error('Remove this line and implement the function')\n}\n\nclass Triplet {\n  constructor() {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  toArray(): [number, number, number] {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/pythagorean-triplet/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/pythagorean-triplet/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/queen-attack/.docs/instructions.append.md",
    "content": "# Instructions append\n\nA queen must be placed on a valid position on the board.\nTwo queens cannot share the same position.\n\nIf a position has not been given, the queens are at their [default starting positions](https://en.wikipedia.org/wiki/Rules_of_chess#Initial_setup). That's the bottom row (1) for the white queen and the top row (8) for the black queen. Both queens start in the fourth column (d).\n\n```text\n  a b c d e f g h\n8 _ _ _ B _ _ _ _ 8\n7 _ _ _ _ _ _ _ _ 7\n6 _ _ _ _ _ _ _ _ 6\n5 _ _ _ _ _ _ _ _ 5\n4 _ _ _ _ _ _ _ _ 4\n3 _ _ _ _ _ _ _ _ 3\n2 _ _ _ _ _ _ _ _ 2\n1 _ _ _ W _ _ _ _ 1\n  a b c d e f g h\n```\n"
  },
  {
    "path": "exercises/practice/queen-attack/.docs/instructions.md",
    "content": "# Instructions\n\nGiven the position of two queens on a chess board, indicate whether or not they are positioned so that they can attack each other.\n\nIn the game of chess, a queen can attack pieces which are on the same row, column, or diagonal.\n\nA chessboard can be represented by an 8 by 8 array.\n\nSo if you are told the white queen is at `c5` (zero-indexed at column 2, row 3) and the black queen at `f2` (zero-indexed at column 5, row 6), then you know that the set-up is like so:\n\n![A chess board with two queens. Arrows emanating from the queen at c5 indicate possible directions of capture along file, rank and diagonal.](https://assets.exercism.org/images/exercises/queen-attack/queen-capture.svg)\n\nYou are also able to answer whether the queens can attack each other.\nIn this case, that answer would be yes, they can, because both pieces share a diagonal.\n\n## Credit\n\nThe chessboard image was made by [habere-et-dispertire][habere-et-dispertire] using LaTeX and the [chessboard package][chessboard-package] by Ulrike Fischer.\n\n[habere-et-dispertire]: https://exercism.org/profiles/habere-et-dispertire\n[chessboard-package]: https://github.com/u-fischer/chessboard\n"
  },
  {
    "path": "exercises/practice/queen-attack/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"queen-attack.ts\"\n    ],\n    \"test\": [\n      \"queen-attack.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given the position of two queens on a chess board, indicate whether or not they are positioned so that they can attack each other.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"J Dalbey's Programming Practice problems\",\n  \"source_url\": \"https://users.csc.calpoly.edu/~jdalbey/103/Projects/ProgrammingPractice.html\"\n}\n"
  },
  {
    "path": "exercises/practice/queen-attack/.meta/proof.ci.ts",
    "content": "const W = 8\nconst H = 8\nconst STARTING: Positions = { black: [0, 3], white: [7, 3] } as const\n\ntype Position = readonly [number, number]\ntype Board = string[]\n\ntype Positions = {\n  white: Position\n  black: Position\n}\n\nfunction invalidPosition({ white, black }: Positions): boolean {\n  if (white[0] < 0 || white[0] >= H || white[1] < 0 || white[1] >= W) {\n    return true\n  }\n\n  if (black[0] < 0 || black[0] >= H || black[1] < 0 || black[1] >= W) {\n    return true\n  }\n\n  return false\n}\n\nfunction samePosition({ white, black }: Positions): boolean {\n  return white[0] === black[0] && white[1] === black[1]\n}\n\nfunction constructBoard(): Board {\n  return new Array<string>(W * H).fill('_')\n}\n\nfunction placePieces(self: QueenAttack): void {\n  const board = self.board\n  const [blackRow, blackColumn] = self.black\n  const [whiteRow, whiteColumn] = self.white\n\n  board[blackRow * W + blackColumn] = 'B'\n  board[whiteRow * W + whiteColumn] = 'W'\n}\n\nexport class QueenAttack {\n  public readonly black: Position\n  public readonly white: Position\n  public readonly board: string[]\n\n  constructor(params: Partial<Positions> = {}) {\n    const fullParams = { ...STARTING, ...params }\n    if (invalidPosition(fullParams)) {\n      throw new Error('Queen must be placed on the board')\n    }\n\n    if (samePosition(fullParams)) {\n      throw new Error('Queens cannot share the same space')\n    }\n\n    this.black = fullParams.black\n    this.white = fullParams.white\n    this.board = constructBoard()\n\n    placePieces(this)\n\n    return this\n  }\n\n  public get canAttack(): boolean {\n    // Same row or column\n    if (this.black[0] === this.white[0] || this.black[1] === this.white[1]) {\n      return true\n    }\n\n    // Diagonally\n    return (\n      Math.abs(this.black[0] - this.white[0]) ===\n      Math.abs(this.black[1] - this.white[1])\n    )\n  }\n\n  public toString(): string {\n    return Array.from({ length: H }, (_, row) =>\n      this.board.slice(row * H, row * H + W).join(' ')\n    ).join('\\n')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/queen-attack/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[3ac4f735-d36c-44c4-a3e2-316f79704203]\ndescription = \"Test creation of Queens with valid and invalid positions -> queen with a valid position\"\n\n[4e812d5d-b974-4e38-9a6b-8e0492bfa7be]\ndescription = \"Test creation of Queens with valid and invalid positions -> queen must have positive row\"\n\n[f07b7536-b66b-4f08-beb9-4d70d891d5c8]\ndescription = \"Test creation of Queens with valid and invalid positions -> queen must have row on board\"\n\n[15a10794-36d9-4907-ae6b-e5a0d4c54ebe]\ndescription = \"Test creation of Queens with valid and invalid positions -> queen must have positive column\"\n\n[6907762d-0e8a-4c38-87fb-12f2f65f0ce4]\ndescription = \"Test creation of Queens with valid and invalid positions -> queen must have column on board\"\n\n[33ae4113-d237-42ee-bac1-e1e699c0c007]\ndescription = \"Test the ability of one queen to attack another -> cannot attack\"\n\n[eaa65540-ea7c-4152-8c21-003c7a68c914]\ndescription = \"Test the ability of one queen to attack another -> can attack on same row\"\n\n[bae6f609-2c0e-4154-af71-af82b7c31cea]\ndescription = \"Test the ability of one queen to attack another -> can attack on same column\"\n\n[0e1b4139-b90d-4562-bd58-dfa04f1746c7]\ndescription = \"Test the ability of one queen to attack another -> can attack on first diagonal\"\n\n[ff9b7ed4-e4b6-401b-8d16-bc894d6d3dcd]\ndescription = \"Test the ability of one queen to attack another -> can attack on second diagonal\"\n\n[0a71e605-6e28-4cc2-aa47-d20a2e71037a]\ndescription = \"Test the ability of one queen to attack another -> can attack on third diagonal\"\n\n[0790b588-ae73-4f1f-a968-dd0b34f45f86]\ndescription = \"Test the ability of one queen to attack another -> can attack on fourth diagonal\"\n\n[543f8fd4-2597-4aad-8d77-cbdab63619f8]\ndescription = \"Test the ability of one queen to attack another -> cannot attack if falling diagonals are only the same when reflected across the longest falling diagonal\"\n"
  },
  {
    "path": "exercises/practice/queen-attack/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/queen-attack/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/queen-attack/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/queen-attack/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/queen-attack/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/queen-attack/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/queen-attack/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-queen-attack\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/queen-attack/queen-attack.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { QueenAttack } from './queen-attack.ts'\n\ndescribe('Queens', () => {\n  describe('Test creation of Queens with valid and invalid positions', () => {\n    it('queen with a valid position', () => {\n      const queens = new QueenAttack({ white: [2, 2] })\n      expect(queens.white).toEqual([2, 2])\n    })\n\n    xit('queen must have positive row', () => {\n      const positioning = { white: [-2, 2] } as const\n      const expectedError = 'Queen must be placed on the board'\n      expect(() => new QueenAttack(positioning)).toThrow(expectedError)\n    })\n\n    xit('queen must have row on board', () => {\n      const positioning = { white: [8, 4] } as const\n      const expectedError = 'Queen must be placed on the board'\n      expect(() => new QueenAttack(positioning)).toThrow(expectedError)\n    })\n\n    xit('queen must have positive column', () => {\n      const positioning = { white: [2, -2] } as const\n      const expectedError = 'Queen must be placed on the board'\n      expect(() => new QueenAttack(positioning)).toThrow(expectedError)\n    })\n\n    xit('queen must have column on board', () => {\n      const positioning = { white: [4, 8] } as const\n      const expectedError = 'Queen must be placed on the board'\n      expect(() => new QueenAttack(positioning)).toThrow(expectedError)\n    })\n\n    xit('two queens cannot occupy the same space', () => {\n      const positioning = { white: [2, 4], black: [2, 4] } as const\n      const expectedError = 'Queens cannot share the same space'\n      expect(() => new QueenAttack(positioning)).toThrow(expectedError)\n    })\n  })\n\n  describe('Test the ability of one queen to attack another', () => {\n    xit('queens cannot attack', () => {\n      const queens = new QueenAttack({ white: [2, 4], black: [6, 6] })\n      expect(queens.canAttack).toEqual(false)\n    })\n\n    xit('queens can attack when they are on the same row', () => {\n      const queens = new QueenAttack({ white: [2, 4], black: [2, 6] })\n      expect(queens.canAttack).toEqual(true)\n    })\n\n    xit('queens can attack when they are on the same column', () => {\n      const queens = new QueenAttack({ white: [4, 5], black: [2, 5] })\n      expect(queens.canAttack).toEqual(true)\n    })\n\n    xit('queens can attack diagonally', () => {\n      const queens = new QueenAttack({ white: [2, 2], black: [0, 4] })\n      expect(queens.canAttack).toEqual(true)\n    })\n\n    xit('queens can attack another diagonally', () => {\n      const queens = new QueenAttack({ white: [2, 2], black: [3, 1] })\n      expect(queens.canAttack).toEqual(true)\n    })\n\n    xit('queens can attack yet another diagonally', () => {\n      const queens = new QueenAttack({ white: [2, 2], black: [1, 1] })\n      expect(queens.canAttack).toEqual(true)\n    })\n\n    xit('queens can attack diagonally, really', () => {\n      const queens = new QueenAttack({ white: [1, 7], black: [0, 6] })\n      expect(queens.canAttack).toEqual(true)\n    })\n\n    xit('queens can attack on a north-east/south-west diagonal', () => {\n      const queens = new QueenAttack({ white: [7, 0], black: [0, 7] })\n      expect(queens.canAttack).toEqual(true)\n    })\n\n    xit('queens can attack on another ne/sw diagonal', () => {\n      const queens = new QueenAttack({ white: [2, 6], black: [5, 3] })\n      expect(queens.canAttack).toEqual(true)\n    })\n\n    xit('queens cannot attack if falling diagonals are only the same when reflected across the longest falling diagonal', () => {\n      const queens = new QueenAttack({ white: [4, 1], black: [2, 5] })\n      expect(queens.canAttack).toEqual(false)\n    })\n  })\n\n  describe('Test the board visualisation', () => {\n    xit('board', () => {\n      const positioning = { white: [3, 2], black: [6, 5] } as const\n      const queens = new QueenAttack(positioning)\n      const board = [\n        '_ _ _ _ _ _ _ _',\n        '_ _ _ _ _ _ _ _',\n        '_ _ _ _ _ _ _ _',\n        '_ _ W _ _ _ _ _',\n        '_ _ _ _ _ _ _ _',\n        '_ _ _ _ _ _ _ _',\n        '_ _ _ _ _ B _ _',\n        '_ _ _ _ _ _ _ _',\n      ].join('\\n')\n      expect(queens.toString()).toEqual(board)\n    })\n\n    xit('board with queens at their starting positions', () => {\n      const queens = new QueenAttack()\n      const board = [\n        '_ _ _ B _ _ _ _',\n        '_ _ _ _ _ _ _ _',\n        '_ _ _ _ _ _ _ _',\n        '_ _ _ _ _ _ _ _',\n        '_ _ _ _ _ _ _ _',\n        '_ _ _ _ _ _ _ _',\n        '_ _ _ _ _ _ _ _',\n        '_ _ _ W _ _ _ _',\n      ].join('\\n')\n      expect(queens.toString()).toEqual(board)\n    })\n\n    xit('board with the black queen at her starting positions', () => {\n      const queens = new QueenAttack({ white: [1, 6] })\n      const board = [\n        '_ _ _ B _ _ _ _',\n        '_ _ _ _ _ _ W _',\n        '_ _ _ _ _ _ _ _',\n        '_ _ _ _ _ _ _ _',\n        '_ _ _ _ _ _ _ _',\n        '_ _ _ _ _ _ _ _',\n        '_ _ _ _ _ _ _ _',\n        '_ _ _ _ _ _ _ _',\n      ].join('\\n')\n      expect(queens.toString()).toEqual(board)\n    })\n\n    xit('board with queens at the edges', () => {\n      const positioning = { white: [0, 0], black: [7, 7] } as const\n      const queens = new QueenAttack(positioning)\n      const board = [\n        'W _ _ _ _ _ _ _',\n        '_ _ _ _ _ _ _ _',\n        '_ _ _ _ _ _ _ _',\n        '_ _ _ _ _ _ _ _',\n        '_ _ _ _ _ _ _ _',\n        '_ _ _ _ _ _ _ _',\n        '_ _ _ _ _ _ _ _',\n        '_ _ _ _ _ _ _ B',\n      ].join('\\n')\n      expect(queens.toString()).toEqual(board)\n    })\n  })\n})\n"
  },
  {
    "path": "exercises/practice/queen-attack/queen-attack.ts",
    "content": "type Position = readonly [number, number]\n\ntype Positions = {\n  white: Position\n  black: Position\n}\nexport class QueenAttack {\n  public readonly black: Position\n  public readonly white: Position\n\n  // white: [whiteRow, whiteColumn]\n  // black: [blackRow, blackColumn]\n  constructor({}: Partial<Positions> = {}) {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  toString() {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  get canAttack() {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/queen-attack/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/queen-attack/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/raindrops/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to convert a number into its corresponding raindrop sounds.\n\nIf a given number:\n\n- is divisible by 3, add \"Pling\" to the result.\n- is divisible by 5, add \"Plang\" to the result.\n- is divisible by 7, add \"Plong\" to the result.\n- **is not** divisible by 3, 5, or 7, the result should be the number as a string.\n\n## Examples\n\n- 28 is divisible by 7, but not 3 or 5, so the result would be `\"Plong\"`.\n- 30 is divisible by 3 and 5, but not 7, so the result would be `\"PlingPlang\"`.\n- 34 is not divisible by 3, 5, or 7, so the result would be `\"34\"`.\n\n~~~~exercism/note\nA common way to test if one number is evenly divisible by another is to compare the [remainder][remainder] or [modulus][modulo] to zero.\nMost languages provide operators or functions for one (or both) of these.\n\n[remainder]: https://exercism.org/docs/programming/operators/remainder\n[modulo]: https://en.wikipedia.org/wiki/Modulo_operation\n~~~~\n"
  },
  {
    "path": "exercises/practice/raindrops/.docs/introduction.md",
    "content": "# Introduction\n\nRaindrops is a slightly more complex version of the FizzBuzz challenge, a classic interview question.\n"
  },
  {
    "path": "exercises/practice/raindrops/.meta/config.json",
    "content": "{\n  \"authors\": [],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"raindrops.ts\"\n    ],\n    \"test\": [\n      \"raindrops.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Convert a number into its corresponding raindrop sounds - Pling, Plang and Plong.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"A variation on FizzBuzz, a famous technical interview question that is intended to weed out potential candidates. That question is itself derived from Fizz Buzz, a popular children's game for teaching division.\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/Fizz_buzz\"\n}\n"
  },
  {
    "path": "exercises/practice/raindrops/.meta/proof.ci.ts",
    "content": "export function convert(drops: number): string {\n  let converted = ''\n\n  if (drops % 3 === 0) {\n    converted += 'Pling'\n  }\n  if (drops % 5 === 0) {\n    converted += 'Plang'\n  }\n  if (drops % 7 === 0) {\n    converted += 'Plong'\n  }\n\n  return converted ? converted : drops.toString()\n}\n"
  },
  {
    "path": "exercises/practice/raindrops/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[1575d549-e502-46d4-a8e1-6b7bec6123d8]\ndescription = \"the sound for 1 is 1\"\n\n[1f51a9f9-4895-4539-b182-d7b0a5ab2913]\ndescription = \"the sound for 3 is Pling\"\n\n[2d9bfae5-2b21-4bcd-9629-c8c0e388f3e0]\ndescription = \"the sound for 5 is Plang\"\n\n[d7e60daa-32ef-4c23-b688-2abff46c4806]\ndescription = \"the sound for 7 is Plong\"\n\n[6bb4947b-a724-430c-923f-f0dc3d62e56a]\ndescription = \"the sound for 6 is Pling as it has a factor 3\"\n\n[ce51e0e8-d9d4-446d-9949-96eac4458c2d]\ndescription = \"2 to the power 3 does not make a raindrop sound as 3 is the exponent not the base\"\n\n[0dd66175-e3e2-47fc-8750-d01739856671]\ndescription = \"the sound for 9 is Pling as it has a factor 3\"\n\n[022c44d3-2182-4471-95d7-c575af225c96]\ndescription = \"the sound for 10 is Plang as it has a factor 5\"\n\n[37ab74db-fed3-40ff-b7b9-04acdfea8edf]\ndescription = \"the sound for 14 is Plong as it has a factor of 7\"\n\n[31f92999-6afb-40ee-9aa4-6d15e3334d0f]\ndescription = \"the sound for 15 is PlingPlang as it has factors 3 and 5\"\n\n[ff9bb95d-6361-4602-be2c-653fe5239b54]\ndescription = \"the sound for 21 is PlingPlong as it has factors 3 and 7\"\n\n[d2e75317-b72e-40ab-8a64-6734a21dece1]\ndescription = \"the sound for 25 is Plang as it has a factor 5\"\n\n[a09c4c58-c662-4e32-97fe-f1501ef7125c]\ndescription = \"the sound for 27 is Pling as it has a factor 3\"\n\n[bdf061de-8564-4899-a843-14b48b722789]\ndescription = \"the sound for 35 is PlangPlong as it has factors 5 and 7\"\n\n[c4680bee-69ba-439d-99b5-70c5fd1a7a83]\ndescription = \"the sound for 49 is Plong as it has a factor 7\"\n\n[17f2bc9a-b65a-4d23-8ccd-266e8c271444]\ndescription = \"the sound for 52 is 52\"\n\n[e46677ed-ff1a-419f-a740-5c713d2830e4]\ndescription = \"the sound for 105 is PlingPlangPlong as it has factors 3, 5 and 7\"\n\n[13c6837a-0fcd-4b86-a0eb-20572f7deb0b]\ndescription = \"the sound for 3125 is Plang as it has a factor 5\"\n"
  },
  {
    "path": "exercises/practice/raindrops/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/raindrops/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/raindrops/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/raindrops/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/raindrops/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/raindrops/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/raindrops/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-raindrops\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/raindrops/raindrops.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { convert } from './raindrops.ts'\n\ndescribe('Raindrops', () => {\n  it('converts 1', () => expect(convert(1)).toEqual('1'))\n\n  xit('converts 3', () => expect(convert(3)).toEqual('Pling'))\n\n  xit('converts 5', () => expect(convert(5)).toEqual('Plang'))\n\n  xit('converts 7', () => expect(convert(7)).toEqual('Plong'))\n\n  xit('converts 6', () => expect(convert(6)).toEqual('Pling'))\n\n  xit('converts 9', () => expect(convert(9)).toEqual('Pling'))\n\n  xit('converts 10', () => expect(convert(10)).toEqual('Plang'))\n\n  xit('converts 14', () => expect(convert(14)).toEqual('Plong'))\n\n  xit('converts 15', () => expect(convert(15)).toEqual('PlingPlang'))\n\n  xit('converts 21', () => expect(convert(21)).toEqual('PlingPlong'))\n\n  xit('converts 25', () => expect(convert(25)).toEqual('Plang'))\n\n  xit('converts 35', () => expect(convert(35)).toEqual('PlangPlong'))\n\n  xit('converts 49', () => expect(convert(49)).toEqual('Plong'))\n\n  xit('converts 52', () => expect(convert(52)).toEqual('52'))\n\n  xit('converts 105', () => expect(convert(105)).toEqual('PlingPlangPlong'))\n\n  xit('converts 12121', () => expect(convert(12121)).toEqual('12121'))\n})\n"
  },
  {
    "path": "exercises/practice/raindrops/raindrops.ts",
    "content": "export function convert() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/raindrops/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/raindrops/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/rational-numbers/.docs/instructions.md",
    "content": "# Instructions\n\nA rational number is defined as the quotient of two integers `a` and `b`, called the numerator and denominator, respectively, where `b != 0`.\n\n~~~~exercism/note\nNote that mathematically, the denominator can't be zero.\nHowever in many implementations of rational numbers, you will find that the denominator is allowed to be zero with behaviour similar to positive or negative infinity in floating point numbers.\nIn those cases, the denominator and numerator generally still can't both be zero at once.\n~~~~\n\nThe absolute value `|r|` of the rational number `r = a/b` is equal to `|a|/|b|`.\n\nThe sum of two rational numbers `r₁ = a₁/b₁` and `r₂ = a₂/b₂` is `r₁ + r₂ = a₁/b₁ + a₂/b₂ = (a₁ * b₂ + a₂ * b₁) / (b₁ * b₂)`.\n\nThe difference of two rational numbers `r₁ = a₁/b₁` and `r₂ = a₂/b₂` is `r₁ - r₂ = a₁/b₁ - a₂/b₂ = (a₁ * b₂ - a₂ * b₁) / (b₁ * b₂)`.\n\nThe product (multiplication) of two rational numbers `r₁ = a₁/b₁` and `r₂ = a₂/b₂` is `r₁ * r₂ = (a₁ * a₂) / (b₁ * b₂)`.\n\nDividing a rational number `r₁ = a₁/b₁` by another `r₂ = a₂/b₂` is `r₁ / r₂ = (a₁ * b₂) / (a₂ * b₁)` if `a₂` is not zero.\n\nExponentiation of a rational number `r = a/b` to a non-negative integer power `n` is `r^n = (a^n)/(b^n)`.\n\nExponentiation of a rational number `r = a/b` to a negative integer power `n` is `r^n = (b^m)/(a^m)`, where `m = |n|`.\n\nExponentiation of a rational number `r = a/b` to a real (floating-point) number `x` is the quotient `(a^x)/(b^x)`, which is a real number.\n\nExponentiation of a real number `x` to a rational number `r = a/b` is `x^(a/b) = root(x^a, b)`, where `root(p, q)` is the `q`th root of `p`.\n\nImplement the following operations:\n\n- addition, subtraction, multiplication and division of two rational numbers,\n- absolute value, exponentiation of a given rational number to an integer power, exponentiation of a given rational number to a real (floating-point) power, exponentiation of a real number to a rational number.\n\nYour implementation of rational numbers should always be reduced to lowest terms.\nFor example, `4/4` should reduce to `1/1`, `30/60` should reduce to `1/2`, `12/8` should reduce to `3/2`, etc.\nTo reduce a rational number `r = a/b`, divide `a` and `b` by the greatest common divisor (gcd) of `a` and `b`.\nSo, for example, `gcd(12, 8) = 4`, so `r = 12/8` can be reduced to `(12/4)/(8/4) = 3/2`.\nThe reduced form of a rational number should be in \"standard form\" (the denominator should always be a positive integer).\nIf a denominator with a negative integer is present, multiply both numerator and denominator by `-1` to ensure standard form is reached.\nFor example, `3/-4` should be reduced to `-3/4`\n\nAssume that the programming language you are using does not have an implementation of rational numbers.\n"
  },
  {
    "path": "exercises/practice/rational-numbers/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\",\n    \"angelikatyborska\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"rational-numbers.ts\"\n    ],\n    \"test\": [\n      \"rational-numbers.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Implement rational numbers.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Wikipedia\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/Rational_number\"\n}\n"
  },
  {
    "path": "exercises/practice/rational-numbers/.meta/proof.ci.ts",
    "content": "export class Rational {\n  public numerator: number\n  public denominator: number\n\n  constructor(numerator: number, denominator: number) {\n    if (denominator === 0) {\n      throw new Error('Denominator must not be zero.')\n    }\n\n    this.numerator = numerator\n    this.denominator = denominator\n\n    this.reduce()\n    this.ensureSignInNumerator()\n  }\n\n  public add(that: Rational): Rational {\n    const commonDenominator = this.denominator * that.denominator\n    return new Rational(\n      this.numerator * that.denominator + that.numerator * this.denominator,\n      commonDenominator\n    )\n  }\n\n  public sub(that: Rational): Rational {\n    const commonDenominator = this.denominator * that.denominator\n    return new Rational(\n      this.numerator * that.denominator - that.numerator * this.denominator,\n      commonDenominator\n    )\n  }\n\n  public mul(that: Rational): Rational {\n    return new Rational(\n      this.numerator * that.numerator,\n      this.denominator * that.denominator\n    )\n  }\n\n  public div(that: Rational): Rational {\n    return new Rational(\n      this.numerator * that.denominator,\n      this.denominator * that.numerator\n    )\n  }\n\n  public abs(): Rational {\n    return new Rational(Math.abs(this.numerator), Math.abs(this.denominator))\n  }\n\n  public exprational(n: number): Rational {\n    if (n > 0) {\n      return new Rational(\n        Math.pow(this.numerator, n),\n        Math.pow(this.denominator, n)\n      )\n    } else {\n      return new Rational(\n        Math.pow(this.denominator, Math.abs(n)),\n        Math.pow(this.numerator, Math.abs(n))\n      )\n    }\n  }\n\n  public expreal(base: number): number {\n    return Math.pow(\n      10.0,\n      Math.log10(Math.pow(base, this.numerator)) / this.denominator\n    )\n  }\n\n  public reduce(): this {\n    const commonDivisor = this.gcd(this.numerator, this.denominator)\n\n    this.numerator /= commonDivisor\n    this.denominator /= commonDivisor\n    this.ensureSignInNumerator()\n\n    return this\n  }\n\n  private gcd(a: number, b: number): number {\n    let localA = a\n    let localB = b\n    while (localB !== 0) {\n      const t = localB\n      localB = localA % localB\n      localA = t\n    }\n    return localA\n  }\n\n  private ensureSignInNumerator(): void {\n    if (this.denominator < 0) {\n      this.denominator = -this.denominator\n      this.numerator = -this.numerator\n    }\n  }\n}\n"
  },
  {
    "path": "exercises/practice/rational-numbers/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[0ba4d988-044c-4ed5-9215-4d0bb8d0ae9f]\ndescription = \"Arithmetic -> Addition -> Add two positive rational numbers\"\n\n[88ebc342-a2ac-4812-a656-7b664f718b6a]\ndescription = \"Arithmetic -> Addition -> Add a positive rational number and a negative rational number\"\n\n[92ed09c2-991e-4082-a602-13557080205c]\ndescription = \"Arithmetic -> Addition -> Add two negative rational numbers\"\n\n[6e58999e-3350-45fb-a104-aac7f4a9dd11]\ndescription = \"Arithmetic -> Addition -> Add a rational number to its additive inverse\"\n\n[47bba350-9db1-4ab9-b412-4a7e1f72a66e]\ndescription = \"Arithmetic -> Subtraction -> Subtract two positive rational numbers\"\n\n[93926e2a-3e82-4aee-98a7-fc33fb328e87]\ndescription = \"Arithmetic -> Subtraction -> Subtract a positive rational number and a negative rational number\"\n\n[a965ba45-9b26-442b-bdc7-7728e4b8d4cc]\ndescription = \"Arithmetic -> Subtraction -> Subtract two negative rational numbers\"\n\n[0df0e003-f68e-4209-8c6e-6a4e76af5058]\ndescription = \"Arithmetic -> Subtraction -> Subtract a rational number from itself\"\n\n[34fde77a-75f4-4204-8050-8d3a937958d3]\ndescription = \"Arithmetic -> Multiplication -> Multiply two positive rational numbers\"\n\n[6d015cf0-0ea3-41f1-93de-0b8e38e88bae]\ndescription = \"Arithmetic -> Multiplication -> Multiply a negative rational number by a positive rational number\"\n\n[d1bf1b55-954e-41b1-8c92-9fc6beeb76fa]\ndescription = \"Arithmetic -> Multiplication -> Multiply two negative rational numbers\"\n\n[a9b8f529-9ec7-4c79-a517-19365d779040]\ndescription = \"Arithmetic -> Multiplication -> Multiply a rational number by its reciprocal\"\n\n[d89d6429-22fa-4368-ab04-9e01a44d3b48]\ndescription = \"Arithmetic -> Multiplication -> Multiply a rational number by 1\"\n\n[0d95c8b9-1482-4ed7-bac9-b8694fa90145]\ndescription = \"Arithmetic -> Multiplication -> Multiply a rational number by 0\"\n\n[1de088f4-64be-4e6e-93fd-5997ae7c9798]\ndescription = \"Arithmetic -> Division -> Divide two positive rational numbers\"\n\n[7d7983db-652a-4e66-981a-e921fb38d9a9]\ndescription = \"Arithmetic -> Division -> Divide a positive rational number by a negative rational number\"\n\n[1b434d1b-5b38-4cee-aaf5-b9495c399e34]\ndescription = \"Arithmetic -> Division -> Divide two negative rational numbers\"\n\n[d81c2ebf-3612-45a6-b4e0-f0d47812bd59]\ndescription = \"Arithmetic -> Division -> Divide a rational number by 1\"\n\n[5fee0d8e-5955-4324-acbe-54cdca94ddaa]\ndescription = \"Absolute value -> Absolute value of a positive rational number\"\n\n[3cb570b6-c36a-4963-a380-c0834321bcaa]\ndescription = \"Absolute value -> Absolute value of a positive rational number with negative numerator and denominator\"\n\n[6a05f9a0-1f6b-470b-8ff7-41af81773f25]\ndescription = \"Absolute value -> Absolute value of a negative rational number\"\n\n[5d0f2336-3694-464f-8df9-f5852fda99dd]\ndescription = \"Absolute value -> Absolute value of a negative rational number with negative denominator\"\n\n[f8e1ed4b-9dca-47fb-a01e-5311457b3118]\ndescription = \"Absolute value -> Absolute value of zero\"\n\n[4a8c939f-f958-473b-9f88-6ad0f83bb4c4]\ndescription = \"Absolute value -> Absolute value of a rational number is reduced to lowest terms\"\n\n[ea2ad2af-3dab-41e7-bb9f-bd6819668a84]\ndescription = \"Exponentiation of a rational number -> Raise a positive rational number to a positive integer power\"\n\n[8168edd2-0af3-45b1-b03f-72c01332e10a]\ndescription = \"Exponentiation of a rational number -> Raise a negative rational number to a positive integer power\"\n\n[c291cfae-cfd8-44f5-aa6c-b175c148a492]\ndescription = \"Exponentiation of a rational number -> Raise a positive rational number to a negative integer power\"\n\n[45cb3288-4ae4-4465-9ae5-c129de4fac8e]\ndescription = \"Exponentiation of a rational number -> Raise a negative rational number to an even negative integer power\"\n\n[2d47f945-ffe1-4916-a399-c2e8c27d7f72]\ndescription = \"Exponentiation of a rational number -> Raise a negative rational number to an odd negative integer power\"\n\n[e2f25b1d-e4de-4102-abc3-c2bb7c4591e4]\ndescription = \"Exponentiation of a rational number -> Raise zero to an integer power\"\n\n[431cac50-ab8b-4d58-8e73-319d5404b762]\ndescription = \"Exponentiation of a rational number -> Raise one to an integer power\"\n\n[7d164739-d68a-4a9c-b99f-dd77ce5d55e6]\ndescription = \"Exponentiation of a rational number -> Raise a positive rational number to the power of zero\"\n\n[eb6bd5f5-f880-4bcd-8103-e736cb6e41d1]\ndescription = \"Exponentiation of a rational number -> Raise a negative rational number to the power of zero\"\n\n[30b467dd-c158-46f5-9ffb-c106de2fd6fa]\ndescription = \"Exponentiation of a real number to a rational number -> Raise a real number to a positive rational number\"\n\n[6e026bcc-be40-4b7b-ae22-eeaafc5a1789]\ndescription = \"Exponentiation of a real number to a rational number -> Raise a real number to a negative rational number\"\n\n[9f866da7-e893-407f-8cd2-ee85d496eec5]\ndescription = \"Exponentiation of a real number to a rational number -> Raise a real number to a zero rational number\"\n\n[0a63fbde-b59c-4c26-8237-1e0c73354d0a]\ndescription = \"Reduction to lowest terms -> Reduce a positive rational number to lowest terms\"\n\n[5ed6f248-ad8d-4d4e-a545-9146c6727f33]\ndescription = \"Reduction to lowest terms -> Reduce places the minus sign on the numerator\"\n\n[f87c2a4e-d29c-496e-a193-318c503e4402]\ndescription = \"Reduction to lowest terms -> Reduce a negative rational number to lowest terms\"\n\n[3b92ffc0-5b70-4a43-8885-8acee79cdaaf]\ndescription = \"Reduction to lowest terms -> Reduce a rational number with a negative denominator to lowest terms\"\n\n[c9dbd2e6-5ac0-4a41-84c1-48b645b4f663]\ndescription = \"Reduction to lowest terms -> Reduce zero to lowest terms\"\n\n[297b45ad-2054-4874-84d4-0358dc1b8887]\ndescription = \"Reduction to lowest terms -> Reduce an integer to lowest terms\"\n\n[a73a17fe-fe8c-4a1c-a63b-e7579e333d9e]\ndescription = \"Reduction to lowest terms -> Reduce one to lowest terms\"\n"
  },
  {
    "path": "exercises/practice/rational-numbers/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/rational-numbers/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/rational-numbers/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/rational-numbers/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/rational-numbers/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/rational-numbers/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/rational-numbers/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-rational-numbers\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/rational-numbers/rational-numbers.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { Rational } from './rational-numbers.ts'\n\n/* eslint-disable jest/expect-expect */\n\nfunction assertRational(\n  actual: Rational,\n  expectedNumerator: number,\n  expectedDenominator: number\n): void {\n  expect(actual.numerator).toEqual(expectedNumerator)\n  expect(actual.denominator).toEqual(expectedDenominator)\n}\n\ndescribe('Addition', () => {\n  it('Add two positive rational numbers', () => {\n    const actual = new Rational(1, 2).add(new Rational(2, 3))\n    assertRational(actual, 7, 6)\n  })\n\n  xit('Add a positive rational number and a negative rational number', () => {\n    const actual = new Rational(1, 2).add(new Rational(-2, 3))\n    assertRational(actual, -1, 6)\n  })\n\n  xit('Add two negative rational numbers', () => {\n    const actual = new Rational(-1, 2).add(new Rational(-2, 3))\n    assertRational(actual, -7, 6)\n  })\n\n  xit('Add a rational number to its additive inverse', () => {\n    const actual = new Rational(1, 2).add(new Rational(-1, 2))\n    assertRational(actual, 0, 1)\n  })\n})\n\ndescribe('Subtraction', () => {\n  xit('Subtract two positive rational numbers', () => {\n    const actual = new Rational(1, 2).sub(new Rational(2, 3))\n    assertRational(actual, -1, 6)\n  })\n\n  xit('Subtract a positive rational number and a negative rational number', () => {\n    const actual = new Rational(1, 2).sub(new Rational(-2, 3))\n    assertRational(actual, 7, 6)\n  })\n\n  xit('Subtract two negative rational numbers', () => {\n    const actual = new Rational(-1, 2).sub(new Rational(-2, 3))\n    assertRational(actual, 1, 6)\n  })\n\n  xit('Subtract a rational number from itself', () => {\n    const actual = new Rational(1, 2).sub(new Rational(1, 2))\n    assertRational(actual, 0, 1)\n  })\n})\n\ndescribe('Multiplication', () => {\n  xit('Multiply two positive rational numbers', () => {\n    const actual = new Rational(1, 2).mul(new Rational(2, 3))\n    assertRational(actual, 1, 3)\n  })\n\n  xit('Multiply a negative rational number by a positive rational number', () => {\n    const actual = new Rational(-1, 2).mul(new Rational(2, 3))\n    assertRational(actual, -1, 3)\n  })\n\n  xit('Multiply two negative rational numbers', () => {\n    const actual = new Rational(-1, 2).mul(new Rational(-2, 3))\n    assertRational(actual, 1, 3)\n  })\n\n  xit('Multiply a rational number by its reciprocal', () => {\n    const actual = new Rational(1, 2).mul(new Rational(2, 1))\n    assertRational(actual, 1, 1)\n  })\n\n  xit('Multiply a rational number by 1', () => {\n    const actual = new Rational(1, 2).mul(new Rational(1, 1))\n    assertRational(actual, 1, 2)\n  })\n\n  xit('Multiply a rational number by 0', () => {\n    const actual = new Rational(1, 2).mul(new Rational(0, 1))\n    assertRational(actual, 0, 1)\n  })\n})\n\ndescribe('Division', () => {\n  xit('Divide two positive rational numbers', () => {\n    const actual = new Rational(1, 2).div(new Rational(2, 3))\n    assertRational(actual, 3, 4)\n  })\n\n  xit('Divide a positive rational number by a negative rational number', () => {\n    const actual = new Rational(1, 2).div(new Rational(-2, 3))\n    assertRational(actual, -3, 4)\n  })\n\n  xit('Divide two negative rational numbers', () => {\n    const actual = new Rational(-1, 2).div(new Rational(-2, 3))\n    assertRational(actual, 3, 4)\n  })\n\n  xit('Divide a rational number by 1', () => {\n    const actual = new Rational(1, 2).div(new Rational(1, 1))\n    assertRational(actual, 1, 2)\n  })\n})\n\ndescribe('Absolute value', () => {\n  xit('Absolute value of a positive rational number', () => {\n    const actual = new Rational(1, 2).abs()\n    assertRational(actual, 1, 2)\n  })\n\n  xit('Absolute value of a positive rational number with negative numerator and denominator', () => {\n    const actual = new Rational(-1, -2).abs()\n    assertRational(actual, 1, 2)\n  })\n\n  xit('Absolute value of a negative rational number', () => {\n    const actual = new Rational(-1, 2).abs()\n    assertRational(actual, 1, 2)\n  })\n\n  xit('Absolute value of a negative rational number with negative denominator', () => {\n    const actual = new Rational(1, -2).abs()\n    assertRational(actual, 1, 2)\n  })\n\n  xit('Absolute value of zero', () => {\n    const actual = new Rational(0, 1).abs()\n    assertRational(actual, 0, 1)\n  })\n\n  xit('Absolute value of a rational number is reduced to lowest terms', () => {\n    const actual = new Rational(2, 4).abs()\n    assertRational(actual, 1, 2)\n  })\n})\n\ndescribe('Exponentiation of a rational number', () => {\n  xit('Raise a positive rational number to a positive integer power', () => {\n    const actual = new Rational(1, 2).exprational(3)\n    assertRational(actual, 1, 8)\n  })\n\n  xit('Raise a negative rational number to a positive integer power', () => {\n    const actual = new Rational(-1, 2).exprational(3)\n    assertRational(actual, -1, 8)\n  })\n\n  xit('Raise a positive rational number to a negative integer power', () => {\n    const actual = new Rational(3, 5).exprational(-2)\n    assertRational(actual, 25, 9)\n  })\n\n  xit('Raise a negative rational number to an even negative integer power', () => {\n    const actual = new Rational(-3, 5).exprational(-2)\n    assertRational(actual, 25, 9)\n  })\n\n  xit('Raise a negative rational number to an odd negative integer power', () => {\n    const actual = new Rational(-3, 5).exprational(-3)\n    assertRational(actual, -125, 27)\n  })\n\n  xit('Raise zero to an integer power', () => {\n    const actual = new Rational(0, 1).exprational(5)\n    assertRational(actual, 0, 1)\n  })\n\n  xit('Raise one to an integer power', () => {\n    const actual = new Rational(1, 1).exprational(4)\n    assertRational(actual, 1, 1)\n  })\n\n  xit('Raise a positive rational number to the power of zero', () => {\n    const actual = new Rational(1, 2).exprational(0)\n    assertRational(actual, 1, 1)\n  })\n\n  xit('Raise a negative rational number to the power of zero', () => {\n    const actual = new Rational(-1, 2).exprational(0)\n    assertRational(actual, 1, 1)\n  })\n})\n\ndescribe('Exponentiation of a real number to a rational number', () => {\n  xit('Raise a real number to a positive rational number', () => {\n    const actual = new Rational(4, 3).expreal(8)\n    expect(actual).toBeCloseTo(16.0, 10)\n  })\n\n  xit('Raise a real number to a negative rational number', () => {\n    const actual = new Rational(-1, 2).expreal(9)\n    expect(actual).toBeCloseTo(1.0 / 3.0, 10)\n  })\n\n  xit('Raise a real number to a zero rational number', () => {\n    const actual = new Rational(0, 1).expreal(2)\n    expect(actual).toBeCloseTo(1.0, 10)\n  })\n})\n\ndescribe('Reduction to lowest terms', () => {\n  xit('Reduce a positive rational number to lowest terms', () => {\n    const actual = new Rational(2, 4).reduce()\n    assertRational(actual, 1, 2)\n  })\n\n  xit('Reduce places the minus sign on the numerator', () => {\n    const actual = new Rational(3, -4).reduce()\n    assertRational(actual, -3, 4)\n  })\n\n  xit('Reduce a negative rational number to lowest terms', () => {\n    const actual = new Rational(-4, 6).reduce()\n    assertRational(actual, -2, 3)\n  })\n\n  xit('Reduce a rational number with a negative denominator to lowest terms', () => {\n    const actual = new Rational(3, -9).reduce()\n    assertRational(actual, -1, 3)\n  })\n\n  xit('Reduce zero to lowest terms', () => {\n    const actual = new Rational(0, 6).reduce()\n    assertRational(actual, 0, 1)\n  })\n\n  xit('Reduce an integer to lowest terms', () => {\n    const actual = new Rational(-14, 7).reduce()\n    assertRational(actual, -2, 1)\n  })\n\n  xit('Reduce one to lowest terms', () => {\n    const actual = new Rational(13, 13).reduce()\n    assertRational(actual, 1, 1)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/rational-numbers/rational-numbers.ts",
    "content": "export class Rational {\n  constructor() {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  add() {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  sub() {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  mul() {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  div() {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  abs() {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  exprational() {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  expreal() {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  reduce() {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/rational-numbers/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/rational-numbers/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/react/.docs/instructions.md",
    "content": "# Instructions\n\nImplement a basic reactive system.\n\nReactive programming is a programming paradigm that focuses on how values are computed in terms of each other to allow a change to one value to automatically propagate to other values, like in a spreadsheet.\n\nImplement a basic reactive system with cells with settable values (\"input\" cells) and cells with values computed in terms of other cells (\"compute\" cells).\nImplement updates so that when an input value is changed, values propagate to reach a new stable system state.\n\nIn addition, compute cells should allow for registering change notification callbacks.\nCall a cell’s callbacks when the cell’s value in a new stable state has changed from the previous stable state.\n"
  },
  {
    "path": "exercises/practice/react/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"peerreynders\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"react.ts\"\n    ],\n    \"test\": [\n      \"react.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Implement a basic reactive system.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  }\n}\n"
  },
  {
    "path": "exercises/practice/react/.meta/proof.ci.ts",
    "content": "//\n//  Heavily inspired by signal.ts from [https://github.com/ryansolid/solid]\n//  and by extension S.js [https://github.com/adamhaile/S]\n//\n// See:\n// https://indepth.dev/posts/1269/finding-fine-grained-reactive-programming#how-it-works\n// https://levelup.gitconnected.com/finding-fine-grained-reactive-programming-89741994ddee?source=friends_link&sk=31c66a70c1dce7dd5f3f4229423ad127#4543\n//\n\nenum Status {\n  OK,\n  Pending,\n  Stale,\n}\n\n/**\n * Type for the closure's value equality predicate.\n *\n * @typeParam T - Type of the values being compared for\n *              equality.\n *\n * @remarks\n * Conceptually this function should be equivalent\n * to: `lhs === rhs`\n *\n * @param lhs   - left hand side value\n * @param rhs   - right hand side value\n * @returns     - `true` if values are considered\n *                equal; `false` otherwise.\n */\ntype EqualFn<T> = (lhs: T, rhs: T) => boolean\ntype GetterFn<T> = () => T\ntype SetterFn<T> = (value: T) => T\ntype UnsubscribeFn = () => void\ntype UpdateFn<T> = (value?: T) => T\n\ntype InputPair<T> = [GetterFn<T>, SetterFn<T>]\n\ntype Options = {\n  name: string\n}\n\ntype ObserverR = {\n  name?: string\n  pure: boolean\n  status: Status\n  subjects: Set<SubjectR>\n}\n\ntype ObserverV<T> = {\n  value?: T\n  updateFn: UpdateFn<T>\n}\n\ntype Observer<T> = ObserverR & ObserverV<T>\n\ntype SubjectR = {\n  name?: string\n  observers: Set<ObserverR>\n}\n\ntype SubjectV<T> = {\n  value?: T\n  equalFn?: EqualFn<T>\n}\n\ntype Subject<T> = SubjectR & SubjectV<T>\n\ntype ComputedR = ObserverR & SubjectR\n\ntype Computed<T> = ComputedR & ObserverV<T> & SubjectV<T>\n\nfunction isObserverRComputedR(observer: ObserverR): observer is ComputedR {\n  const computed = observer as ComputedR\n  return computed.observers !== undefined\n}\n\nfunction isSubjectComputed<T>(subject: Subject<T>): subject is Computed<T> {\n  const computed = subject as Computed<T>\n  return computed.subjects !== undefined\n}\n\nfunction isObserverComputed<T>(observer: Observer<T>): observer is Computed<T> {\n  const computed = observer as Computed<T>\n  return computed.observers !== undefined\n}\n\nconst defaultEqual = <T>(lhs: T, rhs: T): boolean => lhs === rhs\n\nfunction selectEqualFn<T>(\n  equal: boolean | EqualFn<T> | undefined\n): EqualFn<T> | undefined {\n  if (typeof equal === 'function') return equal\n\n  if (equal === true) return defaultEqual\n\n  return undefined\n}\n\n// module context values\nlet activeObserver: ObserverR\nlet updateQueue: ObserverR[] | undefined\nlet callbackQueue: ObserverR[] | undefined\n\nfunction link(subject: SubjectR, observer: ObserverR): void {\n  observer.subjects.add(subject)\n  subject.observers.add(observer)\n}\n\nfunction unsubscribe(observer: ObserverR): void {\n  observer.subjects.forEach((sub) => {\n    sub.observers.delete(observer)\n  })\n}\n\nfunction makeUnsubscribe(observer: ObserverR | undefined): UnsubscribeFn {\n  return (): void => {\n    if (!observer) return\n    const o = observer\n    observer = undefined\n\n    unsubscribe(o)\n  }\n}\n\nfunction prepareForUpdate(observer: ObserverR): void {\n  if (isObserverRComputedR(observer) && observer.status !== Status.Pending) {\n    markDeepObservers(observer)\n  }\n  observer.status = Status.Stale\n\n  if (observer.pure) updateQueue!.push(observer)\n  else callbackQueue!.push(observer)\n}\n\nfunction markDeep(observer: ObserverR): void {\n  if (observer.status === Status.OK) {\n    observer.status = Status.Pending\n    if (isObserverRComputedR(observer)) markDeepObservers(observer)\n  }\n}\n\nfunction markDeepObservers(subject: SubjectR): void {\n  subject.observers.forEach(markDeep)\n}\n\nfunction runUpdates(prepareUpdates: () => void): void {\n  if (updateQueue) return prepareUpdates()\n\n  const updates: ObserverR[] = []\n  updateQueue = updates\n\n  const [callbacks, delayCallbacks] = callbackQueue\n    ? [callbackQueue, true]\n    : [[], false]\n  callbackQueue = callbacks\n\n  prepareUpdates()\n  updateQueued(updates)\n  updateQueue = undefined\n\n  if (delayCallbacks) return\n\n  updateQueued(callbacks)\n  callbackQueue = undefined\n}\n\nfunction updateQueued(queued: ObserverR[]): void {\n  for (let i = 0; i < queued.length; i++) {\n    updateViaStatus(queued[i] as Observer<unknown>, true)\n  }\n}\n\nfunction updateViaStatus<T>(\n  observer: Observer<T>,\n  saveQueue: boolean = false\n): void {\n  switch (observer.status) {\n    case Status.Pending: {\n      if (saveQueue !== true) {\n        updateDeepStaleSubjects(observer)\n      } else {\n        const prevUpdate = updateQueue\n        updateQueue = undefined\n        updateDeepStaleSubjects(observer)\n        updateQueue = prevUpdate\n      }\n      break\n    }\n    case Status.Stale:\n      updateObserver(observer)\n      break\n  }\n}\n\nfunction updateDeep<T>(subject: Subject<T>): void {\n  if (isSubjectComputed(subject)) updateViaStatus(subject)\n}\n\nfunction updateDeepStaleSubjects<T>(observer: Observer<T>): void {\n  observer.subjects.forEach(updateDeep)\n}\n\nfunction updateObserver<T>(observer: Observer<T>): void {\n  unsubscribe(observer)\n  const prevObserver = activeObserver\n  activeObserver = observer\n\n  observer.status = Status.OK\n  const nextValue = observer.updateFn(observer.value)\n  if (isObserverComputed(observer)) writeSubject(observer, nextValue)\n  else observer.value = nextValue\n\n  activeObserver = prevObserver\n}\n\nfunction readSubject<T>(subject: Subject<T>): T {\n  if (isSubjectComputed(subject) && subject.status !== Status.OK) {\n    const updates = updateQueue\n    updateQueue = undefined\n    updateViaStatus(subject)\n    updateQueue = updates\n  }\n  if (activeObserver) link(subject, activeObserver)\n\n  return subject.value!\n}\n\nfunction writeSubject<T>(subject: Subject<T>, value: T): T {\n  if (subject.equalFn && subject.value && subject.equalFn(subject.value, value))\n    return value\n\n  subject.value = value\n\n  if (subject.observers.size) {\n    runUpdates(() => subject.observers.forEach(prepareForUpdate))\n  }\n\n  return subject.value\n}\n\n/**\n * Creates an input closure. The value is accessed\n * via the accessor and changed via the\n * mutator returned as part an `InputPair<T>`.\n *\n * @typeParam T   - Type of the closure's value.\n *                By extension the type of the return\n *                value of the accessor and the type\n *                of the mutator's single argument.\n *\n * @param value   - Input closure's initial value.\n * @param equal   - By default the current and previous\n *                values are not compared so invoking\n *                the mutator with identical values\n *                will trigger updates on any\n *                subscribers. When `true` is\n *                specified the\n *                {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Strict_equality | strict equality operator}\n *                is used to compare values and\n *                mutations with unchanging values\n *                **are** suppressed.\n *                When `T` is a structural type\n *                it is necessary to provide a\n *                `(a: T, b: T) => boolean` comparison\n *                predicate instead.\n * @param options - Holder object for relevant options.\n *                Assigning a `name` to a subject can\n *                be useful during debugging.\n * @returns       - An `InputPair<T>`. The 1st\n *                element is the accessor (getter\n *                function), the 2nd element is\n *                the mutator (setter function).\n */\nfunction createInput<T>(\n  value: T,\n  equal?: boolean | EqualFn<T>,\n  options?: Options\n): InputPair<T> {\n  const subject: Subject<T> = {\n    name: options?.name,\n    observers: new Set<ObserverR>(),\n    value,\n    equalFn: selectEqualFn(equal),\n  }\n\n  return [\n    (): T => readSubject(subject),\n    (next: T): T => writeSubject(subject, next),\n  ]\n}\n\n/**\n * Creates a computed (derived) closure with the\n * supplied function which computes the current value\n * of the closure.\n *\n * @typeParam T   - Type of the closure's value.\n *                By extension the type of the value\n *                returned by the update function and\n *                of the value\n *                accepted by the function.\n *\n * @param updateFn - Update function. This function\n *                 references one or more accessors of\n *                 other subjects. It **should not**\n *                 perform side effects. It is expected\n *                 to return a value which will be the\n *                 value of the closure until the next\n *                 update. The closure's value is\n *                 supplied to this update function\n *                 on the next update.\n * @param value    - Initial value that is passed to\n *                 `updateFn` when it executes for the\n *                 first time.\n * @param equal    - By default the current and previous\n *                 values are not compared so updates\n *                 will be triggered even if the value\n *                 doesn't _change_. When `true` is\n *                 specified the\n *                 {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Strict_equality | strict equality operator}\n *                 is used to compare values and updates\n *                 with identical values **are**\n *                 suppressed. When `T` is a structural\n *                 type it is necessary to provide a\n *                 `(a: T, b: T) => boolean` comparison\n *                 predicate instead.\n * @param options  - Holder object for relevant options.\n *                 Assigning a `name` to a subject can\n *                 be useful during debugging.\n * @returns        - The accessor to the closure's\n *                 value (getter function). Retrieves\n *                 the closure's current value. Used by\n *                 observers (or more accurately their\n *                 update function) to obtain the\n *                 value (and to subscribe for\n *                 updates).\n */\nfunction createComputed<T>(\n  updateFn: UpdateFn<T>,\n  value?: T,\n  equal?: boolean | EqualFn<T>,\n  options?: Options\n): GetterFn<T> {\n  const computed: Computed<T> = {\n    name: options?.name,\n    observers: new Set<ObserverR>(),\n    value,\n    equalFn: selectEqualFn(equal),\n    updateFn,\n    status: Status.Stale,\n    pure: true,\n    subjects: new Set<SubjectR>(),\n  }\n  updateObserver(computed)\n  return (): T => readSubject(computed)\n}\n\n/**\n * Creates a callback closure with the supplied\n * function which is expected to perform side effects.\n *\n * @typeParam T    - Type of the closure's value.\n *                 By extension the type of the value\n *                 returned by the callback function\n *                 and of the value accepted by the\n *                 function.\n *\n * @param updateFn - Callback function. This function\n *                 references one or more accessors of\n *                 subjects. It may perform side effects.\n *                 It will also be passed the\n *                 value that it returned the last time it\n *                 was invoked.\n * @param value    - Initial value that is passed to\n *                 `updateFn` when it executes for\n *                  the first time.\n * @returns        - The `unsubscribe` function. Once\n *                 invoked the callback closure will\n *                 stop receiving updates from the\n *                 subjects it subscribed to.\n */\nfunction createCallback<T>(updateFn: UpdateFn<T>, value?: T): UnsubscribeFn {\n  const o: Observer<T> = {\n    value,\n    updateFn,\n    status: Status.Stale,\n    pure: false,\n    subjects: new Set<SubjectR>(),\n  }\n\n  if (callbackQueue) callbackQueue.push(o)\n  else updateObserver(o)\n\n  return makeUnsubscribe(o)\n}\n\nexport { createInput, createComputed, createCallback }\n\n// -------------------------------------------------------\n//\n// A `Subject<T>` provides its output value **to**\n// its dependents (`Observer<T>`s).\n//\n// An `Observer<T>` gets its input values **from**\n// its dependencies (`Subject<T>`s).\n//\n// A `Computed<T>` merges the _aspects_ of\n// both `Observer<T>` and `Subject<T>`.\n// Of the three types `Computed<T>` is the most _general_.\n// So while `Computed<T>` is composed of both\n// `Subject<T>` and `Observer<T>`, both\n// `Subject<T>`, `Observer<T>` could be viewed as\n// _constrained_ versions of `Computed<T>` (as\n// opposed to _specialized_ versions).\n//\n// Each type is further split into its _value_ aspect\n// (e.g. `ObserverV<T>`) and _relation_ (or _rest_)\n// aspect (e.g. `ObserverR`). This tactic helps to\n// avoid using generic type references with an\n// explicit _any_ type parameter in the update\n// routing logic which has no actual dependency\n// on the type `T` being managed by the\n// `Subject<T>`/ `Observer<T>`/`Computed<T>`\n// instance.\n//\n// The existence of the value aspect is only\n// acknowledged in `updateQueued()` where the\n// `ObserverR` type is asserted to be an\n// `Observer<unknown>` which from this point on is\n// then handled by generic functions.\n//\n// So `createInput<T>()` internally creates a\n// `Subject<T>`, `createCallback<T>()` an `Observer<T>`, and\n// `createComputed<T>()` a `Computed<T>`.\n//\n// `createInput<T>()` returns two functions in an\n// `InputCouple<T>` tuple, a `GetterFn<T>` accessor\n// and a `SetterFn<T>` mutator. The mutator triggers\n// the update of all the `Subject<T>`'s dependents\n// while the accessor returns the `Subject<T>`'s\n// current value.\n//\n// The accessor also has the hidden responsibility\n// of subscribing the `Observer<T>` that is accessing\n// the `Subject<T>`. The `Observer<T>` shares its\n// reference via the module's `activeObserver` context\n// value. The `Subject<T>` stores that dependency in\n// its `observers` property.\n//\n// `createComputed<T>()` only returns a `GetterFn<T>`\n// accessor to obtain the internal `Computed<T>`'s\n// current value. The primary argument to\n// `createComputed<T>()` is `fn: UpdateFn<T>` - the\n// function responsible for deriving the\n// `Computed<T>`'s value from its dependencies\n// (and the `Computed<T>`'s own previous value). This\n// function is invoked whenever at least one of the\n// `Computed<T>`'s dependencies has an updated value.\n// The function is run before `createComputed<T>()`\n// exits via `updateObserver<T>()` so that\n// * the `Computed<T>` can calculate its current value\n// * the `Computed<T>` subscribes to all its\n//   relevant dependencies.\n//\n// To that end `updateObserver<T>()` sets the\n// module's `activeObserver` context value before\n// invoking `fn: UpdateFn<T>` so that all the\n// `Subject<T>`'s being accessed can register the\n// subscription of the `Observer<T>` (or `Computed<T>`).\n//\n// (Note that `updateObserver<T>()` unsubscribes the\n// `Observer<T>` (or `Computed<T>`) first - this is\n// essential later so that the `Observer<T>` isn't\n// updated for  irrelevant dependencies - e.g. an\n// input accessor that is guarded by an `if` condition\n// that currently evaluates to `false`.)\n//\n// `createCallback<T>()` returns an `UnsubscribeFn`\n// function that deactivates the callback when invoked.\n// There is no `GetterFn<T>` because the callbacks\n// act by _side effect_ - i.e. changing values that\n// exist in their enclosing scope (closure:\n// https://github.com/getify/You-Dont-Know-JS/blob/2nd-ed/scope-closures/ch7.md\n// ). Internally a callback is based on a `Observer<T>`.\n// The primary argument to\n// `createCallback<T>()` is `fn: UpdateFn<T>` - the\n// function is responsible for accessing the `Subject<T>`\n// dependencies (and thereby subscribing to them)\n// and implementing the side effect(s). This\n// function is called whenever at least one of the\n// `Observer<T>`'s dependencies has an updated value.\n// `updateObserver<T>()` is only invoked if currently no\n// update is in progress - otherwise the callback is\n// queued for later invocation.\n//\n// All three `create*` functions take a `value: T`\n// argument - required for `createInput<T>()`,\n// optional for the others. For `createInput<T>()`\n// this is the initial value - for the others it is the\n// argument that is passed to the `fn: UpdateFn<T>`\n// the first time it executes.\n//\n// `createInput<T>()` and `createComputed<T>()` have\n// an (optional) ` equal?: boolean | EqualFn<T>`\n// argument. Given the generic implementation of the\n// capabilities, by default `Subject<T>`s don't\n// limit updates to occasions when their `value`\n// _changes_ - as there is no standardized way\n// to check for equality of `T` in TypeScript\n// (compared to for example Rust):\n// https://doc.rust-lang.org/std/cmp/trait.PartialEq.html\n// https://doc.rust-lang.org/std/cmp/trait.Eq.html\n//\n// A value of `true` directs the use of the default\n// equality function `defaultEqual` which will work\n// for primitive types and references. Otherwise a\n// custom equality predicate must be provided\n// if updates for identical values of `T` are to\n// be suppressed.\n//\n// `createCallback<T>` doesn't have this argument.\n// Therefore it is necessary to configure the\n// `Subject<T>`s it depends on to suppress updates\n// on identical values.\n//\n// `createInput<T>()` and `createComputed<T>()` have\n// an optional `Options` value that may carry a\n// `name` property. This can come in handy for\n// debugging.\n//\n// The core capability is driven by the\n// `writeSubject<T>` function which is invoked whenever\n// an input is set with its `SetterFn<T>` or a\n// `Computed<T>` has its `value` set by a dependency.\n// The update of dependents is suppressed for identical\n// values provided the `Subject<T>` is configured\n// accordingly. Otherwise all the observers are\n// prepared for update before the actual updates are\n// made.\n//\n// `prepareForUpdate()` first marks the dependents of a\n// `Computed<T>` as `Status.Pending` _in depth_. The\n// observer itself is marked as `Status.Stale` before\n// being pushed onto `updateQueue` or `callbackQueue`.\n//\n// * `Status.Pending` - an `Observer<T>` has this\n//   status when one of its dependencies _descendents_\n//   is marked as `Status.Stale`. It acts as a\n//   pre-`Status.Stale` status. The `Observer<T>`\n//   instance is \"out-of-sync\" but not yet ready\n//   for update (so it isn't on `updateQueue`).\n// * `Status.Stale` - an `Observer<T>` enters this\n//   state when at least one of its direct\n//   dependencies has been updated. The `Observer<T>`\n//   instance is on `updateQueue`.\n//\n// `runUpdates` coordinates the current update wave.\n// The passed `prepareUpdate` function is invoked if an\n// update wave is already underway. Otherwise an empty\n// `updateQueue` is set up. If callbacks are already\n// being queued this particular `runUpdates` invocation\n// won't be processing callbacks\n// (`delayCallbacks = true`) - otherwise an empty\n// `callbackQueue` is set up.\n//\n// Finally the passed `prepareUpdates` function is\n// invoked causing \"computeds\" to be queued up on\n// `updateQueue` and \"callbacks\" to be queued up on\n// `callbackQueue`. The `updateQueue` is processed\n// with the `updateQueued()` function.\n//\n// Callbacks are only processed if this is the\n// top-level invocation of `runUpdates()` - this\n// ensures that callbacks are updated as late as\n// possible to avoid unnecessary, multiple\n// updates.\n//\n// Updates routed through `updateViaStatus` by\n// `updateQueued` start a nested (deep) update wave\n// for an `Observer<T>` in the `Status.Pending`\n// status - i.e. there are dependencies in need of\n// update  before the `Observer<T>` can perform\n// a meaningful update of itself. `Observer<T>`'s\n// in the `Status.Stale` status can immediately update\n// themselves via their `fn: UpdateFn<T>`.\n//\n// `readSubject<T>()` will issue a nested update wave\n// if it discovers that its `Subject<T>` is currently\n// **not** in `Status.OK` status as it needs those\n// updates to complete before an up-to-date `value`\n// can be returned.\n//\n// References:\n//\n// Enums\n// https://www.typescriptlang.org/docs/handbook/enums.html\n//\n// Type Aliases\n// https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-aliases\n//\n// Function Types\n// https://www.typescriptlang.org/docs/handbook/functions.html#function-types\n//\n// Generics\n// https://www.typescriptlang.org/docs/handbook/generics.html\n//\n// Optional and Default Types\n// https://www.typescriptlang.org/docs/handbook/functions.html#optional-and-default-parameters\n//\n// Tuple\n// https://www.typescriptlang.org/docs/handbook/basic-types.html#tuple\n//\n// Optional Properties\n// https://www.typescriptlang.org/docs/handbook/interfaces.html#optional-properties\n//\n// Set\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set\n//\n// Intersection Types\n// https://www.typescriptlang.org/docs/handbook/unions-and-intersections.html#intersection-types\n//\n// User-Defined Type Guards\n// https://www.typescriptlang.org/docs/handbook/advanced-types.html#user-defined-type-guards\n//\n// Type Assertions\n// https://www.typescriptlang.org/docs/handbook/basic-types.html#type-assertions\n//\n// Union Types\n// https://www.typescriptlang.org/docs/handbook/unions-and-intersections.html#union-types\n//\n// typeof\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof\n//\n// Unknown\n// https://www.typescriptlang.org/docs/handbook/basic-types.html#unknown\n//\n// Non-null assertion operator\n// https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-0.html#non-null-assertion-operator\n//\n// Optional chaining (?.)\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining\n//\n// -------------------------------------------------------\n"
  },
  {
    "path": "exercises/practice/react/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[c51ee736-d001-4f30-88d1-0c8e8b43cd07]\ndescription = \"input cells have a value\"\n\n[dedf0fe0-da0c-4d5d-a582-ffaf5f4d0851]\ndescription = \"an input cell's value can be set\"\n\n[5854b975-f545-4f93-8968-cc324cde746e]\ndescription = \"compute cells calculate initial value\"\n\n[25795a3d-b86c-4e91-abe7-1c340e71560c]\ndescription = \"compute cells take inputs in the right order\"\n\n[c62689bf-7be5-41bb-b9f8-65178ef3e8ba]\ndescription = \"compute cells update value when dependencies are changed\"\n\n[5ff36b09-0a88-48d4-b7f8-69dcf3feea40]\ndescription = \"compute cells can depend on other compute cells\"\n\n[abe33eaf-68ad-42a5-b728-05519ca88d2d]\ndescription = \"compute cells fire callbacks\"\n\n[9e5cb3a4-78e5-4290-80f8-a78612c52db2]\ndescription = \"callback cells only fire on change\"\n\n[ada17cb6-7332-448a-b934-e3d7495c13d3]\ndescription = \"callbacks do not report already reported values\"\n\n[ac271900-ea5c-461c-9add-eeebcb8c03e5]\ndescription = \"callbacks can fire from multiple cells\"\n\n[95a82dcc-8280-4de3-a4cd-4f19a84e3d6f]\ndescription = \"callbacks can be added and removed\"\n\n[f2a7b445-f783-4e0e-8393-469ab4915f2a]\ndescription = \"removing a callback multiple times doesn't interfere with other callbacks\"\n\n[daf6feca-09e0-4ce5-801d-770ddfe1c268]\ndescription = \"callbacks should only be called once even if multiple dependencies change\"\n\n[9a5b159f-b7aa-4729-807e-f1c38a46d377]\ndescription = \"callbacks should not be called if dependencies change but output value doesn't change\"\n"
  },
  {
    "path": "exercises/practice/react/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/react/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/react/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/react/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/react/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/react/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/react/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-react\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/react/react.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { createInput, createComputed, createCallback } from './react.ts'\n\ndescribe('React module', () => {\n  // c51ee736-d001-4f30-88d1-0c8e8b43cd07\n  xit('input cells have a value', () => {\n    const initialValue = 10\n    const [input, _setInput] = createInput(initialValue)\n    expect(input()).toEqual(initialValue)\n  })\n\n  // dedf0fe0-da0c-4d5d-a582-ffaf5f4d0851\n  xit(\"an input cell's value can be set\", () => {\n    const newValue = 20\n    const [input, setInput] = createInput(4)\n    setInput(newValue)\n    expect(input()).toEqual(newValue)\n  })\n\n  // 5854b975-f545-4f93-8968-cc324cde746e\n  xit('compute cells calculate initial value', () => {\n    const [input] = createInput(1)\n    const output = createComputed(() => input() + 1)\n    expect(output()).toEqual(2)\n  })\n\n  // 25795a3d-b86c-4e91-abe7-1c340e71560c\n  xit('compute cell takes inputs in correct order', () => {\n    const [[one], [two]] = [createInput(1), createInput(2)]\n    const output = createComputed(() => one() + two() * 10)\n    expect(output()).toEqual(21)\n  })\n\n  // c62689bf-7be5-41bb-b9f8-65178ef3e8ba\n  it('compute cells update value when inputs are changed', () => {\n    const [input, setInput] = createInput(1)\n    const output = createComputed(() => input() + 1)\n    setInput(3)\n    expect(output()).toEqual(4)\n  })\n\n  // 5ff36b09-0a88-48d4-b7f8-69dcf3feea40\n  xit('compute cells can depend on other compute cells', () => {\n    const [input, setInput] = createInput(1)\n    const timesTwo = createComputed(() => input() * 2)\n    const timesThirty = createComputed(() => input() * 30)\n    const sum = createComputed(() => timesTwo() + timesThirty())\n    expect(sum()).toEqual(32)\n    setInput(3)\n    expect(sum()).toEqual(96)\n  })\n\n  // abe33eaf-68ad-42a5-b728-05519ca88d2d\n  xit('compute cells fire callbacks', () => {\n    const [input, setInput] = createInput(1)\n    const output = createComputed(() => input() + 1)\n    let value = 0\n    createCallback(() => (value = output()))\n    setInput(3)\n    expect(value).toEqual(4)\n  })\n\n  // 9e5cb3a4-78e5-4290-80f8-a78612c52db2\n  xit('callbacks fire only when output values change', () => {\n    const [input, setInput] = createInput(1)\n    const output = createComputed(\n      () => (input() < 3 ? 111 : 222),\n      undefined,\n      true // i.e. equality check - don't propagate if value doesn't change\n    )\n    let value: number | undefined\n    createCallback(() => (value = output()))\n    value = undefined // discard initial value from registration\n    setInput(2)\n    expect(value).toBeUndefined()\n    setInput(4)\n    expect(value).toEqual(222)\n  })\n\n  // ada17cb6-7332-448a-b934-e3d7495c13d\n  xit('callbacks do not report already reported values', () => {\n    const [input, setInput] = createInput(1)\n    const output = createComputed(() => input() + 1)\n\n    let value: number | undefined\n    createCallback(() => (value = output()))\n\n    setInput(2)\n    expect(value).toEqual(3)\n\n    setInput(3)\n    expect(value).toEqual(4)\n  })\n\n  // ac271900-ea5c-461c-9add-eeebcb8c03e5\n  xit('callbacks can fire from multiple cells', () => {\n    const [input, setInput] = createInput(1)\n    const plus_one = createComputed(() => input() + 1)\n    const minus_one = createComputed(() => input() - 1)\n\n    let value1 = 0\n    createCallback(() => (value1 = plus_one()))\n    let value2 = 0\n    createCallback(() => (value2 = minus_one()))\n\n    setInput(10)\n    expect(value1).toEqual(11)\n    expect(value2).toEqual(9)\n  })\n\n  // From JavaScript track\n  xit('static callbacks fire even if their own value has not changed', () => {\n    const [input, setInput] = createInput(1)\n    const output = createComputed(\n      () => (input() < 3 ? 111 : 222),\n      undefined,\n      true // i.e. equality check - don't propagate if value doesn't change\n    )\n    const values: string[] = []\n    createCallback(() => {\n      const _dontCare = output()\n      values.push('cell changed')\n    })\n    values.pop() // discard initial value from registration\n    setInput(2)\n    expect(values).toEqual([])\n    setInput(4)\n    setInput(2)\n    setInput(4)\n    expect(values).toEqual(['cell changed', 'cell changed', 'cell changed'])\n  })\n\n  // 95a82dcc-8280-4de3-a4cd-4f19a84e3d6f\n  xit('callbacks can be added and removed', () => {\n    const [input, setInput] = createInput(11)\n    const output = createComputed(() => input() + 1)\n\n    const values1: number[] = []\n    const unsubscribe1 = createCallback(() => values1.push(output()))\n    values1.pop() // discard initial value from registration\n    const values2: number[] = []\n    createCallback(() => values2.push(output()))\n    values2.pop() // discard initial value ...\n\n    setInput(31)\n\n    unsubscribe1()\n\n    const values3: number[] = []\n    createCallback(() => values3.push(output()))\n    values3.pop() // discard initial value ...\n\n    setInput(41)\n\n    expect(values1).toEqual([32])\n    expect(values2).toEqual([32, 42])\n    expect(values3).toEqual([42])\n  })\n\n  // f2a7b445-f783-4e0e-8393-469ab4915f2a\n  xit(\"removing a callback multiple times doesn't interfere with other callbacks\", () => {\n    const [input, setInput] = createInput(1)\n    const output = createComputed(() => input() + 1)\n\n    const values1: number[] = []\n    const unsubscribe1 = createCallback(() => values1.push(output()))\n    values1.pop() // discard initial value from registration\n    const values2: number[] = []\n    createCallback(() => values2.push(output()))\n    values2.pop() // discard initial value ...\n\n    unsubscribe1()\n    unsubscribe1()\n    unsubscribe1()\n\n    setInput(2)\n\n    expect(values1).toEqual([])\n    expect(values2).toEqual([3])\n  })\n\n  // daf6feca-09e0-4ce5-801d-770ddfe1c268\n  xit('callbacks should only be called once, even if multiple dependencies change', () => {\n    const [input, setInput] = createInput(1)\n    const plusOne = createComputed(() => input() + 1)\n    const minusOne1 = createComputed(() => input() - 1)\n    const minusOne2 = createComputed(() => minusOne1() - 1)\n    const output = createComputed(() => plusOne() * minusOne2())\n\n    const values: number[] = []\n    createCallback(() => values.push(output()))\n    values.pop() // discard initial value from registration\n\n    setInput(4)\n\n    expect(values).toEqual([10])\n  })\n\n  // 9a5b159f-b7aa-4729-807e-f1c38a46d377\n  xit(\"callbacks should not be called if dependencies change but output value doesn't change\", () => {\n    const [input, setInput] = createInput(1)\n    const plusOne = createComputed(() => input() + 1)\n    const minusOne = createComputed(() => input() - 1)\n    const alwaysTwo = createComputed(\n      () => plusOne() - minusOne(),\n      undefined,\n      true // i.e. equality check - don't propagate if value doesn't change\n    )\n\n    const values: number[] = []\n    createCallback(() => values.push(alwaysTwo()))\n    values.pop() // discard initial value from registration\n\n    setInput(2)\n    setInput(3)\n    setInput(4)\n    setInput(5)\n\n    expect(values).toEqual([])\n  })\n})\n"
  },
  {
    "path": "exercises/practice/react/react.ts",
    "content": "//\n// Delete and replace stub with your own implementation\n//\n// Inspired by \"How it Works\":\n// https://indepth.dev/posts/1269/finding-fine-grained-reactive-programming#how-it-works\n// https://levelup.gitconnected.com/finding-fine-grained-reactive-programming-89741994ddee?source=friends_link&sk=31c66a70c1dce7dd5f3f4229423ad127#4543\n//\n// and \"Computations\":\n// https://github.com/ryansolid/solid/blob/master/documentation/reactivity.md#user-content-computations\n//\n\n/**\n * Type for the closure's value equality predicate.\n *\n * @typeParam T - Type of the values being compared for\n *              equality.\n *\n * @remarks\n * Conceptually this function should be equivalent\n * to: `lhs === rhs`\n *\n * @param lhs   - left hand side value\n * @param rhs   - right hand side value\n * @returns     - `true` if values are considered\n *                equal; `false` otherwise.\n */\ntype EqualFn<T> = (lhs: T, rhs: T) => boolean\ntype GetterFn<T> = () => T\ntype SetterFn<T> = (value: T) => T\ntype UnsubscribeFn = () => void\ntype UpdateFn<T> = (value?: T) => T\n\ntype InputPair<T> = [GetterFn<T>, SetterFn<T>]\n\ntype Options = {\n  name: string // for debugging\n}\n\ntype ObserverR = {\n  name?: string\n}\n\ntype ObserverV<T> = {\n  value?: T\n  updateFn: UpdateFn<T>\n}\n\ntype Observer<T> = ObserverR & ObserverV<T>\n\ntype SubjectR = {\n  name?: string\n  observer: ObserverR | undefined\n}\n\ntype SubjectV<T> = {\n  value: T\n  equalFn?: EqualFn<T>\n}\n\ntype Subject<T> = SubjectR & SubjectV<T>\n\n// module Context value\nlet activeObserver: ObserverR\n\nfunction updateObserver<T>(observer: Observer<T>): void {\n  const prevObserver = activeObserver\n  activeObserver = observer\n  observer.value = observer.updateFn(observer.value)\n  activeObserver = prevObserver\n}\n\n/**\n * Creates an input closure. The value is accessed\n * via the accessor and changed via the\n * mutator returned as part an `InputPair<T>`.\n *\n * @typeParam T   - Type of the closure's value.\n *                By extension the type of the return\n *                value of the accessor and the type\n *                of the mutator's single argument.\n *\n * @param value   - Input closure's initial value.\n * @param equal   - By default the current and previous\n *                values are not compared so invoking\n *                the mutator with identical values\n *                will trigger updates on any\n *                subscribers. When `true` is\n *                specified the\n *                {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Strict_equality | strict equality operator}\n *                is used to compare values and\n *                mutations with unchanging values\n *                **are** suppressed.\n *                When `T` is a structural type\n *                it is necessary to provide a\n *                `(a: T, b: T) => boolean` comparison\n *                predicate instead.\n * @param options - Holder object for relevant options.\n *                Assigning a `name` to a subject can\n *                be useful during debugging.\n * @returns       - An `InputPair<T>`. The 1st\n *                element is the accessor (getter\n *                function), the 2nd element is\n *                the mutator (setter function).\n */\nfunction createInput<T>(\n  value: T,\n  _equal?: boolean | EqualFn<T>,\n  options?: Options\n): InputPair<T> {\n  const s: Subject<T> = {\n    name: options?.name,\n    observer: undefined,\n    value,\n    equalFn: undefined,\n  }\n\n  const read: GetterFn<T> = () => {\n    if (activeObserver) s.observer = activeObserver\n    return s.value\n  }\n\n  const write: SetterFn<T> = (nextValue) => {\n    s.value = nextValue\n    if (s.observer) updateObserver(s.observer as Observer<unknown>)\n    return s.value\n  }\n\n  return [read, write]\n}\n\n/**\n * Creates a computed (derived) closure with the\n * supplied function which computes the current value\n * of the closure.\n *\n * @privateRemarks\n * `Observer<T>` may be good enough to get through\n * the enabled test case but more is needed to\n * get further ...\n *\n * @typeParam T   - Type of the closure's value.\n *                By extension the type of the value\n *                returned by the update function and\n *                of the value\n *                accepted by the function.\n *\n * @param updateFn - Update function. This function\n *                 references one or more accessors of\n *                 other subjects. It **should not**\n *                 perform side effects. It is expected\n *                 to return a value which will be the\n *                 value of the closure until the next\n *                 update. The closure's value is\n *                 supplied to this update function\n *                 on the next update.\n * @param value    - Initial value that is passed to\n *                 `updateFn` when it executes for the\n *                 first time.\n * @param equal    - By default the current and previous\n *                 values are not compared so updates\n *                 will be triggered even if the value\n *                 doesn't _change_. When `true` is\n *                 specified the\n *                 {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Strict_equality | strict equality operator}\n *                 is used to compare values and updates\n *                 with identical values **are**\n *                 suppressed. When `T` is a structural\n *                 type it is necessary to provide a\n *                 `(a: T, b: T) => boolean` comparison\n *                 predicate instead.\n * @param options  - Holder object for relevant options.\n *                 Assigning a `name` to a subject can\n *                 be useful during debugging.\n * @returns        - The accessor to the closure's\n *                 value (getter function). Retrieves\n *                 the closure's current value. Used by\n *                 observers (or more accurately their\n *                 update function) to obtain the\n *                 value (and to subscribe for\n *                 updates).\n */\nfunction createComputed<T>(\n  updateFn: UpdateFn<T>,\n  value?: T,\n  _equal?: boolean | EqualFn<T>,\n  options?: { name?: string }\n): GetterFn<T> {\n  const o: Observer<T> = {\n    name: options?.name,\n    value,\n    updateFn,\n  }\n  updateObserver(o)\n  return (): T => o.value!\n}\n\n/**\n * Creates a callback closure with the supplied\n * function which is expected to perform side effects.\n *\n * @privateRemarks\n * `observer` isn't mean't to be an empty object literal.\n * Replace it with something more appropriate to its\n * purpose.\n *\n * @typeParam T    - Type of the closure's value.\n *                 By extension the type of the value\n *                 returned by the callback function\n *                 and of the value accepted by the\n *                 function.\n *\n * @param updateFn - Callback function. This function\n *                 references one or more accessors of\n *                 subjects. It may perform side effects.\n *                 It will also be passed the\n *                 value that it returned the last time it\n *                 was invoked.\n * @param value    - Initial value that is passed to\n *                 `updateFn` when it executes for\n *                  the first time.\n * @returns        - The `unsubscribe` function. Once\n *                 invoked the callback closure will\n *                 stop receiving updates from the\n *                 subjects it subscribed to.\n */\nfunction createCallback<T>(_updateFn: UpdateFn<T>, _value?: T): UnsubscribeFn {\n  const observer = {}\n  return ((observer: unknown | undefined) => (): void => {\n    if (!observer) return\n    observer = undefined\n    // i.e. dispose of any active subscriptions\n  })(observer)\n}\n\nexport { createInput, createComputed, createCallback }\n"
  },
  {
    "path": "exercises/practice/react/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/react/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/rectangles/.docs/instructions.md",
    "content": "# Instructions\n\nCount the rectangles in an ASCII diagram like the one below.\n\n```text\n   +--+\n  ++  |\n+-++--+\n|  |  |\n+--+--+\n```\n\nThe above diagram contains these 6 rectangles:\n\n```text\n\n\n+-----+\n|     |\n+-----+\n```\n\n```text\n   +--+\n   |  |\n   |  |\n   |  |\n   +--+\n```\n\n```text\n   +--+\n   |  |\n   +--+\n\n\n```\n\n```text\n\n\n   +--+\n   |  |\n   +--+\n```\n\n```text\n\n\n+--+\n|  |\n+--+\n```\n\n```text\n\n  ++\n  ++\n\n\n```\n\nYou may assume that the input is always a proper rectangle (i.e. the length of every line equals the length of the first line).\n"
  },
  {
    "path": "exercises/practice/rectangles/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"rectangles.ts\"\n    ],\n    \"test\": [\n      \"rectangles.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Count the rectangles in an ASCII diagram.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  }\n}\n"
  },
  {
    "path": "exercises/practice/rectangles/.meta/proof.ci.ts",
    "content": "export function count(diagram: string[]): number {\n  const rows = diagram.length\n  const cols = rows ? diagram[0].length : 0\n\n  let rectangles = 0\n\n  // All possible topleft corners\n  for (let y = 0; y < rows - 1; y++) {\n    for (let x = 0; x < cols - 1; x++) {\n      if (diagram[y].charAt(x) === '+') {\n        // All possible bottomright corners\n        for (let j = y + 1; j < rows; j++) {\n          for (let i = x + 1; i < cols; i++) {\n            // Check if all corners are valid\n            if (\n              diagram[j].charAt(i) === '+' &&\n              diagram[y].charAt(i) === '+' &&\n              diagram[j].charAt(x) === '+'\n            ) {\n              let validRectangle = true\n\n              // Check if all sides are valid\n              for (let s = x + 1; s < i; s++) {\n                if (!'+-'.includes(diagram[y].charAt(s))) {\n                  validRectangle = false\n                }\n              }\n\n              for (let s = x + 1; s < i; s++) {\n                if (!'+-'.includes(diagram[j].charAt(s))) {\n                  validRectangle = false\n                }\n              }\n\n              for (let t = y + 1; t < j; t++) {\n                if (!'+|'.includes(diagram[t].charAt(x))) {\n                  validRectangle = false\n                }\n              }\n\n              for (let t = y + 1; t < j; t++) {\n                if (!'+|'.includes(diagram[t].charAt(i))) {\n                  validRectangle = false\n                }\n              }\n\n              if (validRectangle) {\n                rectangles++\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  return rectangles\n}\n"
  },
  {
    "path": "exercises/practice/rectangles/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[485b7bab-4150-40aa-a8db-73013427d08c]\ndescription = \"no rows\"\n\n[076929ed-27e8-45dc-b14b-08279944dc49]\ndescription = \"no columns\"\n\n[0a8abbd1-a0a4-4180-aa4e-65c1b1a073fa]\ndescription = \"no rectangles\"\n\n[a4ba42e9-4e7f-4973-b7c7-4ce0760ac6cd]\ndescription = \"one rectangle\"\n\n[ced06550-83da-4d23-98b7-d24152e0db93]\ndescription = \"two rectangles without shared parts\"\n\n[5942d69a-a07c-41c8-8b93-2d13877c706a]\ndescription = \"five rectangles with shared parts\"\n\n[82d70be4-ab37-4bf2-a433-e33778d3bbf1]\ndescription = \"rectangle of height 1 is counted\"\n\n[57f1bc0e-2782-401e-ab12-7c01d8bfc2e0]\ndescription = \"rectangle of width 1 is counted\"\n\n[ef0bb65c-bd80-4561-9535-efc4067054f9]\ndescription = \"1x1 square is counted\"\n\n[e1e1d444-e926-4d30-9bf3-7d8ec9a9e330]\ndescription = \"only complete rectangles are counted\"\n\n[ca021a84-1281-4a56-9b9b-af14113933a4]\ndescription = \"rectangles can be of different sizes\"\n\n[51f689a7-ef3f-41ae-aa2f-5ea09ad897ff]\ndescription = \"corner is required for a rectangle to be complete\"\n\n[d78fe379-8c1b-4d3c-bdf7-29bfb6f6dc66]\ndescription = \"large input with many rectangles\"\n\n[6ef24e0f-d191-46da-b929-4faca24b4cd2]\ndescription = \"rectangles must have four sides\"\n"
  },
  {
    "path": "exercises/practice/rectangles/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/rectangles/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/rectangles/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/rectangles/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/rectangles/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/rectangles/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/rectangles/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-rectangles\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/rectangles/rectangles.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { count } from './rectangles.ts'\n\ndescribe('Rectangles', () => {\n  it('no rows', () => {\n    const expected = 0\n    const actual = count([])\n    expect(actual).toEqual(expected)\n  })\n\n  xit('no columns', () => {\n    const expected = 0\n    const actual = count([''])\n    expect(actual).toEqual(expected)\n  })\n\n  xit('no rectangles', () => {\n    const expected = 0\n    const actual = count([' '])\n    expect(actual).toEqual(expected)\n  })\n\n  xit('one rectangle', () => {\n    const expected = 1\n    const actual = count(['+-+', '| |', '+-+'])\n    expect(actual).toEqual(expected)\n  })\n\n  xit('two rectangles without shared parts', () => {\n    const expected = 2\n    const actual = count(['  +-+', '  | |', '+-+-+', '| |  ', '+-+  '])\n    expect(actual).toEqual(expected)\n  })\n\n  xit('five rectangles with shared parts', () => {\n    const expected = 5\n    const actual = count(['  +-+', '  | |', '+-+-+', '| | |', '+-+-+'])\n    expect(actual).toEqual(expected)\n  })\n\n  xit('rectangle of height 1 is counted', () => {\n    const expected = 1\n    const actual = count(['+--+', '+--+'])\n    expect(actual).toEqual(expected)\n  })\n\n  xit('rectangle of width 1 is counted', () => {\n    const expected = 1\n    const actual = count(['++', '||', '++'])\n    expect(actual).toEqual(expected)\n  })\n\n  xit('1x1 square is counted', () => {\n    const expected = 1\n    const actual = count(['++', '++'])\n    expect(actual).toEqual(expected)\n  })\n\n  xit('only complete rectangles are counted', () => {\n    const expected = 1\n    const actual = count(['  +-+', '    |', '+-+-+', '| | -', '+-+-+'])\n    expect(actual).toEqual(expected)\n  })\n\n  xit('rectangles can be of different sizes', () => {\n    const expected = 3\n    const actual = count([\n      '+------+----+',\n      '|      |    |',\n      '+---+--+    |',\n      '|   |       |',\n      '+---+-------+',\n    ])\n    expect(actual).toEqual(expected)\n  })\n\n  xit('corner is required for a rectangle to be complete', () => {\n    const expected = 2\n    const actual = count([\n      '+------+----+',\n      '|      |    |',\n      '+------+    |',\n      '|   |       |',\n      '+---+-------+',\n    ])\n    expect(actual).toEqual(expected)\n  })\n\n  xit('large input with many rectangles', () => {\n    const expected = 60\n    const actual = count([\n      '+---+--+----+',\n      '|   +--+----+',\n      '+---+--+    |',\n      '|   +--+----+',\n      '+---+--+--+-+',\n      '+---+--+--+-+',\n      '+------+  | |',\n      '          +-+',\n    ])\n    expect(actual).toEqual(expected)\n  })\n\n  xit('rectangles must have four sides', () => {\n    const expected = 5\n    const actual = count([\n      '+-+ +-+',\n      '| | | |',\n      '+-+-+-+',\n      '  | |  ',\n      '+-+-+-+',\n      '| | | |',\n      '+-+ +-+',\n    ])\n    expect(actual).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/rectangles/rectangles.ts",
    "content": "export function count() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/rectangles/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/rectangles/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/relative-distance/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to determine the degree of separation between two individuals in a family tree.\nThis is similar to the pop culture idea that every Hollywood actor is [within six degrees of Kevin Bacon][six-bacons].\n\n- You will be given an input, with all parent names and their children.\n- Each name is unique, a child _can_ have one or two parents.\n- The degree of separation is defined as the shortest number of connections from one person to another.\n- If two individuals are not connected, return a value that represents \"no known relationship.\"\n  Please see the test cases for the actual implementation.\n\n## Example\n\nGiven the following family tree:\n\n```text\n      ┌──────────┐            ┌──────────┐     ┌───────────┐\n      │  Helena  │            │  Erdős   ├─────┤  Shusaku  │\n      └───┬───┬──┘            └─────┬────┘     └────┬──────┘\n      ┌───┘   └───────┐             └───────┬───────┘\n┌─────┴────┐     ┌────┴───┐           ┌─────┴────┐\n│   Isla   ├─────┤ Tariq  │           │   Kevin  │\n└────┬─────┘     └────┬───┘           └──────────┘\n     │                │\n┌────┴────┐      ┌────┴───┐\n│   Uma   │      │ Morphy │\n└─────────┘      └────────┘\n```\n\nThe degree of separation between Tariq and Uma is 2 (Tariq → Isla → Uma).\nThere's no known relationship between Isla and Kevin, as there is no connection in the given data.\nThe degree of separation between Uma and Isla is 1.\n\n~~~~exercism/note\nIsla and Tariq are siblings and have a separation of 1.\nSimilarly, this implementation would report a separation of 2 from you to your father's brother.\n~~~~\n\n[six-bacons]: https://en.wikipedia.org/wiki/Six_Degrees_of_Kevin_Bacon\n"
  },
  {
    "path": "exercises/practice/relative-distance/.docs/introduction.md",
    "content": "# Introduction\n\nYou've been hired to develop **Noble Knots**, the hottest new dating app for nobility!\nWith centuries of royal intermarriage, things have gotten… _complicated_.\nTo avoid any _oops-we're-twins_ situations, your job is to build a system that checks how closely two people are related.\n\nNoble Knots is inspired by Iceland's \"[Islendinga-App][islendiga-app],\" which is backed up by a database that traces all known family connections between Icelanders from the time of the settlement of Iceland.\nYour algorithm will determine the **degree of separation** between two individuals in the royal family tree.\n\nWill your app help crown a perfect match?\n\n[islendiga-app]: https://web.archive.org/web/20250816223614/http://www.islendingaapp.is/information-in-english/\n"
  },
  {
    "path": "exercises/practice/relative-distance/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"BNAndras\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"relative-distance.ts\"\n    ],\n    \"test\": [\n      \"relative-distance.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given a family tree, calculate the degree of separation.\",\n  \"source\": \"vaeng\",\n  \"source_url\": \"https://github.com/exercism/problem-specifications/pull/2537\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  }\n}\n"
  },
  {
    "path": "exercises/practice/relative-distance/.meta/proof.ci.ts",
    "content": "export const degreesOfSeparation = (\n  familyTree: Record<string, string[]>,\n  personA: string,\n  personB: string\n) => {\n  const neighbors = new Map<string, Set<string>>()\n\n  // Build adjacency list\n  for (const [parent, children] of Object.entries(familyTree)) {\n    const parentNeighbors = neighbors.get(parent) ?? new Set()\n    neighbors.set(parent, parentNeighbors)\n\n    for (const child of children) {\n      const childNeighbors = neighbors.get(child) ?? new Set()\n      neighbors.set(child, childNeighbors)\n\n      parentNeighbors.add(child)\n      childNeighbors.add(parent)\n\n      // Connect siblings\n      for (const sibling of children) {\n        if (child !== sibling) {\n          childNeighbors.add(sibling)\n        }\n      }\n    }\n  }\n\n  if (!neighbors.has(personA) || !neighbors.has(personB)) return -1\n\n  // BFS setup\n  const queue: [string, number][] = [[personA, 0]]\n  const visited = new Set([personA])\n\n  while (queue.length > 0) {\n    const [current, degree] = queue.shift()!\n\n    if (current === personB) return degree\n\n    for (const neighbor of neighbors.get(current)!) {\n      if (!visited.has(neighbor)) {\n        visited.add(neighbor)\n        queue.push([neighbor, degree + 1])\n      }\n    }\n  }\n\n  return -1\n}\n"
  },
  {
    "path": "exercises/practice/relative-distance/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[4a1ded74-5d32-47fb-8ae5-321f51d06b5b]\ndescription = \"Direct parent-child relation\"\n\n[30d17269-83e9-4f82-a0d7-8ef9656d8dce]\ndescription = \"Sibling relationship\"\n\n[8dffa27d-a8ab-496d-80b3-2f21c77648b5]\ndescription = \"Two degrees of separation, grandchild\"\n\n[34e56ec1-d528-4a42-908e-020a4606ee60]\ndescription = \"Unrelated individuals\"\n\n[93ffe989-bad2-48c4-878f-3acb1ce2611b]\ndescription = \"Complex graph, cousins\"\n\n[2cc2e76b-013a-433c-9486-1dbe29bf06e5]\ndescription = \"Complex graph, no shortcut, far removed nephew\"\n\n[46c9fbcb-e464-455f-a718-049ea3c7400a]\ndescription = \"Complex graph, some shortcuts, cross-down and cross-up, cousins several times removed, with unrelated family tree\"\n"
  },
  {
    "path": "exercises/practice/relative-distance/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/relative-distance/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/relative-distance/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/relative-distance/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/relative-distance/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/relative-distance/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/relative-distance/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-relative-distance\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/relative-distance/relative-distance.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { degreesOfSeparation } from './relative-distance.ts'\n\ndescribe('RelativeDistance', () => {\n  it('Direct parent-child relation', () => {\n    const familyTree = {\n      Vera: ['Tomoko'],\n      Tomoko: ['Aditi'],\n    }\n    const actual = degreesOfSeparation(familyTree, 'Vera', 'Tomoko')\n    expect(actual).toEqual(1)\n  })\n\n  xit('Sibling relationship', () => {\n    const familyTree = {\n      Dalia: ['Olga', 'Yassin'],\n    }\n    const actual = degreesOfSeparation(familyTree, 'Olga', 'Yassin')\n    expect(actual).toEqual(1)\n  })\n\n  xit('Two degrees of separation, grandchild', () => {\n    const familyTree = {\n      Khadija: ['Mateo'],\n      Mateo: ['Rami'],\n    }\n    const actual = degreesOfSeparation(familyTree, 'Khadija', 'Rami')\n    expect(actual).toEqual(2)\n  })\n\n  xit('Unrelated individuals', () => {\n    const familyTree = {\n      Priya: ['Rami'],\n      Kaito: ['Elif'],\n    }\n    const actual = degreesOfSeparation(familyTree, 'Priya', 'Kaito')\n    expect(actual).toEqual(-1)\n  })\n\n  xit('Complex graph, cousins', () => {\n    const familyTree = {\n      Aiko: ['Bao', 'Carlos'],\n      Bao: ['Dalia', 'Elias'],\n      Carlos: ['Fatima', 'Gustavo'],\n      Dalia: ['Hassan', 'Isla'],\n      Elias: ['Javier'],\n      Fatima: ['Khadija', 'Liam'],\n      Gustavo: ['Mina'],\n      Hassan: ['Noah', 'Olga'],\n      Isla: ['Pedro'],\n      Javier: ['Quynh', 'Ravi'],\n      Khadija: ['Sofia'],\n      Liam: ['Tariq', 'Uma'],\n      Mina: ['Viktor', 'Wang'],\n      Noah: ['Xiomara'],\n      Olga: ['Yuki'],\n      Pedro: ['Zane', 'Aditi'],\n      Quynh: ['Boris'],\n      Ravi: ['Celine'],\n      Sofia: ['Diego', 'Elif'],\n      Tariq: ['Farah'],\n      Uma: ['Giorgio'],\n      Viktor: ['Hana', 'Ian'],\n      Wang: ['Jing'],\n      Xiomara: ['Kaito'],\n      Yuki: ['Leila'],\n      Zane: ['Mateo'],\n      Aditi: ['Nia'],\n      Boris: ['Oscar'],\n      Celine: ['Priya'],\n      Diego: ['Qi'],\n      Elif: ['Rami'],\n      Farah: ['Sven'],\n      Giorgio: ['Tomoko'],\n      Hana: ['Umar'],\n      Ian: ['Vera'],\n      Jing: ['Wyatt'],\n      Kaito: ['Xia'],\n      Leila: ['Yassin'],\n      Mateo: ['Zara'],\n      Nia: ['Antonio'],\n      Oscar: ['Bianca'],\n      Priya: ['Cai'],\n      Qi: ['Dimitri'],\n      Rami: ['Ewa'],\n      Sven: ['Fabio'],\n      Tomoko: ['Gabriela'],\n      Umar: ['Helena'],\n      Vera: ['Igor'],\n      Wyatt: ['Jun'],\n      Xia: ['Kim'],\n      Yassin: ['Lucia'],\n      Zara: ['Mohammed'],\n    }\n    const actual = degreesOfSeparation(familyTree, 'Dimitri', 'Fabio')\n    expect(actual).toEqual(9)\n  })\n\n  xit('Complex graph, no shortcut, far removed nephew', () => {\n    const familyTree = {\n      Mina: ['Viktor', 'Wang'],\n      Olga: ['Yuki'],\n      Javier: ['Quynh', 'Ravi'],\n      Tariq: ['Farah'],\n      Viktor: ['Hana', 'Ian'],\n      Diego: ['Qi'],\n      Carlos: ['Fatima', 'Gustavo'],\n      Hana: ['Umar'],\n      Jing: ['Wyatt'],\n      Sven: ['Fabio'],\n      Zane: ['Mateo'],\n      Isla: ['Pedro'],\n      Quynh: ['Boris'],\n      Kaito: ['Xia'],\n      Liam: ['Tariq', 'Uma'],\n      Priya: ['Cai'],\n      Qi: ['Dimitri'],\n      Wang: ['Jing'],\n      Yuki: ['Leila'],\n      Xia: ['Kim'],\n      Pedro: ['Zane', 'Aditi'],\n      Uma: ['Giorgio'],\n      Giorgio: ['Tomoko'],\n      Gustavo: ['Mina'],\n      Sofia: ['Diego', 'Elif'],\n      Leila: ['Yassin'],\n      Umar: ['Helena'],\n      Aiko: ['Bao', 'Carlos'],\n      Fatima: ['Khadija', 'Liam'],\n      Oscar: ['Bianca'],\n      Wyatt: ['Jun'],\n      Ian: ['Vera'],\n      Mateo: ['Zara'],\n      Noah: ['Xiomara'],\n      Celine: ['Priya'],\n      Xiomara: ['Kaito'],\n      Bao: ['Dalia', 'Elias'],\n      Elif: ['Rami'],\n      Farah: ['Sven'],\n      Aditi: ['Nia'],\n      Vera: ['Igor'],\n      Boris: ['Oscar'],\n      Khadija: ['Sofia'],\n      Zara: ['Mohammed'],\n      Dalia: ['Hassan', 'Isla'],\n      Ravi: ['Celine'],\n      Yassin: ['Lucia'],\n      Elias: ['Javier'],\n      Nia: ['Antonio'],\n      Rami: ['Ewa'],\n      Hassan: ['Noah', 'Olga'],\n      Tomoko: ['Gabriela'],\n    }\n    const actual = degreesOfSeparation(familyTree, 'Lucia', 'Jun')\n    expect(actual).toEqual(14)\n  })\n\n  xit('Complex graph, some shortcuts, cross-down and cross-up, cousins several times removed', () => {\n    const familyTree = {\n      Mina: ['Viktor', 'Wang'],\n      Olga: ['Yuki'],\n      Javier: ['Quynh', 'Ravi'],\n      Tariq: ['Farah'],\n      Viktor: ['Hana', 'Ian'],\n      Diego: ['Qi'],\n      Carlos: ['Fatima', 'Gustavo'],\n      Hana: ['Umar'],\n      Jing: ['Wyatt'],\n      Sven: ['Fabio'],\n      Zane: ['Mateo'],\n      Isla: ['Pedro'],\n      Quynh: ['Boris'],\n      Kaito: ['Xia'],\n      Liam: ['Tariq', 'Uma'],\n      Priya: ['Cai'],\n      Qi: ['Dimitri'],\n      Wang: ['Jing'],\n      Yuki: ['Leila'],\n      Xia: ['Kim'],\n      Pedro: ['Zane', 'Aditi'],\n      Uma: ['Giorgio'],\n      Giorgio: ['Tomoko'],\n      Gustavo: ['Mina'],\n      Sofia: ['Diego', 'Elif'],\n      Leila: ['Yassin'],\n      Umar: ['Helena'],\n      Aiko: ['Bao', 'Carlos'],\n      Fatima: ['Khadija', 'Liam'],\n      Oscar: ['Bianca'],\n      Wyatt: ['Jun'],\n      Ian: ['Vera'],\n      Mateo: ['Zara'],\n      Noah: ['Xiomara'],\n      Celine: ['Priya'],\n      Xiomara: ['Kaito'],\n      Bao: ['Dalia'],\n      Elif: ['Rami'],\n      Farah: ['Sven'],\n      Aditi: ['Nia'],\n      Vera: ['Igor'],\n      Boris: ['Oscar'],\n      Khadija: ['Sofia'],\n      Zara: ['Mohammed'],\n      Dalia: ['Hassan', 'Isla'],\n      Ravi: ['Celine'],\n      Yassin: ['Lucia'],\n      Nia: ['Antonio'],\n      Rami: ['Ewa'],\n      Hassan: ['Noah', 'Olga'],\n      Tomoko: ['Gabriela'],\n    }\n    const actual = degreesOfSeparation(familyTree, 'Wyatt', 'Xia')\n    expect(actual).toEqual(12)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/relative-distance/relative-distance.ts",
    "content": "export function degreesOfSeparation(\n  familyTree: unknown,\n  personA: unknown,\n  personB: unknown\n): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/relative-distance/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/relative-distance/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color/.docs/instructions.md",
    "content": "# Instructions\n\nIf you want to build something using a Raspberry Pi, you'll probably use _resistors_.\nFor this exercise, you need to know two things about them:\n\n- Each resistor has a resistance value.\n- Resistors are small - so small in fact that if you printed the resistance value on them, it would be hard to read.\n\nTo get around this problem, manufacturers print color-coded bands onto the resistors to denote their resistance values.\nEach band has a position and a numeric value.\n\nThe first 2 bands of a resistor have a simple encoding scheme: each color maps to a single number.\n\nIn this exercise you are going to create a helpful program so that you don't have to remember the values of the bands.\n\nThese colors are encoded as follows:\n\n- black: 0\n- brown: 1\n- red: 2\n- orange: 3\n- yellow: 4\n- green: 5\n- blue: 6\n- violet: 7\n- grey: 8\n- white: 9\n\nThe goal of this exercise is to create a way:\n\n- to look up the numerical value associated with a particular color band\n- to list the different band colors\n\nMnemonics map the colors to the numbers, that, when stored as an array, happen to map to their index in the array:\nBetter Be Right Or Your Great Big Values Go Wrong.\n\nMore information on the color encoding of resistors can be found in the [Electronic color code Wikipedia article][e-color-code].\n\n[e-color-code]: https://en.wikipedia.org/wiki/Electronic_color_code\n"
  },
  {
    "path": "exercises/practice/resistor-color/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"Roshanjossey\"\n  ],\n  \"contributors\": [\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"resistor-color.ts\"\n    ],\n    \"test\": [\n      \"resistor-color.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Convert a resistor band's color to its numeric representation.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Maud de Vries, Erik Schierboom\",\n  \"source_url\": \"https://github.com/exercism/problem-specifications/issues/1458\"\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color/.meta/proof.ci.ts",
    "content": "export const COLORS = [\n  'black',\n  'brown',\n  'red',\n  'orange',\n  'yellow',\n  'green',\n  'blue',\n  'violet',\n  'grey',\n  'white',\n]\n\nexport const colorCode = (color: string): number => COLORS.indexOf(color)\n"
  },
  {
    "path": "exercises/practice/resistor-color/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[49eb31c5-10a8-4180-9f7f-fea632ab87ef]\ndescription = \"Color codes -> Black\"\n\n[0a4df94b-92da-4579-a907-65040ce0b3fc]\ndescription = \"Color codes -> White\"\n\n[5f81608d-f36f-4190-8084-f45116b6f380]\ndescription = \"Color codes -> Orange\"\n\n[581d68fa-f968-4be2-9f9d-880f2fb73cf7]\ndescription = \"Colors\"\n"
  },
  {
    "path": "exercises/practice/resistor-color/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/resistor-color/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/resistor-color/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-resistor-color\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color/resistor-color.test.ts",
    "content": "import { describe, xdescribe, it, expect, xit } from '@jest/globals'\nimport { colorCode, COLORS } from './resistor-color.ts'\n\ndescribe('color code', () => {\n  it('Black', () => {\n    expect(colorCode('black')).toEqual(0)\n  })\n\n  xit('White', () => {\n    expect(colorCode('white')).toEqual(9)\n  })\n\n  xit('Orange', () => {\n    expect(colorCode('orange')).toEqual(3)\n  })\n})\n\nxdescribe('Colors', () => {\n  xit('returns all colors', () => {\n    expect(COLORS).toEqual([\n      'black',\n      'brown',\n      'red',\n      'orange',\n      'yellow',\n      'green',\n      'blue',\n      'violet',\n      'grey',\n      'white',\n    ])\n  })\n})\n"
  },
  {
    "path": "exercises/practice/resistor-color/resistor-color.ts",
    "content": "export const colorCode = () => {\n  throw new Error('Remove this line and implement the function')\n}\n\nexport const COLORS = undefined\n"
  },
  {
    "path": "exercises/practice/resistor-color/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/resistor-color/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color-duo/.docs/instructions.md",
    "content": "# Instructions\n\nIf you want to build something using a Raspberry Pi, you'll probably use _resistors_.\nFor this exercise, you need to know two things about them:\n\n- Each resistor has a resistance value.\n- Resistors are small - so small in fact that if you printed the resistance value on them, it would be hard to read.\n\nTo get around this problem, manufacturers print color-coded bands onto the resistors to denote their resistance values.\nEach band has a position and a numeric value.\n\nThe first 2 bands of a resistor have a simple encoding scheme: each color maps to a single number.\nFor example, if they printed a brown band (value 1) followed by a green band (value 5), it would translate to the number 15.\n\nIn this exercise you are going to create a helpful program so that you don't have to remember the values of the bands.\nThe program will take color names as input and output a two digit number, even if the input is more than two colors!\n\nThe band colors are encoded as follows:\n\n- black: 0\n- brown: 1\n- red: 2\n- orange: 3\n- yellow: 4\n- green: 5\n- blue: 6\n- violet: 7\n- grey: 8\n- white: 9\n\nFrom the example above:\nbrown-green should return 15, and\nbrown-green-violet should return 15 too, ignoring the third color.\n"
  },
  {
    "path": "exercises/practice/resistor-color-duo/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"msomji\"\n  ],\n  \"contributors\": [\n    \"EduardoBautista\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"resistor-color-duo.ts\"\n    ],\n    \"test\": [\n      \"resistor-color-duo.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Convert color codes, as used on resistors, to a numeric value.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Maud de Vries, Erik Schierboom\",\n  \"source_url\": \"https://github.com/exercism/problem-specifications/issues/1464\"\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color-duo/.meta/proof.ci.ts",
    "content": "// resistor-color solution START\nconst COLORS = [\n  'black',\n  'brown',\n  'red',\n  'orange',\n  'yellow',\n  'green',\n  'blue',\n  'violet',\n  'grey',\n  'white',\n]\n\nconst colorCode = (color: string): number => COLORS.indexOf(color)\n// resistor-color solution END\n\nexport const decodedValue = ([tens, ones]: string[]): number =>\n  colorCode(tens) * 10 + colorCode(ones)\n"
  },
  {
    "path": "exercises/practice/resistor-color-duo/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[ce11995a-5b93-4950-a5e9-93423693b2fc]\ndescription = \"Brown and black\"\n\n[7bf82f7a-af23-48ba-a97d-38d59406a920]\ndescription = \"Blue and grey\"\n\n[f1886361-fdfd-4693-acf8-46726fe24e0c]\ndescription = \"Yellow and violet\"\n\n[b7a6cbd2-ae3c-470a-93eb-56670b305640]\ndescription = \"White and red\"\n\n[77a8293d-2a83-4016-b1af-991acc12b9fe]\ndescription = \"Orange and orange\"\n\n[0c4fb44f-db7c-4d03-afa8-054350f156a8]\ndescription = \"Ignore additional colors\"\n\n[4a8ceec5-0ab4-4904-88a4-daf953a5e818]\ndescription = \"Black and brown, one-digit\"\n"
  },
  {
    "path": "exercises/practice/resistor-color-duo/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color-duo/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color-duo/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/resistor-color-duo/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color-duo/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/resistor-color-duo/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color-duo/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-resistor-color-duo\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color-duo/resistor-color-duo.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { decodedValue } from './resistor-color-duo.ts'\n\ndescribe('Resistor Colors', () => {\n  it('Brown and black', () => {\n    expect(decodedValue(['brown', 'black'])).toEqual(10)\n  })\n\n  xit('Blue and grey', () => {\n    expect(decodedValue(['blue', 'grey'])).toEqual(68)\n  })\n\n  xit('White and red', () => {\n    expect(decodedValue(['white', 'red'])).toEqual(92)\n  })\n\n  xit('Yellow and violet', () => {\n    expect(decodedValue(['yellow', 'violet'])).toEqual(47)\n  })\n\n  xit('Orange and orange', () => {\n    expect(decodedValue(['orange', 'orange'])).toEqual(33)\n  })\n\n  xit('Ignore additional colors', () => {\n    expect(decodedValue(['green', 'brown', 'orange'])).toEqual(51)\n  })\n\n  xit('Black and brown, one-digit', () => {\n    expect(decodedValue(['black', 'brown'])).toEqual(1)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/resistor-color-duo/resistor-color-duo.ts",
    "content": "export function decodedValue() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color-duo/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/resistor-color-duo/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color-trio/.docs/instructions.md",
    "content": "# Instructions\n\nIf you want to build something using a Raspberry Pi, you'll probably use _resistors_.\nFor this exercise, you need to know only three things about them:\n\n- Each resistor has a resistance value.\n- Resistors are small - so small in fact that if you printed the resistance value on them, it would be hard to read.\n  To get around this problem, manufacturers print color-coded bands onto the resistors to denote their resistance values.\n- Each band acts as a digit of a number.\n  For example, if they printed a brown band (value 1) followed by a green band (value 5), it would translate to the number 15.\n  In this exercise, you are going to create a helpful program so that you don't have to remember the values of the bands.\n  The program will take 3 colors as input, and outputs the correct value, in ohms.\n  The color bands are encoded as follows:\n\n- black: 0\n- brown: 1\n- red: 2\n- orange: 3\n- yellow: 4\n- green: 5\n- blue: 6\n- violet: 7\n- grey: 8\n- white: 9\n\nIn Resistor Color Duo you decoded the first two colors.\nFor instance: orange-orange got the main value `33`.\nThe third color stands for how many zeros need to be added to the main value.\nThe main value plus the zeros gives us a value in ohms.\nFor the exercise it doesn't matter what ohms really are.\nFor example:\n\n- orange-orange-black would be 33 and no zeros, which becomes 33 ohms.\n- orange-orange-red would be 33 and 2 zeros, which becomes 3300 ohms.\n- orange-orange-orange would be 33 and 3 zeros, which becomes 33000 ohms.\n\n(If Math is your thing, you may want to think of the zeros as exponents of 10.\nIf Math is not your thing, go with the zeros.\nIt really is the same thing, just in plain English instead of Math lingo.)\n\nThis exercise is about translating the colors into a label:\n\n> \"... ohms\"\n\nSo an input of `\"orange\", \"orange\", \"black\"` should return:\n\n> \"33 ohms\"\n\nWhen we get to larger resistors, a [metric prefix][metric-prefix] is used to indicate a larger magnitude of ohms, such as \"kiloohms\".\nThat is similar to saying \"2 kilometers\" instead of \"2000 meters\", or \"2 kilograms\" for \"2000 grams\".\n\nFor example, an input of `\"orange\", \"orange\", \"orange\"` should return:\n\n> \"33 kiloohms\"\n\n[metric-prefix]: https://en.wikipedia.org/wiki/Metric_prefix\n"
  },
  {
    "path": "exercises/practice/resistor-color-trio/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"rodmagaldi\"\n  ],\n  \"contributors\": [\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"resistor-color-trio.ts\"\n    ],\n    \"test\": [\n      \"resistor-color-trio.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Convert color codes, as used on resistors, to a human-readable label.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Maud de Vries, Erik Schierboom\",\n  \"source_url\": \"https://github.com/exercism/problem-specifications/issues/1549\"\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color-trio/.meta/proof.ci.ts",
    "content": "// resistor-color solution START\nconst COLORS = [\n  'black',\n  'brown',\n  'red',\n  'orange',\n  'yellow',\n  'green',\n  'blue',\n  'violet',\n  'grey',\n  'white',\n]\n\nconst colorCode = (color: string): number => COLORS.indexOf(color)\n// resistor-color solution END\n\ninterface IUnits {\n  name: string\n  numberOfZeros: number\n  representation: string\n}\n\nconst UNITS: IUnits[] = [\n  {\n    name: 'giga',\n    numberOfZeros: 9,\n    representation: '000000000',\n  },\n  {\n    name: 'mega',\n    numberOfZeros: 6,\n    representation: '000000',\n  },\n  {\n    name: 'kilo',\n    numberOfZeros: 3,\n    representation: '000',\n  },\n]\n\nexport const decodedResistorValue = ([\n  tens,\n  ones,\n  exponent,\n]: string[]): string => {\n  const numericValue =\n    (colorCode(tens) * 10 + colorCode(ones)) * 10 ** colorCode(exponent)\n  const stringifiedValue = numericValue.toString()\n\n  let readableUnit = ''\n  let readableValue: string = stringifiedValue\n\n  for (const unit of UNITS) {\n    if (stringifiedValue.endsWith(unit.representation)) {\n      readableUnit = unit.name\n      readableValue = readableValue.slice(0, -unit.numberOfZeros)\n      break\n    }\n  }\n\n  return `${readableValue} ${readableUnit}ohms`\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color-trio/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[d6863355-15b7-40bb-abe0-bfb1a25512ed]\ndescription = \"Orange and orange and black\"\n\n[1224a3a9-8c8e-4032-843a-5224e04647d6]\ndescription = \"Blue and grey and brown\"\n\n[b8bda7dc-6b95-4539-abb2-2ad51d66a207]\ndescription = \"Red and black and red\"\n\n[5b1e74bc-d838-4eda-bbb3-eaba988e733b]\ndescription = \"Green and brown and orange\"\n\n[f5d37ef9-1919-4719-a90d-a33c5a6934c9]\ndescription = \"Yellow and violet and yellow\"\n\n[5f6404a7-5bb3-4283-877d-3d39bcc33854]\ndescription = \"Blue and violet and blue\"\n\n[7d3a6ab8-e40e-46c3-98b1-91639fff2344]\ndescription = \"Minimum possible value\"\n\n[ca0aa0ac-3825-42de-9f07-dac68cc580fd]\ndescription = \"Maximum possible value\"\n\n[0061a76c-903a-4714-8ce2-f26ce23b0e09]\ndescription = \"First two colors make an invalid octal number\"\n\n[30872c92-f567-4b69-a105-8455611c10c4]\ndescription = \"Ignore extra colors\"\n"
  },
  {
    "path": "exercises/practice/resistor-color-trio/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color-trio/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color-trio/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/resistor-color-trio/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color-trio/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/resistor-color-trio/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color-trio/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-resistor-color-trio\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism practice exercise on resistor-color-trio\",\n  \"author\": \"Katrina Owen\",\n  \"contributors\": [\n    \"Derk-Jan Karrenbeld <derk-jan+git@karrenbeld.info> (https://derk-jan.com)\"\n  ],\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color-trio/resistor-color-trio.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { decodedResistorValue } from './resistor-color-trio.ts'\n\ndescribe('Resistor Colors', () => {\n  it('Orange and orange and black', () => {\n    expect(decodedResistorValue(['orange', 'orange', 'black'])).toEqual(\n      '33 ohms'\n    )\n  })\n\n  xit('Blue and grey and brown', () => {\n    expect(decodedResistorValue(['blue', 'grey', 'brown'])).toEqual('680 ohms')\n  })\n\n  xit('Red and black and red', () => {\n    expect(decodedResistorValue(['red', 'black', 'red'])).toEqual('2 kiloohms')\n  })\n\n  xit('Green and brown and orange', () => {\n    expect(decodedResistorValue(['green', 'brown', 'orange'])).toEqual(\n      '51 kiloohms'\n    )\n  })\n\n  xit('Yellow and violet and yellow', () => {\n    expect(decodedResistorValue(['yellow', 'violet', 'yellow'])).toEqual(\n      '470 kiloohms'\n    )\n  })\n\n  xit('Blue and violet and blue', () => {\n    expect(decodedResistorValue(['blue', 'violet', 'blue'])).toEqual(\n      '67 megaohms'\n    )\n  })\n\n  xit('Minimum possible value', () => {\n    expect(decodedResistorValue(['black', 'black', 'black'])).toEqual('0 ohms')\n  })\n\n  xit('Maximum possible value', () => {\n    expect(decodedResistorValue(['white', 'white', 'white'])).toEqual(\n      '99 gigaohms'\n    )\n  })\n\n  xit('First two colors make an invalid octal number', () => {\n    expect(decodedResistorValue(['black', 'grey', 'black'])).toEqual('8 ohms')\n  })\n\n  xit('Ignore extra colors', () => {\n    expect(decodedResistorValue(['blue', 'green', 'yellow', 'orange'])).toEqual(\n      '650 kiloohms'\n    )\n  })\n})\n"
  },
  {
    "path": "exercises/practice/resistor-color-trio/resistor-color-trio.ts",
    "content": "export function decodedResistorValue() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/resistor-color-trio/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/resistor-color-trio/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/reverse-string/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to reverse a given string.\n\nSome examples:\n\n- Turn `\"stressed\"` into `\"desserts\"`.\n- Turn `\"strops\"` into `\"sports\"`.\n- Turn `\"racecar\"` into `\"racecar\"`.\n"
  },
  {
    "path": "exercises/practice/reverse-string/.docs/introduction.md",
    "content": "# Introduction\n\nReversing strings (reading them from right to left, rather than from left to right) is a surprisingly common task in programming.\n\nFor example, in bioinformatics, reversing the sequence of DNA or RNA strings is often important for various analyses, such as finding complementary strands or identifying palindromic sequences that have biological significance.\n"
  },
  {
    "path": "exercises/practice/reverse-string/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"reverse-string.ts\"\n    ],\n    \"test\": [\n      \"reverse-string.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Reverse a given string.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Introductory challenge to reverse an input string\",\n  \"source_url\": \"https://www.freecodecamp.org/news/how-to-reverse-a-string-in-javascript-in-3-different-ways-75e4763c68cb\"\n}\n"
  },
  {
    "path": "exercises/practice/reverse-string/.meta/proof.ci.ts",
    "content": "export function reverse(value: string): string {\n  return value.split('').reverse().join('')\n}\n"
  },
  {
    "path": "exercises/practice/reverse-string/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[c3b7d806-dced-49ee-8543-933fd1719b1c]\ndescription = \"an empty string\"\n\n[01ebf55b-bebb-414e-9dec-06f7bb0bee3c]\ndescription = \"a word\"\n\n[0f7c07e4-efd1-4aaa-a07a-90b49ce0b746]\ndescription = \"a capitalized word\"\n\n[71854b9c-f200-4469-9f5c-1e8e5eff5614]\ndescription = \"a sentence with punctuation\"\n\n[1f8ed2f3-56f3-459b-8f3e-6d8d654a1f6c]\ndescription = \"a palindrome\"\n\n[b9e7dec1-c6df-40bd-9fa3-cd7ded010c4c]\ndescription = \"an even-sized word\"\n\n[1bed0f8a-13b0-4bd3-9d59-3d0593326fa2]\ndescription = \"wide characters\"\n\n[93d7e1b8-f60f-4f3c-9559-4056e10d2ead]\ndescription = \"grapheme cluster with pre-combined form\"\ninclude = false\ncomment = \"revisit once after upgrade to es2022 or higher\"\n\n[1028b2c1-6763-4459-8540-2da47ca512d9]\ndescription = \"grapheme clusters\"\ninclude = false\ncomment = \"revisit once after upgrade to es2022 or higher\"\n"
  },
  {
    "path": "exercises/practice/reverse-string/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/reverse-string/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/reverse-string/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/reverse-string/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/reverse-string/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/reverse-string/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/reverse-string/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-reverse-string\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/reverse-string/reverse-string.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { reverse } from './reverse-string.ts'\n\ndescribe('Reverse String', () => {\n  it('an empty string', () => {\n    const expected = ''\n    expect(reverse('')).toEqual(expected)\n  })\n\n  xit('a word', () => {\n    const expected = 'tobor'\n    expect(reverse('robot')).toEqual(expected)\n  })\n\n  xit('a capitalized word', () => {\n    const expected = 'nemaR'\n    expect(reverse('Ramen')).toEqual(expected)\n  })\n\n  xit('a sentence with punctuation', () => {\n    const expected = `!yrgnuh m'I`\n    expect(reverse(`I'm hungry!`)).toEqual(expected)\n  })\n\n  xit('a palindrome', () => {\n    const expected = 'racecar'\n    expect(reverse('racecar')).toEqual(expected)\n  })\n\n  xit('an even-sized word', () => {\n    const expected = 'reward'\n    expect(reverse('drawer')).toEqual(expected)\n  })\n\n  xit('wide characters', () => {\n    const expected = '猫子'\n    expect(reverse('子猫')).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/reverse-string/reverse-string.ts",
    "content": "export function reverse(/* Parameters go here */) {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/reverse-string/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/reverse-string/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/rna-transcription/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to determine the RNA complement of a given DNA sequence.\n\nBoth DNA and RNA strands are a sequence of nucleotides.\n\nThe four nucleotides found in DNA are adenine (**A**), cytosine (**C**), guanine (**G**), and thymine (**T**).\n\nThe four nucleotides found in RNA are adenine (**A**), cytosine (**C**), guanine (**G**), and uracil (**U**).\n\nGiven a DNA strand, its transcribed RNA strand is formed by replacing each nucleotide with its complement:\n\n- `G` -> `C`\n- `C` -> `G`\n- `T` -> `A`\n- `A` -> `U`\n\n~~~~exercism/note\nIf you want to look at how the inputs and outputs are structured, take a look at the examples in the test suite.\n~~~~\n"
  },
  {
    "path": "exercises/practice/rna-transcription/.docs/introduction.md",
    "content": "# Introduction\n\nYou work for a bioengineering company that specializes in developing therapeutic solutions.\n\nYour team has just been given a new project to develop a targeted therapy for a rare type of cancer.\n\n~~~~exercism/note\nIt's all very complicated, but the basic idea is that sometimes people's bodies produce too much of a given protein.\nThat can cause all sorts of havoc.\n\nBut if you can create a very specific molecule (called a micro-RNA), it can prevent the protein from being produced.\n\nThis technique is called [RNA Interference][rnai].\n\n[rnai]: https://admin.acceleratingscience.com/ask-a-scientist/what-is-rnai/\n~~~~\n"
  },
  {
    "path": "exercises/practice/rna-transcription/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"masters3d\"\n  ],\n  \"contributors\": [\n    \"DFXLuna\",\n    \"lukaszklis\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"rna-transcription.ts\"\n    ],\n    \"test\": [\n      \"rna-transcription.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given a DNA strand, return its RNA complement.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Hyperphysics\",\n  \"source_url\": \"https://web.archive.org/web/20220408112140/http://hyperphysics.phy-astr.gsu.edu/hbase/Organic/transcription.html\"\n}\n"
  },
  {
    "path": "exercises/practice/rna-transcription/.meta/proof.ci.ts",
    "content": "export function toRna(input: string): string {\n  const dictionary: { [key: string]: string } = {\n    G: 'C',\n    C: 'G',\n    T: 'A',\n    A: 'U',\n  }\n  let temp = ''\n  input.split('').forEach((element) => {\n    const current = dictionary[element]\n    if (current === undefined) {\n      throw new Error('Invalid input DNA.')\n    }\n    temp += current\n  })\n  return temp\n}\n"
  },
  {
    "path": "exercises/practice/rna-transcription/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[b4631f82-c98c-4a2f-90b3-c5c2b6c6f661]\ndescription = \"Empty RNA sequence\"\n\n[a9558a3c-318c-4240-9256-5d5ed47005a6]\ndescription = \"RNA complement of cytosine is guanine\"\n\n[6eedbb5c-12cb-4c8b-9f51-f8320b4dc2e7]\ndescription = \"RNA complement of guanine is cytosine\"\n\n[870bd3ec-8487-471d-8d9a-a25046488d3e]\ndescription = \"RNA complement of thymine is adenine\"\n\n[aade8964-02e1-4073-872f-42d3ffd74c5f]\ndescription = \"RNA complement of adenine is uracil\"\n\n[79ed2757-f018-4f47-a1d7-34a559392dbf]\ndescription = \"RNA complement\"\n"
  },
  {
    "path": "exercises/practice/rna-transcription/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/rna-transcription/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/rna-transcription/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/rna-transcription/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/rna-transcription/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/rna-transcription/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/rna-transcription/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-rna-transcription\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/rna-transcription/rna-transcription.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { toRna } from './rna-transcription.ts'\n\ndescribe('Transcriptor', () => {\n  it('transcribes cytosine to guanine', () => {\n    expect(toRna('C')).toEqual('G')\n  })\n\n  xit('transcribes guanine to cytosine', () => {\n    expect(toRna('G')).toEqual('C')\n  })\n\n  xit('transcribes adenine to uracil', () => {\n    expect(toRna('A')).toEqual('U')\n  })\n\n  xit('transcribes thymine to adenine', () => {\n    expect(toRna('T')).toEqual('A')\n  })\n\n  xit('transcribes all dna nucleotides to their rna complements', () => {\n    expect(toRna('ACGTGGTCTTAA')).toEqual('UGCACCAGAAUU')\n  })\n\n  xit('correctly handles invalid input', () => {\n    expect(() => toRna('U')).toThrow('Invalid input DNA.')\n  })\n\n  xit('correctly handles completely invalid input', () => {\n    expect(() => toRna('XXX')).toThrow('Invalid input DNA.')\n  })\n\n  xit('correctly handles partially invalid input', () => {\n    expect(() => toRna('ACGTXXXCTTAA')).toThrow('Invalid input DNA.')\n  })\n})\n"
  },
  {
    "path": "exercises/practice/rna-transcription/rna-transcription.ts",
    "content": "export function toRna() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/rna-transcription/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/rna-transcription/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/robot-name/.docs/instructions.md",
    "content": "# Instructions\n\nManage robot factory settings.\n\nWhen a robot comes off the factory floor, it has no name.\n\nThe first time you turn on a robot, a random name is generated in the format of two uppercase letters followed by three digits, such as RX837 or BC811.\n\nEvery once in a while we need to reset a robot to its factory settings, which means that its name gets wiped.\nThe next time you ask, that robot will respond with a new random name.\n\nThe names must be random: they should not follow a predictable sequence.\nUsing random names means a risk of collisions.\nYour solution must ensure that every existing robot has a unique name.\n"
  },
  {
    "path": "exercises/practice/robot-name/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"masters3d\"\n  ],\n  \"contributors\": [\n    \"joshgoebel\",\n    \"lukaszklis\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"robot-name.ts\"\n    ],\n    \"test\": [\n      \"robot-name.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Manage robot factory settings.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": true,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"A debugging session with Paul Blackwell at gSchool.\"\n}\n"
  },
  {
    "path": "exercises/practice/robot-name/.meta/proof.ci.ts",
    "content": "/**\n * generates a random number from 0 to maximum-1\n *\n * random(5) => generates an integer 0 - 4\n *\n * @param maximum - max limit of generated number\n */\nconst rand = (maximum: number): number => Math.floor(Math.random() * maximum)\n\nclass NameDatabase {\n  private static ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'\n  private availableNames!: string[]\n\n  constructor() {\n    this.releaseNames()\n  }\n\n  public releaseNames(): void {\n    this.availableNames = this.allPossibleNames()\n  }\n\n  public allPossibleNames(): string[] {\n    const names = []\n    for (const a of NameDatabase.ALPHABET) {\n      for (const b of NameDatabase.ALPHABET) {\n        for (let i = 0; i < 1000; i++) {\n          names.push(`${a}${b}${i.toString().padStart(3, '0')}`)\n        }\n      }\n    }\n    return names\n  }\n\n  public fetchNewName(): string {\n    if (this.availableNames.length === 0) {\n      throw new Error('no more names')\n    }\n\n    const randomPosition = rand(this.availableNames.length)\n    const name = this.availableNames[randomPosition]\n    const lastName = this.availableNames.pop()!\n    // swap the last name into the position of the name\n    // we just removed (unless we happened to randomly\n    // pick the very last name already)\n    if (name !== lastName) this.availableNames[randomPosition] = lastName\n\n    return name\n  }\n}\n\nconst RobotsDB = new NameDatabase()\n\nexport class Robot {\n  private _name!: string\n\n  public get name(): string {\n    return this._name\n  }\n\n  constructor() {\n    this.resetName()\n  }\n\n  public resetName(): void {\n    this._name = RobotsDB.fetchNewName()\n  }\n\n  public static releaseNames(): void {\n    RobotsDB.releaseNames()\n  }\n}\n"
  },
  {
    "path": "exercises/practice/robot-name/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/robot-name/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/robot-name/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/robot-name/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/robot-name/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/robot-name/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/robot-name/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-robot-name\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/robot-name/robot-name.test.ts",
    "content": "import { beforeEach, afterEach, describe, it, expect, xit } from '@jest/globals'\nimport { Robot } from './robot-name.ts'\n\nconst areSequential = (name1: string, name2: string): boolean => {\n  const alpha1 = name1.substring(0, 2)\n  const alpha2 = name2.substring(0, 2)\n  const num1 = Number(name1.substring(2, 5))\n  const num2 = Number(name2.substring(2, 5))\n\n  const numDiff = num2 - num1\n  const alphaDiff =\n    (alpha2.charCodeAt(0) - alpha1.charCodeAt(0)) * 26 +\n    (alpha2.charCodeAt(1) - alpha1.charCodeAt(1))\n\n  const totalDiff = alphaDiff * 1000 + numDiff\n\n  return Math.abs(totalDiff) <= 1\n}\n\nconst NAME_RE = /^[A-Z]{2}\\d{3}$/\nconst TOTAL_NUMBER_OF_NAMES =\n  26 * // A-Z\n  26 * // A-Z\n  10 * // 0-9\n  10 * // 0-9\n  10 // 0-9\n\ndescribe('Robot', () => {\n  let robot: Robot\n\n  beforeEach(() => {\n    robot = new Robot()\n  })\n\n  afterEach(() => {\n    Robot.releaseNames()\n  })\n\n  it('has a name', () => {\n    expect(robot.name).toMatch(NAME_RE)\n  })\n\n  xit('name is the same each time', () => {\n    expect(robot.name).toEqual(robot.name)\n  })\n\n  xit('different robots have different names', () => {\n    const differentRobot = new Robot()\n    expect(differentRobot.name).not.toEqual(robot.name)\n  })\n\n  xit('is able to reset the name', () => {\n    const originalName = robot.name\n\n    robot.resetName()\n    const newName = robot.name\n\n    expect(newName).toMatch(NAME_RE)\n    expect(originalName).not.toEqual(newName)\n  })\n\n  xit('should set a unique name after reset', () => {\n    const NUMBER_OF_ROBOTS = 10000\n    const usedNames = new Set()\n\n    usedNames.add(robot.name)\n    for (let i = 0; i < NUMBER_OF_ROBOTS; i++) {\n      robot.resetName()\n      usedNames.add(robot.name)\n    }\n\n    expect(usedNames.size).toEqual(NUMBER_OF_ROBOTS + 1)\n  })\n\n  xit('new names should not be sequential', () => {\n    const name1 = robot.name\n    const name2 = new Robot().name\n    const name3 = new Robot().name\n    expect(areSequential(name1, name1)).toBe(true)\n    expect(areSequential(name1, name2)).toBe(false)\n    expect(areSequential(name2, name3)).toBe(false)\n  })\n\n  xit('names from reset should not be sequential', () => {\n    const name1 = robot.name\n    robot.resetName()\n    const name2 = robot.name\n    robot.resetName()\n    const name3 = robot.name\n    expect(areSequential(name1, name2)).toBe(false)\n    expect(areSequential(name2, name3)).toBe(false)\n    expect(areSequential(name3, name3)).toBe(true)\n  })\n\n  xit('uses all letters', () => {\n    let letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'\n\n    for (let i = 0; i < 1000 - 1; i += 1) {\n      const newRobot = new Robot()\n      const lettersInName = newRobot.name.slice(0, 2)\n      letters = letters.replace(lettersInName[0], '')\n      letters = letters.replace(lettersInName[1], '')\n\n      if (letters.length === 0) {\n        break\n      }\n    }\n    expect(letters).toEqual('')\n  })\n\n  xit('uses all numbers', () => {\n    let numbers = '0123456789'\n\n    for (let i = 0; i < 1000 - 1; i += 1) {\n      const newRobot = new Robot()\n      const digitsInName = newRobot.name.slice(2, 5)\n      numbers = numbers.replace(digitsInName[0], '')\n      numbers = numbers.replace(digitsInName[1], '')\n      numbers = numbers.replace(digitsInName[2], '')\n\n      if (numbers.length === 0) {\n        break\n      }\n    }\n    expect(numbers).toEqual('')\n  })\n\n  // This test is optional.\n  //\n  // This test doesn't run on our online test runner because it will time-out\n  // with most implementations. It's up to you to test your solution locally.\n  it.skip('all the names can be generated', () => {\n    const usedNames = new Set()\n    usedNames.add(robot.name)\n\n    for (let i = 0; i < TOTAL_NUMBER_OF_NAMES - 1; i += 1) {\n      const newRobot = new Robot()\n      usedNames.add(newRobot.name)\n    }\n\n    expect(usedNames.size).toEqual(TOTAL_NUMBER_OF_NAMES)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/robot-name/robot-name.ts",
    "content": "export class Robot {\n  constructor() {}\n\n  public get name(): string {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public resetName(): void {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public static releaseNames(): void {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/robot-name/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/robot-name/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/robot-simulator/.docs/instructions.md",
    "content": "# Instructions\n\nWrite a robot simulator.\n\nA robot factory's test facility needs a program to verify robot movements.\n\nThe robots have three possible movements:\n\n- turn right\n- turn left\n- advance\n\nRobots are placed on a hypothetical infinite grid, facing a particular direction (north, east, south, or west) at a set of {x,y} coordinates,\ne.g., {3,8}, with coordinates increasing to the north and east.\n\nThe robot then receives a number of instructions, at which point the testing facility verifies the robot's new position, and in which direction it is pointing.\n\n- The letter-string \"RAALAL\" means:\n  - Turn right\n  - Advance twice\n  - Turn left\n  - Advance once\n  - Turn left yet again\n- Say a robot starts at {7, 3} facing north.\n  Then running this stream of instructions should leave it at {9, 4} facing west.\n"
  },
  {
    "path": "exercises/practice/robot-simulator/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"deyshin\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"robot-simulator.ts\"\n    ],\n    \"test\": [\n      \"robot-simulator.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Write a robot simulator.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Inspired by an interview question at a famous company.\"\n}\n"
  },
  {
    "path": "exercises/practice/robot-simulator/.meta/proof.ci.ts",
    "content": "export class InvalidInputError extends Error {\n  constructor(message: string) {\n    super()\n    this.message = message || 'Invalid Input'\n  }\n}\n\ntype Bearing = 'north' | 'south' | 'east' | 'west'\ntype Instruction = 'turnLeft' | 'turnRight' | 'advance'\n\nconst validDirections: Bearing[] = ['north', 'south', 'east', 'west']\n\nfunction isValidBearing(next: string): next is Bearing {\n  return validDirections.includes(next as Bearing)\n}\nexport class Robot {\n  public coordinates: [number, number]\n  public bearing: Bearing\n\n  private static instructions(s: string): Instruction[] {\n    return [...s].map((character) => {\n      switch (character) {\n        case 'L':\n          return 'turnLeft'\n        case 'R':\n          return 'turnRight'\n        case 'A':\n          return 'advance'\n        default:\n          throw new InvalidInputError(\n            `${character} is not a valid instruction character.`\n          )\n      }\n    })\n  }\n\n  constructor() {\n    this.coordinates = [0, 0]\n    this.bearing = 'north'\n  }\n\n  private set direction(next: string) {\n    if (!isValidBearing(next)) {\n      throw new InvalidInputError('Invalid Robot Bearing')\n    }\n\n    this.bearing = next\n  }\n\n  private advance(): void {\n    if (this.bearing === 'north') {\n      this.coordinates[1] += 1\n    } else if (this.bearing === 'south') {\n      this.coordinates[1] -= 1\n    } else if (this.bearing === 'east') {\n      this.coordinates[0] += 1\n    } else if (this.bearing === 'west') {\n      this.coordinates[0] -= 1\n    }\n  }\n\n  private turnLeft(): void {\n    if (this.bearing === 'north') {\n      this.direction = 'west'\n    } else if (this.bearing === 'south') {\n      this.direction = 'east'\n    } else if (this.bearing === 'east') {\n      this.direction = 'north'\n    } else if (this.bearing === 'west') {\n      this.direction = 'south'\n    }\n  }\n\n  private turnRight(): void {\n    if (this.bearing === 'north') {\n      this.direction = 'east'\n    } else if (this.bearing === 'south') {\n      this.direction = 'west'\n    } else if (this.bearing === 'east') {\n      this.direction = 'south'\n    } else if (this.bearing === 'west') {\n      this.direction = 'north'\n    }\n  }\n\n  public place(args: { x: number; y: number; direction: string }): void {\n    this.coordinates = [args.x, args.y]\n    this.direction = args.direction\n  }\n\n  public evaluate(s: string): void {\n    Robot.instructions(s).forEach((instruction) => {\n      this[instruction]()\n    })\n  }\n}\n"
  },
  {
    "path": "exercises/practice/robot-simulator/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[c557c16d-26c1-4e06-827c-f6602cd0785c]\ndescription = \"at origin facing north\"\n\n[bf0dffce-f11c-4cdb-8a5e-2c89d8a5a67d]\ndescription = \"at negative position facing south\"\n\n[8cbd0086-6392-4680-b9b9-73cf491e67e5]\ndescription = \"changes north to east\"\n\n[8abc87fc-eab2-4276-93b7-9c009e866ba1]\ndescription = \"changes east to south\"\n\n[3cfe1b85-bbf2-4bae-b54d-d73e7e93617a]\ndescription = \"changes south to west\"\n\n[5ea9fb99-3f2c-47bd-86f7-46b7d8c3c716]\ndescription = \"changes west to north\"\n\n[fa0c40f5-6ba3-443d-a4b3-58cbd6cb8d63]\ndescription = \"changes north to west\"\n\n[da33d734-831f-445c-9907-d66d7d2a92e2]\ndescription = \"changes west to south\"\n\n[bd1ca4b9-4548-45f4-b32e-900fc7c19389]\ndescription = \"changes south to east\"\n\n[2de27b67-a25c-4b59-9883-bc03b1b55bba]\ndescription = \"changes east to north\"\n\n[f0dc2388-cddc-4f83-9bed-bcf46b8fc7b8]\ndescription = \"facing north increments Y\"\n\n[2786cf80-5bbf-44b0-9503-a89a9c5789da]\ndescription = \"facing south decrements Y\"\n\n[84bf3c8c-241f-434d-883d-69817dbd6a48]\ndescription = \"facing east increments X\"\n\n[bb69c4a7-3bbf-4f64-b415-666fa72d7b04]\ndescription = \"facing west decrements X\"\n\n[e34ac672-4ed4-4be3-a0b8-d9af259cbaa1]\ndescription = \"moving east and north from README\"\n\n[f30e4955-4b47-4aa3-8b39-ae98cfbd515b]\ndescription = \"moving west and north\"\n\n[3e466bf6-20ab-4d79-8b51-264165182fca]\ndescription = \"moving west and south\"\n\n[41f0bb96-c617-4e6b-acff-a4b279d44514]\ndescription = \"moving east and north\"\n"
  },
  {
    "path": "exercises/practice/robot-simulator/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/robot-simulator/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/robot-simulator/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/robot-simulator/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/robot-simulator/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/robot-simulator/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/robot-simulator/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-robot-simulator\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/robot-simulator/robot-simulator.test.ts",
    "content": "import { describe, xdescribe, it, expect, xit } from '@jest/globals'\nimport { Robot, InvalidInputError } from './robot-simulator.ts'\n\nfunction turnRight(robot: Robot): void {\n  robot.evaluate('R')\n}\n\nfunction turnLeft(robot: Robot): void {\n  robot.evaluate('L')\n}\n\nfunction advance(robot: Robot): void {\n  robot.evaluate('A')\n}\n\ndescribe('Robot', () => {\n  describe('Create robot', () => {\n    it('facing north by default', () => {\n      const robot = new Robot()\n      expect(robot.bearing).toEqual('north')\n    })\n\n    it('facing east', () => {\n      const robot = new Robot()\n      robot.place({ direction: 'east', x: 0, y: 0 })\n\n      expect(robot.bearing).toEqual('east')\n    })\n\n    it('facing west, at origin', () => {\n      const robot = new Robot()\n      robot.place({ direction: 'west', x: 0, y: 0 })\n\n      expect(robot.bearing).toEqual('west')\n      expect(robot.coordinates).toEqual([0, 0])\n    })\n\n    it('at negative position facing south', () => {\n      const robot = new Robot()\n      robot.place({ direction: 'south', x: -1, y: -1 })\n\n      expect(robot.bearing).toEqual('south')\n      expect(robot.coordinates).toEqual([-1, -1])\n    })\n\n    xit('invalid robot bearing', () => {\n      const robot = new Robot()\n\n      expect(InvalidInputError.prototype).toBeInstanceOf(Error)\n      expect(() => robot.place({ direction: 'crood', x: 0, y: 0 })).toThrow(\n        InvalidInputError\n      )\n    })\n  })\n\n  xdescribe('Rotating clockwise', () => {\n    const robot = new Robot()\n\n    xit('changes north to east', () => {\n      robot.place({ direction: 'north', x: 0, y: 0 })\n\n      turnRight(robot)\n\n      expect(robot.bearing).toEqual('east')\n      expect(robot.coordinates).toEqual([0, 0])\n    })\n\n    xit('changes east to south', () => {\n      robot.place({ direction: 'east', x: 0, y: 0 })\n\n      turnRight(robot)\n\n      expect(robot.bearing).toEqual('south')\n      expect(robot.coordinates).toEqual([0, 0])\n    })\n\n    xit('changes south to west', () => {\n      robot.place({ direction: 'south', x: 0, y: 0 })\n\n      turnRight(robot)\n\n      expect(robot.bearing).toEqual('west')\n      expect(robot.coordinates).toEqual([0, 0])\n    })\n\n    xit('changes west to north', () => {\n      robot.place({ direction: 'west', x: 0, y: 0 })\n\n      turnRight(robot)\n\n      expect(robot.bearing).toEqual('north')\n      expect(robot.coordinates).toEqual([0, 0])\n    })\n  })\n\n  xdescribe('Rotating counter-clockwise', () => {\n    const robot = new Robot()\n\n    xit('changes north to west', () => {\n      robot.place({ direction: 'north', x: 0, y: 0 })\n\n      turnLeft(robot)\n\n      expect(robot.bearing).toEqual('west')\n      expect(robot.coordinates).toEqual([0, 0])\n    })\n\n    xit('changes west to south', () => {\n      robot.place({ direction: 'west', x: 0, y: 0 })\n\n      turnLeft(robot)\n\n      expect(robot.bearing).toEqual('south')\n      expect(robot.coordinates).toEqual([0, 0])\n    })\n\n    xit('changes south to east', () => {\n      robot.place({ direction: 'south', x: 0, y: 0 })\n\n      turnLeft(robot)\n\n      expect(robot.bearing).toEqual('east')\n      expect(robot.coordinates).toEqual([0, 0])\n    })\n\n    xit('changes east to north', () => {\n      robot.place({ direction: 'east', x: 0, y: 0 })\n\n      turnLeft(robot)\n\n      expect(robot.bearing).toEqual('north')\n      expect(robot.coordinates).toEqual([0, 0])\n    })\n  })\n\n  xdescribe('Moving forward one', () => {\n    const robot = new Robot()\n\n    xit('advance when facing north', () => {\n      robot.place({ direction: 'north', x: 0, y: 0 })\n\n      advance(robot)\n\n      expect(robot.coordinates).toEqual([0, 1])\n      expect(robot.bearing).toEqual('north')\n    })\n\n    xit('advance when facing south', () => {\n      robot.place({ direction: 'south', x: 0, y: 0 })\n\n      advance(robot)\n\n      expect(robot.coordinates).toEqual([0, -1])\n      expect(robot.bearing).toEqual('south')\n    })\n\n    xit('advance when facing east', () => {\n      robot.place({ direction: 'east', x: 0, y: 0 })\n\n      advance(robot)\n\n      expect(robot.coordinates).toEqual([1, 0])\n      expect(robot.bearing).toEqual('east')\n    })\n\n    xit('advance when facing west', () => {\n      robot.place({ direction: 'west', x: 0, y: 0 })\n\n      advance(robot)\n\n      expect(robot.coordinates).toEqual([-1, 0])\n      expect(robot.bearing).toEqual('west')\n    })\n  })\n\n  xdescribe('Follow series of instructions', () => {\n    const robot = new Robot()\n\n    xit('moving east and north from README', () => {\n      robot.place({ x: 7, y: 3, direction: 'north' })\n\n      robot.evaluate('RAALAL')\n\n      expect(robot.coordinates).toEqual([9, 4])\n      expect(robot.bearing).toEqual('west')\n    })\n\n    xit('moving west and north', () => {\n      robot.place({ x: 0, y: 0, direction: 'north' })\n\n      robot.evaluate('LAAARALA')\n\n      expect(robot.coordinates).toEqual([-4, 1])\n      expect(robot.bearing).toEqual('west')\n    })\n\n    xit('moving west and south', () => {\n      robot.place({ x: 2, y: -7, direction: 'east' })\n\n      robot.evaluate('RRAAAAALA')\n\n      expect(robot.coordinates).toEqual([-3, -8])\n      expect(robot.bearing).toEqual('south')\n    })\n\n    xit('moving east and north', () => {\n      robot.place({ x: 8, y: 4, direction: 'south' })\n\n      robot.evaluate('LAAARRRALLLL')\n\n      expect(robot.coordinates).toEqual([11, 5])\n      expect(robot.bearing).toEqual('north')\n    })\n\n    xit('instruct many robots', () => {\n      const robot1 = new Robot()\n      const robot2 = new Robot()\n      const robot3 = new Robot()\n      robot1.place({ x: 0, y: 0, direction: 'north' })\n      robot2.place({ x: 2, y: -7, direction: 'east' })\n      robot3.place({ x: 8, y: 4, direction: 'south' })\n\n      robot1.evaluate('LAAARALA')\n      robot2.evaluate('RRAAAAALA')\n      robot3.evaluate('LAAARRRALLLL')\n\n      expect(robot1.coordinates).toEqual([-4, 1])\n      expect(robot1.bearing).toEqual('west')\n\n      expect(robot2.coordinates).toEqual([-3, -8])\n      expect(robot2.bearing).toEqual('south')\n\n      expect(robot3.coordinates).toEqual([11, 5])\n      expect(robot3.bearing).toEqual('north')\n    })\n  })\n})\n"
  },
  {
    "path": "exercises/practice/robot-simulator/robot-simulator.ts",
    "content": "export class InvalidInputError extends Error {\n  constructor(message: string) {\n    super()\n    this.message = message || 'Invalid Input'\n  }\n}\n\ntype Direction = 'north' | 'east' | 'south' | 'west'\ntype Coordinates = [number, number]\n\nexport class Robot {\n  get bearing(): Direction {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  get coordinates(): Coordinates {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  place({}: { x: number; y: number; direction: string }) {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  evaluate(instructions: string) {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/robot-simulator/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/robot-simulator/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/roman-numerals/.docs/instructions.md",
    "content": "# Introduction\n\nYour task is to convert a number from Arabic numerals to Roman numerals.\n\nFor this exercise, we are only concerned about traditional Roman numerals, in which the largest number is MMMCMXCIX (or 3,999).\n\n~~~~exercism/note\nThere are lots of different ways to convert between Arabic and Roman numerals.\nWe recommend taking a naive approach first to familiarise yourself with the concept of Roman numerals and then search for more efficient methods.\n\nMake sure to check out our Deep Dive video at the end to explore the different approaches you can take!\n~~~~\n"
  },
  {
    "path": "exercises/practice/roman-numerals/.docs/introduction.md",
    "content": "# Description\n\nToday, most people in the world use Arabic numerals (0–9).\nBut if you travelled back two thousand years, you'd find that most Europeans were using Roman numerals instead.\n\nTo write a Roman numeral we use the following Latin letters, each of which has a value:\n\n| M    | D   | C   | L   | X   | V   | I   |\n| ---- | --- | --- | --- | --- | --- | --- |\n| 1000 | 500 | 100 | 50  | 10  | 5   | 1   |\n\nA Roman numeral is a sequence of these letters, and its value is the sum of the letters' values.\nFor example, `XVIII` has the value 18 (`10 + 5 + 1 + 1 + 1 = 18`).\n\nThere's one rule that makes things trickier though, and that's that **the same letter cannot be used more than three times in succession**.\nThat means that we can't express numbers such as 4 with the seemingly natural `IIII`.\nInstead, for those numbers, we use a subtraction method between two letters.\nSo we think of `4` not as `1 + 1 + 1 + 1` but instead as `5 - 1`.\nAnd slightly confusingly to our modern thinking, we write the smaller number first.\nThis applies only in the following cases: 4 (`IV`), 9 (`IX`), 40 (`XL`), 90 (`XC`), 400 (`CD`) and 900 (`CM`).\n\nOrder matters in Roman numerals!\nLetters (and the special compounds above) must be ordered by decreasing value from left to right.\n\nHere are some examples:\n\n```text\n 105 => CV\n---- => --\n 100 => C\n+  5 =>  V\n```\n\n```text\n 106 => CVI\n---- => --\n 100 => C\n+  5 =>  V\n+  1 =>   I\n```\n\n```text\n 104 => CIV\n---- => ---\n 100 => C\n+  4 =>  IV\n```\n\nAnd a final more complex example:\n\n```text\n 1996 => MCMXCVI\n----- => -------\n 1000 => M\n+ 900 =>  CM\n+  90 =>    XC\n+   5 =>      V\n+   1 =>       I\n```\n"
  },
  {
    "path": "exercises/practice/roman-numerals/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"roman-numerals.ts\"\n    ],\n    \"test\": [\n      \"roman-numerals.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Convert modern Arabic numbers into Roman numerals.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"The Roman Numeral Kata\",\n  \"source_url\": \"https://codingdojo.org/kata/RomanNumerals/\"\n}\n"
  },
  {
    "path": "exercises/practice/roman-numerals/.meta/proof.ci.ts",
    "content": "export function toRoman(number: number): string {\n  let result = ''\n  let remainingNumber = number\n\n  const mappings = [\n    { arabic: 1000, roman: 'M' },\n    { arabic: 900, roman: 'CM' },\n    { arabic: 500, roman: 'D' },\n    { arabic: 400, roman: 'CD' },\n    { arabic: 100, roman: 'C' },\n    { arabic: 90, roman: 'XC' },\n    { arabic: 50, roman: 'L' },\n    { arabic: 40, roman: 'XL' },\n    { arabic: 10, roman: 'X' },\n    { arabic: 9, roman: 'IX' },\n    { arabic: 5, roman: 'V' },\n    { arabic: 4, roman: 'IV' },\n    { arabic: 1, roman: 'I' },\n  ]\n\n  mappings.forEach((mapping) => {\n    while (remainingNumber >= mapping.arabic) {\n      result += mapping.roman\n      remainingNumber -= mapping.arabic\n    }\n  })\n\n  return result\n}\n"
  },
  {
    "path": "exercises/practice/roman-numerals/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[19828a3a-fbf7-4661-8ddd-cbaeee0e2178]\ndescription = \"1 is I\"\n\n[f088f064-2d35-4476-9a41-f576da3f7b03]\ndescription = \"2 is II\"\n\n[b374a79c-3bea-43e6-8db8-1286f79c7106]\ndescription = \"3 is III\"\n\n[05a0a1d4-a140-4db1-82e8-fcc21fdb49bb]\ndescription = \"4 is IV\"\n\n[57c0f9ad-5024-46ab-975d-de18c430b290]\ndescription = \"5 is V\"\n\n[20a2b47f-e57f-4797-a541-0b3825d7f249]\ndescription = \"6 is VI\"\n\n[ff3fb08c-4917-4aab-9f4e-d663491d083d]\ndescription = \"9 is IX\"\n\n[6d1d82d5-bf3e-48af-9139-87d7165ed509]\ndescription = \"16 is XVI\"\n\n[2bda64ca-7d28-4c56-b08d-16ce65716cf6]\ndescription = \"27 is XXVII\"\n\n[a1f812ef-84da-4e02-b4f0-89c907d0962c]\ndescription = \"48 is XLVIII\"\n\n[607ead62-23d6-4c11-a396-ef821e2e5f75]\ndescription = \"49 is XLIX\"\n\n[d5b283d4-455d-4e68-aacf-add6c4b51915]\ndescription = \"59 is LIX\"\n\n[4465ffd5-34dc-44f3-ada5-56f5007b6dad]\ndescription = \"66 is LXVI\"\n\n[46b46e5b-24da-4180-bfe2-2ef30b39d0d0]\ndescription = \"93 is XCIII\"\n\n[30494be1-9afb-4f84-9d71-db9df18b55e3]\ndescription = \"141 is CXLI\"\n\n[267f0207-3c55-459a-b81d-67cec7a46ed9]\ndescription = \"163 is CLXIII\"\n\n[902ad132-0b4d-40e3-8597-ba5ed611dd8d]\ndescription = \"166 is CLXVI\"\n\n[cdb06885-4485-4d71-8bfb-c9d0f496b404]\ndescription = \"402 is CDII\"\n\n[6b71841d-13b2-46b4-ba97-dec28133ea80]\ndescription = \"575 is DLXXV\"\n\n[dacb84b9-ea1c-4a61-acbb-ce6b36674906]\ndescription = \"666 is DCLXVI\"\n\n[432de891-7fd6-4748-a7f6-156082eeca2f]\ndescription = \"911 is CMXI\"\n\n[e6de6d24-f668-41c0-88d7-889c0254d173]\ndescription = \"1024 is MXXIV\"\n\n[efbe1d6a-9f98-4eb5-82bc-72753e3ac328]\ndescription = \"1666 is MDCLXVI\"\n\n[bb550038-d4eb-4be2-a9ce-f21961ac3bc6]\ndescription = \"3000 is MMM\"\n\n[3bc4b41c-c2e6-49d9-9142-420691504336]\ndescription = \"3001 is MMMI\"\n\n[2f89cad7-73f6-4d1b-857b-0ef531f68b7e]\ndescription = \"3888 is MMMDCCCLXXXVIII\"\n\n[4e18e96b-5fbb-43df-a91b-9cb511fe0856]\ndescription = \"3999 is MMMCMXCIX\"\n"
  },
  {
    "path": "exercises/practice/roman-numerals/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/roman-numerals/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/roman-numerals/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/roman-numerals/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/roman-numerals/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/roman-numerals/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/roman-numerals/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-roman-numerals\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/roman-numerals/roman-numerals.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { toRoman } from './roman-numerals.ts'\n\ndescribe('toRoman()', () => {\n  it('converts 1', () => expect(toRoman(1)).toEqual('I'))\n  xit('converts 2', () => expect(toRoman(2)).toEqual('II'))\n  xit('converts 3', () => expect(toRoman(3)).toEqual('III'))\n  xit('converts 4', () => expect(toRoman(4)).toEqual('IV'))\n  xit('converts 5', () => expect(toRoman(5)).toEqual('V'))\n  xit('converts 6', () => expect(toRoman(6)).toEqual('VI'))\n  xit('converts 9', () => expect(toRoman(9)).toEqual('IX'))\n  xit('converts 16', () => expect(toRoman(16)).toEqual('XVI'))\n  xit('converts 27', () => expect(toRoman(27)).toEqual('XXVII'))\n  xit('converts 48', () => expect(toRoman(48)).toEqual('XLVIII'))\n  xit('converts 49', () => expect(toRoman(49)).toEqual('XLIX'))\n  xit('converts 59', () => expect(toRoman(59)).toEqual('LIX'))\n  xit('converts 66', () => expect(toRoman(66)).toEqual('LXVI'))\n  xit('converts 93', () => expect(toRoman(93)).toEqual('XCIII'))\n  xit('converts 141', () => expect(toRoman(141)).toEqual('CXLI'))\n  xit('converts 163', () => expect(toRoman(163)).toEqual('CLXIII'))\n  xit('converts 166', () => expect(toRoman(166)).toEqual('CLXVI'))\n  xit('converts 402', () => expect(toRoman(402)).toEqual('CDII'))\n  xit('converts 575', () => expect(toRoman(575)).toEqual('DLXXV'))\n  xit('converts 666', () => expect(toRoman(666)).toEqual('DCLXVI'))\n  xit('converts 911', () => expect(toRoman(911)).toEqual('CMXI'))\n  xit('converts 1024', () => expect(toRoman(1024)).toEqual('MXXIV'))\n  xit('converts 1666', () => expect(toRoman(1666)).toEqual('MDCLXVI'))\n  xit('converts 3000', () => expect(toRoman(3000)).toEqual('MMM'))\n  xit('converts 3001', () => expect(toRoman(3001)).toEqual('MMMI'))\n  xit('converts 3888', () => expect(toRoman(3888)).toEqual('MMMDCCCLXXXVIII'))\n  xit('converts 3999', () => expect(toRoman(3999)).toEqual('MMMCMXCIX'))\n})\n"
  },
  {
    "path": "exercises/practice/roman-numerals/roman-numerals.ts",
    "content": "export const toRoman = () => {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/roman-numerals/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/roman-numerals/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/rotational-cipher/.docs/instructions.md",
    "content": "# Instructions\n\nCreate an implementation of the rotational cipher, also sometimes called the Caesar cipher.\n\nThe Caesar cipher is a simple shift cipher that relies on transposing all the letters in the alphabet using an integer key between `0` and `26`.\nUsing a key of `0` or `26` will always yield the same output due to modular arithmetic.\nThe letter is shifted for as many values as the value of the key.\n\nThe general notation for rotational ciphers is `ROT + <key>`.\nThe most commonly used rotational cipher is `ROT13`.\n\nA `ROT13` on the Latin alphabet would be as follows:\n\n```text\nPlain:  abcdefghijklmnopqrstuvwxyz\nCipher: nopqrstuvwxyzabcdefghijklm\n```\n\nIt is stronger than the Atbash cipher because it has 27 possible keys, and 25 usable keys.\n\nCiphertext is written out in the same formatting as the input including spaces and punctuation.\n\n## Examples\n\n- ROT5 `omg` gives `trl`\n- ROT0 `c` gives `c`\n- ROT26 `Cool` gives `Cool`\n- ROT13 `The quick brown fox jumps over the lazy dog.` gives `Gur dhvpx oebja sbk whzcf bire gur ynml qbt.`\n- ROT13 `Gur dhvpx oebja sbk whzcf bire gur ynml qbt.` gives `The quick brown fox jumps over the lazy dog.`\n"
  },
  {
    "path": "exercises/practice/rotational-cipher/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"anuragsoni\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"rotational-cipher.ts\"\n    ],\n    \"test\": [\n      \"rotational-cipher.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Create an implementation of the rotational cipher, also sometimes called the Caesar cipher.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Wikipedia\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/Caesar_cipher\"\n}\n"
  },
  {
    "path": "exercises/practice/rotational-cipher/.meta/proof.ci.ts",
    "content": "export function rotate(text: string, shiftBy: number): string {\n  return [...text]\n    .map((c) => {\n      const isUpper = c.toUpperCase() === c\n      const isAlpha = c.match(/[a-z]/i)\n      const caseCharCode = (isUpper ? 'A' : 'a').charCodeAt(0)\n      if (isAlpha) {\n        const charCode = c.charCodeAt(0)\n        return String.fromCharCode(\n          ((charCode - caseCharCode + shiftBy) % 26) + caseCharCode\n        )\n      } else {\n        return c\n      }\n    })\n    .join('')\n}\n"
  },
  {
    "path": "exercises/practice/rotational-cipher/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[74e58a38-e484-43f1-9466-877a7515e10f]\ndescription = \"rotate a by 0, same output as input\"\n\n[7ee352c6-e6b0-4930-b903-d09943ecb8f5]\ndescription = \"rotate a by 1\"\n\n[edf0a733-4231-4594-a5ee-46a4009ad764]\ndescription = \"rotate a by 26, same output as input\"\n\n[e3e82cb9-2a5b-403f-9931-e43213879300]\ndescription = \"rotate m by 13\"\n\n[19f9eb78-e2ad-4da4-8fe3-9291d47c1709]\ndescription = \"rotate n by 13 with wrap around alphabet\"\n\n[a116aef4-225b-4da9-884f-e8023ca6408a]\ndescription = \"rotate capital letters\"\n\n[71b541bb-819c-4dc6-a9c3-132ef9bb737b]\ndescription = \"rotate spaces\"\n\n[ef32601d-e9ef-4b29-b2b5-8971392282e6]\ndescription = \"rotate numbers\"\n\n[32dd74f6-db2b-41a6-b02c-82eb4f93e549]\ndescription = \"rotate punctuation\"\n\n[9fb93fe6-42b0-46e6-9ec1-0bf0a062d8c9]\ndescription = \"rotate all letters\"\n"
  },
  {
    "path": "exercises/practice/rotational-cipher/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/rotational-cipher/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/rotational-cipher/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/rotational-cipher/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/rotational-cipher/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/rotational-cipher/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/rotational-cipher/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-rotational-cipher\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/rotational-cipher/rotational-cipher.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { rotate } from './rotational-cipher.ts'\n\ndescribe('RotationalCipher', () => {\n  it('rotate a by 1', () => {\n    const result = rotate('a', 1)\n    expect(result).toEqual('b')\n  })\n\n  xit('rotate a by 26, same output as input', () => {\n    const result = rotate('a', 26)\n    expect(result).toEqual('a')\n  })\n\n  xit('rotate a by 0, same output as input', () => {\n    const result = rotate('a', 0)\n    expect(result).toEqual('a')\n  })\n\n  xit('rotate m by 13', () => {\n    const result = rotate('m', 13)\n    expect(result).toEqual('z')\n  })\n\n  xit('rotate n by 13 with wrap around alphabet', () => {\n    const result = rotate('n', 13)\n    expect(result).toEqual('a')\n  })\n\n  xit('rotate capital letters', () => {\n    const result = rotate('OMG', 5)\n    expect(result).toEqual('TRL')\n  })\n\n  xit('rotate spaces', () => {\n    const result = rotate('O M G', 5)\n    expect(result).toEqual('T R L')\n  })\n\n  xit('rotate numbers', () => {\n    const result = rotate('Testing 1 2 3 testing', 4)\n    expect(result).toEqual('Xiwxmrk 1 2 3 xiwxmrk')\n  })\n\n  xit('rotate punctuation', () => {\n    const result = rotate(\"Let's eat, Grandma!\", 21)\n    expect(result).toEqual(\"Gzo'n zvo, Bmviyhv!\")\n  })\n\n  xit('rotate all letters', () => {\n    const result = rotate('The quick brown fox jumps over the lazy dog.', 13)\n    expect(result).toEqual('Gur dhvpx oebja sbk whzcf bire gur ynml qbt.')\n  })\n})\n"
  },
  {
    "path": "exercises/practice/rotational-cipher/rotational-cipher.ts",
    "content": "export function rotate() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/rotational-cipher/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/rotational-cipher/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/run-length-encoding/.docs/instructions.md",
    "content": "# Instructions\n\nImplement run-length encoding and decoding.\n\nRun-length encoding (RLE) is a simple form of data compression, where runs (consecutive data elements) are replaced by just one data value and count.\n\nFor example we can represent the original 53 characters with only 13.\n\n```text\n\"WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB\"  ->  \"12WB12W3B24WB\"\n```\n\nRLE allows the original data to be perfectly reconstructed from the compressed data, which makes it a lossless data compression.\n\n```text\n\"AABCCCDEEEE\"  ->  \"2AB3CD4E\"  ->  \"AABCCCDEEEE\"\n```\n\nFor simplicity, you can assume that the unencoded string will only contain the letters A through Z (either lower or upper case) and whitespace.\nThis way data to be encoded will never contain any numbers and numbers inside data to be decoded always represent the count for the following character.\n"
  },
  {
    "path": "exercises/practice/run-length-encoding/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"run-length-encoding.ts\"\n    ],\n    \"test\": [\n      \"run-length-encoding.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Implement run-length encoding and decoding.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Wikipedia\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/Run-length_encoding\"\n}\n"
  },
  {
    "path": "exercises/practice/run-length-encoding/.meta/proof.ci.ts",
    "content": "export function encode(plaintext: string): string {\n  return plaintext.replace(/([\\w\\s])\\1*/g, (match) => {\n    return match.length > 1 ? match.length + match[0] : match[0]\n  })\n}\n\nexport function decode(cypher: string): string {\n  return cypher.replace(/(\\d+)(\\w|\\s)/g, (_match, repeats, char) => {\n    return new Array(Number(repeats) + 1).join(char as string)\n  })\n}\n"
  },
  {
    "path": "exercises/practice/run-length-encoding/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[ad53b61b-6ffc-422f-81a6-61f7df92a231]\ndescription = \"empty string\"\n\n[52012823-b7e6-4277-893c-5b96d42f82de]\ndescription = \"single characters only are encoded without count\"\n\n[b7868492-7e3a-415f-8da3-d88f51f80409]\ndescription = \"string with no single characters\"\n\n[859b822b-6e9f-44d6-9c46-6091ee6ae358]\ndescription = \"single characters mixed with repeated characters\"\n\n[1b34de62-e152-47be-bc88-469746df63b3]\ndescription = \"multiple whitespace mixed in string\"\n\n[abf176e2-3fbd-40ad-bb2f-2dd6d4df721a]\ndescription = \"lowercase characters\"\n\n[7ec5c390-f03c-4acf-ac29-5f65861cdeb5]\ndescription = \"empty string\"\n\n[ad23f455-1ac2-4b0e-87d0-b85b10696098]\ndescription = \"single characters only\"\n\n[21e37583-5a20-4a0e-826c-3dee2c375f54]\ndescription = \"string with no single characters\"\n\n[1389ad09-c3a8-4813-9324-99363fba429c]\ndescription = \"single characters with repeated characters\"\n\n[3f8e3c51-6aca-4670-b86c-a213bf4706b0]\ndescription = \"multiple whitespace mixed in string\"\n\n[29f721de-9aad-435f-ba37-7662df4fb551]\ndescription = \"lower case string\"\n\n[2a762efd-8695-4e04-b0d6-9736899fbc16]\ndescription = \"encode followed by decode gives original string\"\n"
  },
  {
    "path": "exercises/practice/run-length-encoding/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/run-length-encoding/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/run-length-encoding/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/run-length-encoding/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/run-length-encoding/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/run-length-encoding/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/run-length-encoding/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-run-length-encoding\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/run-length-encoding/run-length-encoding.test.ts",
    "content": "import { describe, xdescribe, it, expect, xit } from '@jest/globals'\nimport { encode, decode } from './run-length-encoding.ts'\n\ndescribe('run-length encode a string', () => {\n  it('empty string', () => {\n    const expected = ''\n    expect(encode('')).toEqual(expected)\n  })\n\n  xit('single characters only are encoded without count', () => {\n    const expected = 'XYZ'\n    expect(encode('XYZ')).toEqual(expected)\n  })\n\n  xit('string with no single characters', () => {\n    const expected = '2A3B4C'\n    expect(encode('AABBBCCCC')).toEqual(expected)\n  })\n\n  xit('single characters mixed with repeated characters', () => {\n    const expected = '12WB12W3B24WB'\n    expect(\n      encode('WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB')\n    ).toEqual(expected)\n  })\n\n  xit('multiple whitespace mixed in string', () => {\n    const expected = '2 hs2q q2w2 '\n    expect(encode('  hsqq qww  ')).toEqual(expected)\n  })\n\n  xit('lowercase characters', () => {\n    const expected = '2a3b4c'\n    expect(encode('aabbbcccc')).toEqual(expected)\n  })\n})\n\nxdescribe('run-length decode a string', () => {\n  xit('empty string', () => {\n    const expected = ''\n    expect(decode('')).toEqual(expected)\n  })\n\n  xit('single characters only', () => {\n    const expected = 'XYZ'\n    expect(decode('XYZ')).toEqual(expected)\n  })\n\n  xit('string with no single characters', () => {\n    const expected = 'AABBBCCCC'\n    expect(decode('2A3B4C')).toEqual(expected)\n  })\n\n  xit('single characters with repeated characters', () => {\n    const expected = 'WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB'\n    expect(decode('12WB12W3B24WB')).toEqual(expected)\n  })\n\n  xit('multiple whitespace mixed in string', () => {\n    const expected = '  hsqq qww  '\n    expect(decode('2 hs2q q2w2 ')).toEqual(expected)\n  })\n\n  xit('lower case string', () => {\n    const expected = 'aabbbcccc'\n    expect(decode('2a3b4c')).toEqual(expected)\n  })\n})\n\nxdescribe('encode and then decode', () => {\n  xit('encode followed by decode gives original string', () => {\n    expect(decode(encode('zzz ZZ  zZ'))).toEqual('zzz ZZ  zZ')\n  })\n})\n"
  },
  {
    "path": "exercises/practice/run-length-encoding/run-length-encoding.ts",
    "content": "export function encode() {\n  throw new Error('Remove this line and implement the function')\n}\n\nexport function decode() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/run-length-encoding/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/run-length-encoding/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/saddle-points/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to find the potential trees where you could build your tree house.\n\nThe data company provides the data as grids that show the heights of the trees.\nThe rows of the grid represent the east-west direction, and the columns represent the north-south direction.\n\nAn acceptable tree will be the largest in its row, while being the smallest in its column.\n\nA grid might not have any good trees at all.\nOr it might have one, or even several.\n\nHere is a grid that has exactly one candidate tree.\n\n```text\n      ↓\n      1  2  3  4\n    |-----------\n  1 | 9  8  7  8\n→ 2 |[5] 3  2  4\n  3 | 6  6  7  1\n```\n\n- Row 2 has values 5, 3, 2, and 4. The largest value is 5.\n- Column 1 has values 9, 5, and 6. The smallest value is 5.\n\nSo the point at `[2, 1]` (row: 2, column: 1) is a great spot for a tree house.\n"
  },
  {
    "path": "exercises/practice/saddle-points/.docs/introduction.md",
    "content": "# Introduction\n\nYou plan to build a tree house in the woods near your house so that you can watch the sun rise and set.\n\nYou've obtained data from a local survey company that show the height of every tree in each rectangular section of the map.\nYou need to analyze each grid on the map to find good trees for your tree house.\n\nA good tree is both:\n\n- taller than every tree to the east and west, so that you have the best possible view of the sunrises and sunsets.\n- shorter than every tree to the north and south, to minimize the amount of tree climbing.\n"
  },
  {
    "path": "exercises/practice/saddle-points/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"saddle-points.ts\"\n    ],\n    \"test\": [\n      \"saddle-points.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Detect saddle points in a matrix.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"J Dalbey's Programming Practice problems\",\n  \"source_url\": \"https://users.csc.calpoly.edu/~jdalbey/103/Projects/ProgrammingPractice.html\"\n}\n"
  },
  {
    "path": "exercises/practice/saddle-points/.meta/proof.ci.ts",
    "content": "export function saddlePoints(\n  matrix: number[][]\n): Array<{ row: number; column: number }> {\n  const maximumRowValues: number[] = []\n  const minimumColumnValues: number[] = []\n\n  for (let i = 0; i <= matrix.length - 1; i++) {\n    let maximumRowValue = Number.MIN_VALUE\n    for (let j = 0; j < matrix[0].length; j++) {\n      maximumRowValue = Math.max(maximumRowValue, matrix[i][j])\n    }\n    maximumRowValues.push(maximumRowValue)\n  }\n\n  for (let i = 0; i <= matrix[0].length - 1; i++) {\n    let minimumColumnValue = Number.MAX_VALUE\n    for (let j = 0; j <= matrix.length - 1; j++) {\n      minimumColumnValue = Math.min(minimumColumnValue, matrix[j][i])\n    }\n    minimumColumnValues.push(minimumColumnValue)\n  }\n\n  const resultPoints: Array<{ row: number; column: number }> = []\n  for (let i = 0; i < maximumRowValues.length; i++) {\n    for (let j = 0; j < minimumColumnValues.length; j++) {\n      if (maximumRowValues[i] === minimumColumnValues[j]) {\n        resultPoints.push({ row: i + 1, column: j + 1 })\n      }\n    }\n  }\n\n  return resultPoints\n}\n"
  },
  {
    "path": "exercises/practice/saddle-points/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[3e374e63-a2e0-4530-a39a-d53c560382bd]\ndescription = \"Can identify single saddle point\"\n\n[6b501e2b-6c1f-491f-b1bb-7f278f760534]\ndescription = \"Can identify that empty matrix has no saddle points\"\n\n[8c27cc64-e573-4fcb-a099-f0ae863fb02f]\ndescription = \"Can identify lack of saddle points when there are none\"\n\n[6d1399bd-e105-40fd-a2c9-c6609507d7a3]\ndescription = \"Can identify multiple saddle points in a column\"\n\n[3e81dce9-53b3-44e6-bf26-e328885fd5d1]\ndescription = \"Can identify multiple saddle points in a row\"\n\n[88868621-b6f4-4837-bb8b-3fad8b25d46b]\ndescription = \"Can identify saddle point in bottom right corner\"\n\n[5b9499ca-fcea-4195-830a-9c4584a0ee79]\ndescription = \"Can identify saddle points in a non square matrix\"\n\n[ee99ccd2-a1f1-4283-ad39-f8c70f0cf594]\ndescription = \"Can identify that saddle points in a single column matrix are those with the minimum value\"\n\n[63abf709-a84b-407f-a1b3-456638689713]\ndescription = \"Can identify that saddle points in a single row matrix are those with the maximum value\"\n"
  },
  {
    "path": "exercises/practice/saddle-points/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/saddle-points/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/saddle-points/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/saddle-points/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/saddle-points/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/saddle-points/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/saddle-points/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-saddle-points\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/saddle-points/saddle-points.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { saddlePoints } from './saddle-points.ts'\n\ndescribe('Saddle Points', () => {\n  it('Can identify single saddle point', () => {\n    const expected = [{ row: 2, column: 1 }]\n    expect(\n      saddlePoints([\n        [9, 8, 7],\n        [5, 3, 2],\n        [6, 6, 7],\n      ])\n    ).toEqual(expected)\n  })\n\n  xit('Can identify that empty matrix has no saddle points', () => {\n    const expected: number[] = []\n    expect(saddlePoints([[]])).toEqual(expected)\n  })\n\n  xit('Can identify lack of saddle points when there are none', () => {\n    const expected: number[] = []\n    expect(\n      saddlePoints([\n        [1, 2, 3],\n        [3, 1, 2],\n        [2, 3, 1],\n      ])\n    ).toEqual(expected)\n  })\n\n  xit('Can identify multiple saddle points in a column', () => {\n    const expected = [\n      { row: 1, column: 2 },\n      { row: 2, column: 2 },\n      { row: 3, column: 2 },\n    ]\n    expect(\n      saddlePoints([\n        [4, 5, 4],\n        [3, 5, 5],\n        [1, 5, 4],\n      ])\n    ).toEqual(expected)\n  })\n\n  xit('Can identify multiple saddle points in a row', () => {\n    const expected = [\n      { row: 2, column: 1 },\n      { row: 2, column: 2 },\n      { row: 2, column: 3 },\n    ]\n    expect(\n      saddlePoints([\n        [6, 7, 8],\n        [5, 5, 5],\n        [7, 5, 6],\n      ])\n    ).toEqual(expected)\n  })\n\n  xit('Can identify saddle point in bottom right corner', () => {\n    const expected = [{ row: 3, column: 3 }]\n    expect(\n      saddlePoints([\n        [8, 7, 9],\n        [6, 7, 6],\n        [3, 2, 5],\n      ])\n    ).toEqual(expected)\n  })\n\n  xit('Can identify saddle points in a non square matrix', () => {\n    const expected = [\n      { row: 1, column: 1 },\n      { row: 1, column: 3 },\n    ]\n    expect(\n      saddlePoints([\n        [3, 1, 3],\n        [3, 2, 4],\n      ])\n    ).toEqual(expected)\n  })\n\n  xit('Can identify that saddle points in a single column matrix are those with the minimum value', () => {\n    const expected = [\n      { row: 2, column: 1 },\n      { row: 4, column: 1 },\n    ]\n    expect(saddlePoints([[2], [1], [4], [1]])).toEqual(expected)\n  })\n\n  xit('Can identify that saddle points in a single row matrix are those with the maximum value', () => {\n    const expected = [\n      { row: 1, column: 2 },\n      { row: 1, column: 4 },\n    ]\n    expect(saddlePoints([[2, 5, 3, 5]])).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/saddle-points/saddle-points.ts",
    "content": "export function saddlePoints(/* Parameters go here */) {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/saddle-points/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/saddle-points/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/say/.docs/instructions.md",
    "content": "# Instructions\n\nGiven a number, your task is to express it in English words exactly as your friend should say it out loud.\nYaʻqūb expects to use numbers from 0 up to 999,999,999,999.\n\nExamples:\n\n- 0 → zero\n- 1 → one\n- 12 → twelve\n- 123 → one hundred twenty-three\n- 1,234 → one thousand two hundred thirty-four\n"
  },
  {
    "path": "exercises/practice/say/.docs/introduction.md",
    "content": "# Introduction\n\nYour friend Yaʻqūb works the counter at the busiest deli in town, slicing, weighing, and wrapping orders for a never-ending line of hungry customers.\nTo keep things moving, each customer takes a numbered ticket when they arrive.\n\nWhen it’s time to call the next person, Yaʻqūb reads their number out loud, always in full English words to make sure everyone hears it clearly.\n"
  },
  {
    "path": "exercises/practice/say/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"masters3d\"\n  ],\n  \"contributors\": [\n    \"lukaszklis\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"say.ts\"\n    ],\n    \"test\": [\n      \"say.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given a number from 0 to 999,999,999,999, spell out that number in English.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"A variation on the JavaRanch CattleDrive, Assignment 4\",\n  \"source_url\": \"https://web.archive.org/web/20240907035912/https://coderanch.com/wiki/718804\"\n}\n"
  },
  {
    "path": "exercises/practice/say/.meta/proof.ci.ts",
    "content": "const numbersMap = new Map<number, string>([\n  [0, 'zero'],\n  [1, 'one'],\n  [2, 'two'],\n  [3, 'three'],\n  [4, 'four'],\n  [5, 'five'],\n  [6, 'six'],\n  [7, 'seven'],\n  [8, 'eight'],\n  [9, 'nine'],\n  [10, 'ten'],\n  [11, 'eleven'],\n  [12, 'twelve'],\n  [13, 'thirteen'],\n  [14, 'fourteen'],\n  [15, 'fifteen'],\n  [16, 'sixteen'],\n  [17, 'seventeen'],\n  [18, 'eighteen'],\n  [19, 'nineteen'],\n  [20, 'twenty'],\n  [30, 'thirty'],\n  [40, 'forty'],\n  [50, 'fifty'],\n  [60, 'sixty'],\n  [70, 'seventy'],\n  [80, 'eighty'],\n  [90, 'ninety'],\n  [100, 'hundred'],\n  [1000, 'thousand'],\n  [1000000, 'million'],\n  [1000000000, 'billion'],\n])\n\nfunction divideNoDecimal(input: number, by: number): number {\n  return (input / by) | 0 // this is like a hack to get int width\n}\n\nfunction classifier(input: number): number {\n  if (input >= 100 && input < 1000) {\n    return 100\n  }\n  if (input < 1000000 && input >= 1000) {\n    return 1000\n  }\n  if (input < 1000000000 && input >= 1000000) {\n    return 1000000\n  }\n  if (input < 1000000000000 && input >= 1000000000) {\n    return 1000000000\n  }\n  throw new Error(\n    `${classifier.name} only accepts values between 100 to 1000000000000 - 1`\n  )\n}\n\nfunction numberGenerator(input: number): string {\n  if (input < 100) {\n    return zeroTo99(input)\n  }\n  const level = classifier(input)\n  const thirdPlace = divideNoDecimal(input, level)\n  const remainder = input % level\n\n  let builder = ''\n  builder +=\n    thirdPlace === 0\n      ? ''\n      : `${numberGenerator(thirdPlace)} ${numbersMap.get(level)!}`\n  builder += remainder === 0 ? '' : ' ' + `${numberGenerator(remainder)}`\n  return builder\n}\n\nfunction zeroTo99(input: number): string {\n  if (input > 100) {\n    throw new Error(`${zeroTo99.name} only accepts values 0 to 99`)\n  }\n  if (input <= 20) {\n    return numbersMap.get(input)!\n  }\n  if (input > 20 && input < 100) {\n    const teen = divideNoDecimal(input, 10) * 10\n    const tens = numbersMap.get(teen)!\n    const remainder = numbersMap.get(input % teen)!\n    if (remainder === 'zero') {\n      return tens\n    } else {\n      return `${tens}-${remainder}`\n    }\n  }\n  return ''\n}\n\nexport function sayInEnglish(input: number): string {\n  if (input < 0 || input > 999999999999) {\n    throw new Error('Number must be between 0 and 999,999,999,999.')\n  }\n\n  return numberGenerator(input)\n}\n"
  },
  {
    "path": "exercises/practice/say/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[5d22a120-ba0c-428c-bd25-8682235d83e8]\ndescription = \"zero\"\n\n[9b5eed77-dbf6-439d-b920-3f7eb58928f6]\ndescription = \"one\"\n\n[7c499be1-612e-4096-a5e1-43b2f719406d]\ndescription = \"fourteen\"\n\n[f541dd8e-f070-4329-92b4-b7ce2fcf06b4]\ndescription = \"twenty\"\n\n[d78601eb-4a84-4bfa-bf0e-665aeb8abe94]\ndescription = \"twenty-two\"\n\n[f010d4ca-12c9-44e9-803a-27789841adb1]\ndescription = \"thirty\"\n\n[738ce12d-ee5c-4dfb-ad26-534753a98327]\ndescription = \"ninety-nine\"\n\n[e417d452-129e-4056-bd5b-6eb1df334dce]\ndescription = \"one hundred\"\n\n[d6924f30-80ba-4597-acf6-ea3f16269da8]\ndescription = \"one hundred twenty-three\"\n\n[2f061132-54bc-4fd4-b5df-0a3b778959b9]\ndescription = \"two hundred\"\n\n[feed6627-5387-4d38-9692-87c0dbc55c33]\ndescription = \"nine hundred ninety-nine\"\n\n[3d83da89-a372-46d3-b10d-de0c792432b3]\ndescription = \"one thousand\"\n\n[865af898-1d5b-495f-8ff0-2f06d3c73709]\ndescription = \"one thousand two hundred thirty-four\"\n\n[b6a3f442-266e-47a3-835d-7f8a35f6cf7f]\ndescription = \"one million\"\n\n[2cea9303-e77e-4212-b8ff-c39f1978fc70]\ndescription = \"one million two thousand three hundred forty-five\"\n\n[3e240eeb-f564-4b80-9421-db123f66a38f]\ndescription = \"one billion\"\n\n[9a43fed1-c875-4710-8286-5065d73b8a9e]\ndescription = \"a big number\"\n\n[49a6a17b-084e-423e-994d-a87c0ecc05ef]\ndescription = \"numbers below zero are out of range\"\n\n[4d6492eb-5853-4d16-9d34-b0f61b261fd9]\ndescription = \"numbers above 999,999,999,999 are out of range\"\n"
  },
  {
    "path": "exercises/practice/say/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/say/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/say/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/say/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/say/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/say/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/say/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-say\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/say/say.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { sayInEnglish } from './say.ts'\n\ndescribe('say', () => {\n  it('zero', () => {\n    expect(sayInEnglish(0)).toBe('zero')\n  })\n\n  xit('one', () => {\n    expect(sayInEnglish(1)).toBe('one')\n  })\n\n  xit('fourteen', () => {\n    expect(sayInEnglish(14)).toBe('fourteen')\n  })\n\n  xit('twenty', () => {\n    expect(sayInEnglish(20)).toBe('twenty')\n  })\n\n  xit('twenty-two', () => {\n    expect(sayInEnglish(22)).toBe('twenty-two')\n  })\n\n  xit('thirty', () => {\n    expect(sayInEnglish(30)).toBe('thirty')\n  })\n\n  xit('ninety-nine', () => {\n    expect(sayInEnglish(99)).toBe('ninety-nine')\n  })\n\n  xit('one hundred', () => {\n    expect(sayInEnglish(100)).toBe('one hundred')\n  })\n\n  xit('one hundred twenty-three', () => {\n    expect(sayInEnglish(123)).toBe('one hundred twenty-three')\n  })\n\n  xit('two hundred', () => {\n    expect(sayInEnglish(200)).toBe('two hundred')\n  })\n\n  xit('nine hundred ninety-nine', () => {\n    expect(sayInEnglish(999)).toBe('nine hundred ninety-nine')\n  })\n\n  xit('one thousand', () => {\n    expect(sayInEnglish(1000)).toBe('one thousand')\n  })\n\n  xit('one thousand two hundred thirty-four', () => {\n    expect(sayInEnglish(1234)).toBe('one thousand two hundred thirty-four')\n  })\n\n  xit('one million', () => {\n    expect(sayInEnglish(1000000)).toBe('one million')\n  })\n\n  xit('one million two', () => {\n    expect(sayInEnglish(1000002)).toBe('one million two')\n  })\n\n  xit('one million two thousand three hundred forty-five', () => {\n    expect(sayInEnglish(1002345)).toBe(\n      'one million two thousand three hundred forty-five'\n    )\n  })\n\n  xit('one billion', () => {\n    expect(sayInEnglish(1000000000)).toBe('one billion')\n  })\n\n  xit('a really big number', () => {\n    let expected = 'nine hundred eighty-seven billion '\n    expected += 'six hundred fifty-four million '\n    expected += 'three hundred twenty-one thousand '\n    expected += 'one hundred twenty-three'\n    expect(sayInEnglish(987654321123)).toBe(expected)\n  })\n\n  xit('raises an error below zero', () => {\n    expect(() => {\n      sayInEnglish(-1)\n    }).toThrow('Number must be between 0 and 999,999,999,999.')\n  })\n\n  xit('raises an error above 999,999,999,999', () => {\n    expect(() => {\n      sayInEnglish(1000000000000)\n    }).toThrow('Number must be between 0 and 999,999,999,999.')\n  })\n})\n"
  },
  {
    "path": "exercises/practice/say/say.ts",
    "content": "export function sayInEnglish() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/say/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/say/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/scrabble-score/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to compute a word's Scrabble score by summing the values of its letters.\n\nThe letters are valued as follows:\n\n| Letter                       | Value |\n| ---------------------------- | ----- |\n| A, E, I, O, U, L, N, R, S, T | 1     |\n| D, G                         | 2     |\n| B, C, M, P                   | 3     |\n| F, H, V, W, Y                | 4     |\n| K                            | 5     |\n| J, X                         | 8     |\n| Q, Z                         | 10    |\n\nFor example, the word \"cabbage\" is worth 14 points:\n\n- 3 points for C\n- 1 point for A\n- 3 points for B\n- 3 points for B\n- 1 point for A\n- 2 points for G\n- 1 point for E\n"
  },
  {
    "path": "exercises/practice/scrabble-score/.docs/introduction.md",
    "content": "# Introduction\n\n[Scrabble][wikipedia] is a word game where players place letter tiles on a board to form words.\nEach letter has a value.\nA word's score is the sum of its letters' values.\n\n[wikipedia]: https://en.wikipedia.org/wiki/Scrabble\n"
  },
  {
    "path": "exercises/practice/scrabble-score/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"zgavin1\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"scrabble-score.ts\"\n    ],\n    \"test\": [\n      \"scrabble-score.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given a word, compute the Scrabble score for that word.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Inspired by the Extreme Startup game\",\n  \"source_url\": \"https://github.com/rchatley/extreme_startup\"\n}\n"
  },
  {
    "path": "exercises/practice/scrabble-score/.meta/proof.ci.ts",
    "content": "interface LetterScore {\n  [key: string]: number\n}\n\nconst letterScores: LetterScore = {\n  a: 1,\n  e: 1,\n  i: 1,\n  o: 1,\n  u: 1,\n  l: 1,\n  n: 1,\n  r: 1,\n  s: 1,\n  t: 1,\n  d: 2,\n  g: 2,\n  b: 3,\n  c: 3,\n  m: 3,\n  p: 3,\n  f: 4,\n  h: 4,\n  v: 4,\n  w: 4,\n  y: 4,\n  k: 5,\n  j: 8,\n  x: 8,\n  q: 10,\n  z: 10,\n}\n\nexport const score = (word: string | undefined): number => {\n  word = word ? word.toLowerCase() : ''\n\n  let output = 0\n  word.split('').forEach((letter: string): void => {\n    output += letterScores[letter]\n  })\n\n  return output\n}\n"
  },
  {
    "path": "exercises/practice/scrabble-score/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[f46cda29-1ca5-4ef2-bd45-388a767e3db2]\ndescription = \"lowercase letter\"\n\n[f7794b49-f13e-45d1-a933-4e48459b2201]\ndescription = \"uppercase letter\"\n\n[eaba9c76-f9fa-49c9-a1b0-d1ba3a5b31fa]\ndescription = \"valuable letter\"\n\n[f3c8c94e-bb48-4da2-b09f-e832e103151e]\ndescription = \"short word\"\n\n[71e3d8fa-900d-4548-930e-68e7067c4615]\ndescription = \"short, valuable word\"\n\n[d3088ad9-570c-4b51-8764-c75d5a430e99]\ndescription = \"medium word\"\n\n[fa20c572-ad86-400a-8511-64512daac352]\ndescription = \"medium, valuable word\"\n\n[9336f0ba-9c2b-4fa0-bd1c-2e2d328cf967]\ndescription = \"long, mixed-case word\"\n\n[1e34e2c3-e444-4ea7-b598-3c2b46fd2c10]\ndescription = \"english-like word\"\n\n[4efe3169-b3b6-4334-8bae-ff4ef24a7e4f]\ndescription = \"empty input\"\n\n[3b305c1c-f260-4e15-a5b5-cb7d3ea7c3d7]\ndescription = \"entire alphabet available\"\n"
  },
  {
    "path": "exercises/practice/scrabble-score/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/scrabble-score/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/scrabble-score/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/scrabble-score/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/scrabble-score/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/scrabble-score/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/scrabble-score/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-scrabble-score\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/scrabble-score/scrabble-score.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { score } from './scrabble-score.ts'\n\ndescribe('Scrabble', () => {\n  it('scores an empty word as zero', () => expect(score('')).toEqual(0))\n\n  xit('scores a null as zero', () => expect(score(undefined)).toEqual(0))\n\n  xit('scores a very short word', () => expect(score('a')).toEqual(1))\n\n  xit('scores the word by the number of letters', () =>\n    expect(score('street')).toEqual(6))\n\n  xit('scores more complicated words with more', () =>\n    expect(score('quirky')).toEqual(22))\n\n  xit('scores case insensitive words', () =>\n    expect(score('OXYPHENBUTAZONE')).toEqual(41))\n})\n"
  },
  {
    "path": "exercises/practice/scrabble-score/scrabble-score.ts",
    "content": "export function score() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/scrabble-score/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/scrabble-score/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/secret-handshake/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to convert a number between 1 and 31 to a sequence of actions in the secret handshake.\n\nThe sequence of actions is chosen by looking at the rightmost five digits of the number once it's been converted to binary.\nStart at the right-most digit and move left.\n\nThe actions for each number place are:\n\n```plaintext\n00001 = wink\n00010 = double blink\n00100 = close your eyes\n01000 = jump\n10000 = Reverse the order of the operations in the secret handshake.\n```\n\nLet's use the number `9` as an example:\n\n- 9 in binary is `1001`.\n- The digit that is farthest to the right is 1, so the first action is `wink`.\n- Going left, the next digit is 0, so there is no double-blink.\n- Going left again, the next digit is 0, so you leave your eyes open.\n- Going left again, the next digit is 1, so you jump.\n\nThat was the last digit, so the final code is:\n\n```plaintext\nwink, jump\n```\n\nGiven the number 26, which is `11010` in binary, we get the following actions:\n\n- double blink\n- jump\n- reverse actions\n\nThe secret handshake for 26 is therefore:\n\n```plaintext\njump, double blink\n```\n\n~~~~exercism/note\nIf you aren't sure what binary is or how it works, check out [this binary tutorial][intro-to-binary].\n\n[intro-to-binary]: https://medium.com/basecs/bits-bytes-building-with-binary-13cb4289aafa\n~~~~\n"
  },
  {
    "path": "exercises/practice/secret-handshake/.docs/introduction.md",
    "content": "# Introduction\n\nYou are starting a secret coding club with some friends and friends-of-friends.\nNot everyone knows each other, so you and your friends have decided to create a secret handshake that you can use to recognize that someone is a member.\nYou don't want anyone who isn't in the know to be able to crack the code.\n\nYou've designed the code so that one person says a number between 1 and 31, and the other person turns it into a series of actions.\n"
  },
  {
    "path": "exercises/practice/secret-handshake/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"secret-handshake.ts\"\n    ],\n    \"test\": [\n      \"secret-handshake.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given a decimal number, convert it to the appropriate sequence of events for a secret handshake.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Bert, in Mary Poppins\",\n  \"source_url\": \"https://www.imdb.com/title/tt0058331/quotes/?item=qt0437047\"\n}\n"
  },
  {
    "path": "exercises/practice/secret-handshake/.meta/proof.ci.ts",
    "content": "const COMMANDS = ['wink', 'double blink', 'close your eyes', 'jump'] as const\ntype Command = (typeof COMMANDS)[number]\ntype Commands = Command[]\n\nexport const commands = (handshake: number): Commands => {\n  const shakeWith = COMMANDS.filter((_, i) => handshake & Math.pow(2, i))\n\n  if (handshake & Math.pow(2, 4)) {\n    shakeWith.reverse()\n  }\n\n  return shakeWith\n}\n"
  },
  {
    "path": "exercises/practice/secret-handshake/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[b8496fbd-6778-468c-8054-648d03c4bb23]\ndescription = \"wink for 1\"\n\n[83ec6c58-81a9-4fd1-bfaf-0160514fc0e3]\ndescription = \"double blink for 10\"\n\n[0e20e466-3519-4134-8082-5639d85fef71]\ndescription = \"close your eyes for 100\"\n\n[b339ddbb-88b7-4b7d-9b19-4134030d9ac0]\ndescription = \"jump for 1000\"\n\n[40499fb4-e60c-43d7-8b98-0de3ca44e0eb]\ndescription = \"combine two actions\"\n\n[9730cdd5-ef27-494b-afd3-5c91ad6c3d9d]\ndescription = \"reverse two actions\"\n\n[0b828205-51ca-45cd-90d5-f2506013f25f]\ndescription = \"reversing one action gives the same action\"\n\n[9949e2ac-6c9c-4330-b685-2089ab28b05f]\ndescription = \"reversing no actions still gives no actions\"\n\n[23fdca98-676b-4848-970d-cfed7be39f81]\ndescription = \"all possible actions\"\n\n[ae8fe006-d910-4d6f-be00-54b7c3799e79]\ndescription = \"reverse all possible actions\"\n\n[3d36da37-b31f-4cdb-a396-d93a2ee1c4a5]\ndescription = \"do nothing for zero\"\n"
  },
  {
    "path": "exercises/practice/secret-handshake/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/secret-handshake/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/secret-handshake/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/secret-handshake/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/secret-handshake/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/secret-handshake/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/secret-handshake/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-secret-handshake\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/secret-handshake/secret-handshake.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { commands } from './secret-handshake.ts'\n\ndescribe('Secret Handshake', () => {\n  describe('Create A Handshake For A Number', () => {\n    it('wink for 1', () => {\n      expect(commands(1)).toEqual(['wink'])\n    })\n\n    xit('double blink for 10', () => {\n      expect(commands(2)).toEqual(['double blink'])\n    })\n\n    xit('close your eyes for 100', () => {\n      expect(commands(4)).toEqual(['close your eyes'])\n    })\n\n    xit('jump for 1000', () => {\n      expect(commands(8)).toEqual(['jump'])\n    })\n\n    xit('combine two actions', () => {\n      expect(commands(3)).toEqual(['wink', 'double blink'])\n    })\n\n    xit('reverse two actions', () => {\n      expect(commands(19)).toEqual(['double blink', 'wink'])\n    })\n\n    xit('reversing one action gives the same action', () => {\n      expect(commands(24)).toEqual(['jump'])\n    })\n\n    xit('reversing no actions still gives no actions', () => {\n      expect(commands(16)).toEqual([])\n    })\n\n    xit('all possible actions', () => {\n      expect(commands(15)).toEqual([\n        'wink',\n        'double blink',\n        'close your eyes',\n        'jump',\n      ])\n    })\n\n    xit('reverse all possible actions', () => {\n      expect(commands(31)).toEqual([\n        'jump',\n        'close your eyes',\n        'double blink',\n        'wink',\n      ])\n    })\n\n    xit('do nothing for zero', () => {\n      expect(commands(0)).toEqual([])\n    })\n  })\n})\n"
  },
  {
    "path": "exercises/practice/secret-handshake/secret-handshake.ts",
    "content": "export function commands() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/secret-handshake/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/secret-handshake/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/series/.docs/instructions.md",
    "content": "# Instructions\n\nGiven a string of digits, output all the contiguous substrings of length `n` in that string in the order that they appear.\n\nFor example, the string \"49142\" has the following 3-digit series:\n\n- \"491\"\n- \"914\"\n- \"142\"\n\nAnd the following 4-digit series:\n\n- \"4914\"\n- \"9142\"\n\nAnd if you ask for a 6-digit series from a 5-digit string, you deserve whatever you get.\n\nNote that these series are only required to occupy _adjacent positions_ in the input;\nthe digits need not be _numerically consecutive_.\n"
  },
  {
    "path": "exercises/practice/series/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"foxfriends\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"series.ts\"\n    ],\n    \"test\": [\n      \"series.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given a string of digits, output all the contiguous substrings of length `n` in that string.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"A subset of the Problem 8 at Project Euler\",\n  \"source_url\": \"https://projecteuler.net/problem=8\"\n}\n"
  },
  {
    "path": "exercises/practice/series/.meta/proof.ci.ts",
    "content": "export class Series {\n  private readonly numberString: string\n  private readonly digits: number[]\n\n  constructor(numberString: string) {\n    if (!numberString) {\n      throw new Error('series cannot be empty')\n    }\n\n    this.numberString = numberString\n    this.digits = this.getDigits()\n  }\n\n  private getDigits(): number[] {\n    return [...this.numberString].map((digit) => parseInt(digit, 10))\n  }\n\n  public slices(sliceSize: number): number[][] {\n    const result: number[][] = []\n    let slice: number[] = []\n\n    if (sliceSize < 0) {\n      throw new Error('slice length cannot be negative')\n    }\n\n    if (sliceSize === 0) {\n      throw new Error('slice length cannot be zero')\n    }\n\n    if (sliceSize > this.digits.length) {\n      throw new Error('slice length cannot be greater than series length')\n    }\n\n    for (let i = 0; i < this.digits.length - sliceSize + 1; i += 1) {\n      for (let j = 0; j < sliceSize; j += 1) {\n        slice.push(this.digits[i + j])\n      }\n      result.push(slice)\n      slice = []\n    }\n\n    return result\n  }\n}\n"
  },
  {
    "path": "exercises/practice/series/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[7ae7a46a-d992-4c2a-9c15-a112d125ebad]\ndescription = \"slices of one from one\"\n\n[3143b71d-f6a5-4221-aeae-619f906244d2]\ndescription = \"slices of one from two\"\n\n[dbb68ff5-76c5-4ccd-895a-93dbec6d5805]\ndescription = \"slices of two\"\n\n[19bbea47-c987-4e11-a7d1-e103442adf86]\ndescription = \"slices of two overlap\"\n\n[8e17148d-ba0a-4007-a07f-d7f87015d84c]\ndescription = \"slices can include duplicates\"\n\n[bd5b085e-f612-4f81-97a8-6314258278b0]\ndescription = \"slices of a long series\"\n\n[6d235d85-46cf-4fae-9955-14b6efef27cd]\ndescription = \"slice length is too large\"\n\n[d7957455-346d-4e47-8e4b-87ed1564c6d7]\ndescription = \"slice length is way too large\"\n\n[d34004ad-8765-4c09-8ba1-ada8ce776806]\ndescription = \"slice length cannot be zero\"\n\n[10ab822d-8410-470a-a85d-23fbeb549e54]\ndescription = \"slice length cannot be negative\"\n\n[c7ed0812-0e4b-4bf3-99c4-28cbbfc246a2]\ndescription = \"empty series is invalid\"\n"
  },
  {
    "path": "exercises/practice/series/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/series/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/series/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/series/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/series/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/series/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/series/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-series\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/series/series.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { Series } from './series.ts'\n\ndescribe('Series', () => {\n  it('slices of one from one', () => {\n    expect(new Series('1').slices(1)).toEqual([[1]])\n  })\n\n  xit('slices of one from two', () => {\n    expect(new Series('12').slices(1)).toEqual([[1], [2]])\n  })\n\n  xit('slices of two', () => {\n    expect(new Series('35').slices(2)).toEqual([[3, 5]])\n  })\n\n  xit('slices of two overlap', () => {\n    expect(new Series('9142').slices(2)).toEqual([\n      [9, 1],\n      [1, 4],\n      [4, 2],\n    ])\n  })\n\n  xit('slices can include duplicates', () => {\n    expect(new Series('777777').slices(3)).toEqual([\n      [7, 7, 7],\n      [7, 7, 7],\n      [7, 7, 7],\n      [7, 7, 7],\n    ])\n  })\n\n  xit('slices of long series', () => {\n    expect(new Series('918493904243').slices(5)).toEqual([\n      [9, 1, 8, 4, 9],\n      [1, 8, 4, 9, 3],\n      [8, 4, 9, 3, 9],\n      [4, 9, 3, 9, 0],\n      [9, 3, 9, 0, 4],\n      [3, 9, 0, 4, 2],\n      [9, 0, 4, 2, 4],\n      [0, 4, 2, 4, 3],\n    ])\n  })\n\n  xit('slice length is too large', () => {\n    expect(() => {\n      new Series('12345').slices(6)\n    }).toThrow(new Error('slice length cannot be greater than series length'))\n  })\n\n  xit('slice length is way too large', () => {\n    expect(() => {\n      new Series('12345').slices(42)\n    }).toThrow(new Error('slice length cannot be greater than series length'))\n  })\n\n  xit('slice length cannot be zero', () => {\n    expect(() => {\n      new Series('12345').slices(0)\n    }).toThrow(new Error('slice length cannot be zero'))\n  })\n\n  xit('slice length cannot be negative', () => {\n    expect(() => {\n      new Series('123').slices(-1)\n    }).toThrow(new Error('slice length cannot be negative'))\n  })\n\n  xit('empty series is invalid', () => {\n    expect(() => {\n      new Series('').slices(1)\n    }).toThrow(new Error('series cannot be empty'))\n  })\n})\n"
  },
  {
    "path": "exercises/practice/series/series.ts",
    "content": "export class Series {\n  constructor(series: unknown) {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  slices(sliceLength: unknown): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/series/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/series/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/sieve/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to create a program that implements the Sieve of Eratosthenes algorithm to find all prime numbers less than or equal to a given number.\n\nA prime number is a number larger than 1 that is only divisible by 1 and itself.\nFor example, 2, 3, 5, 7, 11, and 13 are prime numbers.\nBy contrast, 6 is _not_ a prime number as it not only divisible by 1 and itself, but also by 2 and 3.\n\nTo use the Sieve of Eratosthenes, first, write out all the numbers from 2 up to and including your given number.\nThen, follow these steps:\n\n1. Find the next unmarked number (skipping over marked numbers).\n   This is a prime number.\n2. Mark all the multiples of that prime number as **not** prime.\n\nRepeat the steps until you've gone through every number.\nAt the end, all the unmarked numbers are prime.\n\n~~~~exercism/note\nThe Sieve of Eratosthenes marks off multiples of each prime using addition (repeatedly adding the prime) or multiplication (directly computing its multiples), rather than checking each number for divisibility.\n\nThe tests don't check that you've implemented the algorithm, only that you've come up with the correct primes.\n~~~~\n\n## Example\n\nLet's say you're finding the primes less than or equal to 10.\n\n- Write out 2, 3, 4, 5, 6, 7, 8, 9, 10, leaving them all unmarked.\n\n  ```text\n  2 3 4 5 6 7 8 9 10\n  ```\n\n- 2 is unmarked and is therefore a prime.\n  Mark 4, 6, 8 and 10 as \"not prime\".\n\n  ```text\n  2 3 [4] 5 [6] 7 [8] 9 [10]\n  ↑\n  ```\n\n- 3 is unmarked and is therefore a prime.\n  Mark 6 and 9 as not prime _(marking 6 is optional - as it's already been marked)_.\n\n  ```text\n  2 3 [4] 5 [6] 7 [8] [9] [10]\n    ↑\n  ```\n\n- 4 is marked as \"not prime\", so we skip over it.\n\n  ```text\n  2 3 [4] 5 [6] 7 [8] [9] [10]\n       ↑\n  ```\n\n- 5 is unmarked and is therefore a prime.\n  Mark 10 as not prime _(optional - as it's already been marked)_.\n\n  ```text\n  2 3 [4] 5 [6] 7 [8] [9] [10]\n          ↑\n  ```\n\n- 6 is marked as \"not prime\", so we skip over it.\n\n  ```text\n  2 3 [4] 5 [6] 7 [8] [9] [10]\n             ↑\n  ```\n\n- 7 is unmarked and is therefore a prime.\n\n  ```text\n  2 3 [4] 5 [6] 7 [8] [9] [10]\n                ↑\n  ```\n\n- 8 is marked as \"not prime\", so we skip over it.\n\n  ```text\n  2 3 [4] 5 [6] 7 [8] [9] [10]\n                   ↑\n  ```\n\n- 9 is marked as \"not prime\", so we skip over it.\n\n  ```text\n  2 3 [4] 5 [6] 7 [8] [9] [10]\n                       ↑\n  ```\n\n- 10 is marked as \"not prime\", so we stop as there are no more numbers to check.\n\n  ```text\n  2 3 [4] 5 [6] 7 [8] [9] [10]\n                           ↑\n  ```\n\nYou've examined all the numbers and found that 2, 3, 5, and 7 are still unmarked, meaning they're the primes less than or equal to 10.\n"
  },
  {
    "path": "exercises/practice/sieve/.docs/introduction.md",
    "content": "# Introduction\n\nYou bought a big box of random computer parts at a garage sale.\nYou've started putting the parts together to build custom computers.\n\nYou want to test the performance of different combinations of parts, and decide to create your own benchmarking program to see how your computers compare.\nYou choose the famous \"Sieve of Eratosthenes\" algorithm, an ancient algorithm, but one that should push your computers to the limits.\n"
  },
  {
    "path": "exercises/practice/sieve/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"sieve.ts\"\n    ],\n    \"test\": [\n      \"sieve.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Use the Sieve of Eratosthenes to find all the primes from 2 up to a given number.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": true,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Sieve of Eratosthenes at Wikipedia\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes\"\n}\n"
  },
  {
    "path": "exercises/practice/sieve/.meta/proof.ci.ts",
    "content": "export function primes(limit: number): number[] {\n  if (limit === 2) {\n    return [limit]\n  }\n\n  const sieve: boolean[] = []\n  for (let i = 0; i < limit; i++) {\n    sieve[i] = true\n  }\n\n  const found: number[] = []\n  const maxCandidate = Math.floor(Math.sqrt(limit))\n  for (let candidate = 2; candidate <= maxCandidate + 1; candidate++) {\n    if (!sieve[candidate - 1]) {\n      continue\n    }\n\n    found.push(candidate)\n    let multiple = candidate * candidate\n    while (multiple <= limit) {\n      sieve[multiple - 1] = false\n      multiple += candidate\n    }\n  }\n\n  for (let i = maxCandidate + 1; i <= limit; i++) {\n    if (sieve[i - 1]) {\n      found.push(i)\n    }\n  }\n\n  return found\n}\n"
  },
  {
    "path": "exercises/practice/sieve/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[88529125-c4ce-43cc-bb36-1eb4ddd7b44f]\ndescription = \"no primes under two\"\n\n[4afe9474-c705-4477-9923-840e1024cc2b]\ndescription = \"find first prime\"\n\n[974945d8-8cd9-4f00-9463-7d813c7f17b7]\ndescription = \"find primes up to 10\"\n\n[2e2417b7-3f3a-452a-8594-b9af08af6d82]\ndescription = \"limit is prime\"\n\n[92102a05-4c7c-47de-9ed0-b7d5fcd00f21]\ndescription = \"find primes up to 1000\"\n"
  },
  {
    "path": "exercises/practice/sieve/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/sieve/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/sieve/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/sieve/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/sieve/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/sieve/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/sieve/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-sieve\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/sieve/sieve.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { primes } from './sieve.ts'\n\ndescribe('Sieve', () => {\n  it('no primes under two', () => {\n    const expected: number[] = []\n    expect(primes(1)).toEqual(expected)\n  })\n\n  xit('find first prime', () => {\n    const expected = [2]\n    expect(primes(2)).toEqual(expected)\n  })\n\n  xit('find primes up to 10', () => {\n    const expected = [2, 3, 5, 7]\n    expect(primes(10)).toEqual(expected)\n  })\n\n  xit('limit is prime', () => {\n    const expected = [2, 3, 5, 7, 11, 13]\n    expect(primes(13)).toEqual(expected)\n  })\n\n  xit('find primes up to 1000', () => {\n    const expected: number[] = [\n      2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67,\n      71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149,\n      151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229,\n      233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313,\n      317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409,\n      419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499,\n      503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601,\n      607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691,\n      701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809,\n      811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907,\n      911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997,\n    ]\n    expect(primes(1000)).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/sieve/sieve.ts",
    "content": "export function primes() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/sieve/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/sieve/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/simple-cipher/.docs/instructions.md",
    "content": "# Instructions\n\nCreate an implementation of the [Vigenère cipher][wiki].\nThe Vigenère cipher is a simple substitution cipher.\n\n## Cipher terminology\n\nA cipher is an algorithm used to encrypt, or encode, a string.\nThe unencrypted string is called the _plaintext_ and the encrypted string is called the _ciphertext_.\nConverting plaintext to ciphertext is called _encoding_ while the reverse is called _decoding_.\n\nIn a _substitution cipher_, each plaintext letter is replaced with a ciphertext letter which is computed with the help of a _key_.\n(Note, it is possible for replacement letter to be the same as the original letter.)\n\n## Encoding details\n\nIn this cipher, the key is a series of lowercase letters, such as `\"abcd\"`.\nEach letter of the plaintext is _shifted_ or _rotated_ by a distance based on a corresponding letter in the key.\nAn `\"a\"` in the key means a shift of 0 (that is, no shift).\nA `\"b\"` in the key means a shift of 1.\nA `\"c\"` in the key means a shift of 2, and so on.\n\nThe first letter of the plaintext uses the first letter of the key, the second letter of the plaintext uses the second letter of the key and so on.\nIf you run out of letters in the key before you run out of letters in the plaintext, start over from the start of the key again.\n\nIf the key only contains one letter, such as `\"dddddd\"`, then all letters of the plaintext are shifted by the same amount (three in this example), which would make this the same as a rotational cipher or shift cipher (sometimes called a Caesar cipher).\nFor example, the plaintext `\"iamapandabear\"` would become `\"ldpdsdqgdehdu\"`.\n\nIf the key only contains the letter `\"a\"` (one or more times), the shift distance is zero and the ciphertext is the same as the plaintext.\n\nUsually the key is more complicated than that, though!\nIf the key is `\"abcd\"` then letters of the plaintext would be shifted by a distance of 0, 1, 2, and 3.\nIf the plaintext is `\"hello\"`, we need 5 shifts so the key would wrap around, giving shift distances of 0, 1, 2, 3, and 0.\nApplying those shifts to the letters of `\"hello\"` we get `\"hfnoo\"`.\n\n## Random keys\n\nIf no key is provided, generate a key which consists of at least 100 random lowercase letters from the Latin alphabet.\n\n[wiki]: https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher\n"
  },
  {
    "path": "exercises/practice/simple-cipher/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"daveyarwood\",\n    \"janczer\",\n    \"masters3d\",\n    \"SleeplessByte\",\n    \"tekerson\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"simple-cipher.ts\"\n    ],\n    \"test\": [\n      \"simple-cipher.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Implement the Vigenère cipher, a simple substitution cipher.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Substitution Cipher at Wikipedia\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/Substitution_cipher\"\n}\n"
  },
  {
    "path": "exercises/practice/simple-cipher/.meta/proof.ci.ts",
    "content": "export class SimpleCipher {\n  public key: string\n\n  constructor(key?: string) {\n    if (key === undefined) {\n      this.key = ''\n\n      for (let i = 0; i < 100; i++) {\n        this.key += String.fromCharCode(Math.random() * 26 + 97)\n      }\n    } else if (!/^[a-z]+$/.test(key)) {\n      throw new Error('Bad key')\n    } else {\n      this.key = key\n    }\n  }\n\n  public encode(decodedMessage: string): string {\n    let encodedMessage = ''\n    for (let i = 0; i < decodedMessage.length; i++) {\n      let encodedChar = String.fromCharCode(\n        decodedMessage.charCodeAt(i) +\n          (this.key.charCodeAt(i % this.key.length) - 97)\n      )\n      if (encodedChar.charCodeAt(0) > 122) {\n        encodedChar = String.fromCharCode(encodedChar.charCodeAt(0) - 26)\n      }\n      encodedMessage += encodedChar\n    }\n    return encodedMessage\n  }\n\n  public decode(encodedMessage: string): string {\n    let decodedMessage = ''\n    for (let i = 0; i < encodedMessage.length; i++) {\n      let decodedChar = String.fromCharCode(\n        encodedMessage.charCodeAt(i) -\n          (this.key.charCodeAt(i % this.key.length) - 97)\n      )\n      if (decodedChar.charCodeAt(0) < 97) {\n        decodedChar = String.fromCharCode(decodedChar.charCodeAt(0) + 26)\n      }\n      decodedMessage += decodedChar\n    }\n    return decodedMessage\n  }\n}\n"
  },
  {
    "path": "exercises/practice/simple-cipher/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[b8bdfbe1-bea3-41bb-a999-b41403f2b15d]\ndescription = \"Can encode\"\n\n[3dff7f36-75db-46b4-ab70-644b3f38b81c]\ndescription = \"Can decode\"\n\n[8143c684-6df6-46ba-bd1f-dea8fcb5d265]\ndescription = \"Is reversible. I.e., if you apply decode in a encoded result, you must see the same plaintext encode parameter as a result of the decode method\"\n\n[defc0050-e87d-4840-85e4-51a1ab9dd6aa]\ndescription = \"Key is made only of lowercase letters\"\n\n[565e5158-5b3b-41dd-b99d-33b9f413c39f]\ndescription = \"Can encode\"\n\n[d44e4f6a-b8af-4e90-9d08-fd407e31e67b]\ndescription = \"Can decode\"\n\n[70a16473-7339-43df-902d-93408c69e9d1]\ndescription = \"Is reversible. I.e., if you apply decode in a encoded result, you must see the same plaintext encode parameter as a result of the decode method\"\n\n[69a1458b-92a6-433a-a02d-7beac3ea91f9]\ndescription = \"Can double shift encode\"\n\n[21d207c1-98de-40aa-994f-86197ae230fb]\ndescription = \"Can wrap on encode\"\n\n[a3d7a4d7-24a9-4de6-bdc4-a6614ced0cb3]\ndescription = \"Can wrap on decode\"\n\n[e31c9b8c-8eb6-45c9-a4b5-8344a36b9641]\ndescription = \"Can encode messages longer than the key\"\n\n[93cfaae0-17da-4627-9a04-d6d1e1be52e3]\ndescription = \"Can decode messages longer than the key\"\n"
  },
  {
    "path": "exercises/practice/simple-cipher/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/simple-cipher/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/simple-cipher/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/simple-cipher/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/simple-cipher/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/simple-cipher/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/simple-cipher/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-simple-cipher\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/simple-cipher/simple-cipher.test.ts",
    "content": "import { describe, xdescribe, it, expect, xit } from '@jest/globals'\nimport { SimpleCipher } from './simple-cipher.ts'\n\ndescribe('Random key generation', () => {\n  xit('generates keys at random', () => {\n    // Strictly speaking, this is difficult to test with 100% certainty.\n    // But, if you have a generator that generates 100-character-long\n    // strings of lowercase letters at random, the odds of two consecutively\n    // generated keys being identical are astronomically low.\n    expect(new SimpleCipher().key).not.toEqual(new SimpleCipher().key)\n  })\n})\n\nxdescribe('Random key cipher', () => {\n  const simpleCipher = new SimpleCipher()\n\n  it('has a key made of letters', () => {\n    expect(simpleCipher.key).toMatch(/^[a-z]+$/)\n  })\n\n  xit('has a key that is at least 100 characters long', () => {\n    expect(simpleCipher.key.length).toBeGreaterThanOrEqual(100)\n  })\n\n  // Here we take advantage of the fact that plaintext of \"aaa...\"\n  // outputs the key. This is a critical problem with shift ciphers, some\n  // characters will always output the key verbatim.\n  xit('can encode', () => {\n    expect(simpleCipher.encode('aaaaaaaaaa')).toEqual(\n      simpleCipher.key.substring(0, 10)\n    )\n  })\n\n  xit('can decode', () => {\n    expect(simpleCipher.decode(simpleCipher.key.substring(0, 10))).toEqual(\n      'aaaaaaaaaa'\n    )\n  })\n\n  xit('is reversible', () => {\n    const plaintext = 'abcdefghij'\n    expect(simpleCipher.decode(simpleCipher.encode(plaintext))).toEqual(\n      plaintext\n    )\n  })\n})\n\nxdescribe('Substitution cipher', () => {\n  const key = 'abcdefghij'\n  const simpleCipher = new SimpleCipher(key)\n\n  xit('keeps the submitted key', () => {\n    expect(simpleCipher.key).toEqual(key)\n  })\n\n  xit('can encode', () => {\n    expect(simpleCipher.encode('aaaaaaaaaa')).toEqual('abcdefghij')\n  })\n\n  xit('can decode', () => {\n    expect(simpleCipher.decode('abcdefghij')).toEqual('aaaaaaaaaa')\n  })\n\n  xit('is reversible', () => {\n    expect(simpleCipher.decode(simpleCipher.encode('abcdefghij'))).toEqual(\n      'abcdefghij'\n    )\n  })\n\n  xit(': double shift encode', () => {\n    expect(new SimpleCipher('iamapandabear').encode('iamapandabear')).toEqual(\n      'qayaeaagaciai'\n    )\n  })\n\n  xit('can wrap on encode', () => {\n    expect(simpleCipher.encode('zzzzzzzzzz')).toEqual('zabcdefghi')\n  })\n\n  xit('can wrap on decode', () => {\n    expect(simpleCipher.decode('zabcdefghi')).toEqual('zzzzzzzzzz')\n  })\n\n  xit('can encode messages longer than the key\"', () => {\n    expect(new SimpleCipher('abc').encode('iamapandabear')).toEqual(\n      'iboaqcnecbfcr'\n    )\n  })\n\n  xit('can decode messages longer than the key', () => {\n    expect(new SimpleCipher('abc').decode('iboaqcnecbfcr')).toEqual(\n      'iamapandabear'\n    )\n  })\n})\n"
  },
  {
    "path": "exercises/practice/simple-cipher/simple-cipher.ts",
    "content": "export class SimpleCipher {\n  encode(/* Parameters go here */) {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  decode(/* Parameters go here */) {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/simple-cipher/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/simple-cipher/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/space-age/.docs/instructions.md",
    "content": "# Instructions\n\nGiven an age in seconds, calculate how old someone would be on a planet in our Solar System.\n\nOne Earth year equals 365.25 Earth days, or 31,557,600 seconds.\nIf you were told someone was 1,000,000,000 seconds old, their age would be 31.69 Earth-years.\n\nFor the other planets, you have to account for their orbital period in Earth Years:\n\n| Planet  | Orbital period in Earth Years |\n| ------- | ----------------------------- |\n| Mercury | 0.2408467                     |\n| Venus   | 0.61519726                    |\n| Earth   | 1.0                           |\n| Mars    | 1.8808158                     |\n| Jupiter | 11.862615                     |\n| Saturn  | 29.447498                     |\n| Uranus  | 84.016846                     |\n| Neptune | 164.79132                     |\n\n~~~~exercism/note\nThe actual length of one complete orbit of the Earth around the sun is closer to 365.256 days (1 sidereal year).\nThe Gregorian calendar has, on average, 365.2425 days.\nWhile not entirely accurate, 365.25 is the value used in this exercise.\nSee [Year on Wikipedia][year] for more ways to measure a year.\n\n[year]: https://en.wikipedia.org/wiki/Year#Summary\n~~~~\n"
  },
  {
    "path": "exercises/practice/space-age/.docs/introduction.md",
    "content": "# Introduction\n\nThe year is 2525 and you've just embarked on a journey to visit all planets in the Solar System (Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus and Neptune).\nThe first stop is Mercury, where customs require you to fill out a form (bureaucracy is apparently _not_ Earth-specific).\nAs you hand over the form to the customs officer, they scrutinize it and frown.\n\"Do you _really_ expect me to believe you're just 50 years old?\nYou must be closer to 200 years old!\"\n\nAmused, you wait for the customs officer to start laughing, but they appear to be dead serious.\nYou realize that you've entered your age in _Earth years_, but the officer expected it in _Mercury years_!\nAs Mercury's orbital period around the sun is significantly shorter than Earth, you're actually a lot older in Mercury years.\nAfter some quick calculations, you're able to provide your age in Mercury Years.\nThe customs officer smiles, satisfied, and waves you through.\nYou make a mental note to pre-calculate your planet-specific age _before_ future customs checks, to avoid such mix-ups.\n\n~~~~exercism/note\nIf you're wondering why Pluto didn't make the cut, go watch [this YouTube video][pluto-video].\n\n[pluto-video]: https://www.youtube.com/watch?v=Z_2gbGXzFbs\n~~~~\n"
  },
  {
    "path": "exercises/practice/space-age/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"masters3d\"\n  ],\n  \"contributors\": [\n    \"lukaszklis\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"space-age.ts\"\n    ],\n    \"test\": [\n      \"space-age.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given an age in seconds, calculate how old someone is in terms of a given planet's solar years.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Partially inspired by Chapter 1 in Chris Pine's online Learn to Program tutorial.\",\n  \"source_url\": \"https://pine.fm/LearnToProgram/chap_01.html\"\n}\n"
  },
  {
    "path": "exercises/practice/space-age/.meta/proof.ci.ts",
    "content": "const EARTH_TO_OTHER_PLANETS = {\n  mercury: 0.2408467,\n  venus: 0.61519726,\n  earth: 1,\n  mars: 1.8808158,\n  jupiter: 11.862615,\n  saturn: 29.447498,\n  uranus: 84.016846,\n  neptune: 164.79132,\n}\n\nexport const age = (\n  planet: keyof typeof EARTH_TO_OTHER_PLANETS,\n  seconds: number\n): number => {\n  const earthYears = seconds / 31557600\n  const years = earthYears / EARTH_TO_OTHER_PLANETS[planet]\n\n  return Number(years.toFixed(2))\n}\n"
  },
  {
    "path": "exercises/practice/space-age/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[84f609af-5a91-4d68-90a3-9e32d8a5cd34]\ndescription = \"age on Earth\"\n\n[ca20c4e9-6054-458c-9312-79679ffab40b]\ndescription = \"age on Mercury\"\n\n[502c6529-fd1b-41d3-8fab-65e03082b024]\ndescription = \"age on Venus\"\n\n[9ceadf5e-a0d5-4388-9d40-2c459227ceb8]\ndescription = \"age on Mars\"\n\n[42927dc3-fe5e-4f76-a5b5-f737fc19bcde]\ndescription = \"age on Jupiter\"\n\n[8469b332-7837-4ada-b27c-00ee043ebcad]\ndescription = \"age on Saturn\"\n\n[999354c1-76f8-4bb5-a672-f317b6436743]\ndescription = \"age on Uranus\"\n\n[80096d30-a0d4-4449-903e-a381178355d8]\ndescription = \"age on Neptune\"\n\n[57b96e2a-1178-40b7-b34d-f3c9c34e4bf4]\ndescription = \"invalid planet causes error\"\ninclude = false\n"
  },
  {
    "path": "exercises/practice/space-age/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/space-age/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/space-age/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/space-age/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/space-age/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/space-age/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/space-age/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-space-age\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/space-age/space-age.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { age } from './space-age.ts'\n\ndescribe('Space Age', () => {\n  it('age on Earth', () => {\n    expect(age('earth', 1000000000)).toEqual(31.69)\n  })\n\n  xit('age on Mercury', () => {\n    expect(age('mercury', 2134835688)).toEqual(280.88)\n  })\n\n  xit('age on Venus', () => {\n    expect(age('venus', 189839836)).toEqual(9.78)\n  })\n\n  xit('age on Mars', () => {\n    expect(age('mars', 2129871239)).toEqual(35.88)\n  })\n\n  xit('age on Jupiter', () => {\n    expect(age('jupiter', 901876382)).toEqual(2.41)\n  })\n\n  xit('age on Saturn', () => {\n    expect(age('saturn', 2000000000)).toEqual(2.15)\n  })\n\n  xit('age on Uranus', () => {\n    expect(age('uranus', 1210123456)).toEqual(0.46)\n  })\n\n  xit('age on Neptune', () => {\n    expect(age('neptune', 1821023456)).toEqual(0.35)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/space-age/space-age.ts",
    "content": "export function age(planet: unknown, seconds: unknown): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/space-age/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/space-age/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/spiral-matrix/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to return a square matrix of a given size.\n\nThe matrix should be filled with natural numbers, starting from 1 in the top-left corner, increasing in an inward, clockwise spiral order, like these examples:\n\n## Examples\n\n### Spiral matrix of size 3\n\n```text\n1 2 3\n8 9 4\n7 6 5\n```\n\n### Spiral matrix of size 4\n\n```text\n 1  2  3 4\n12 13 14 5\n11 16 15 6\n10  9  8 7\n```\n"
  },
  {
    "path": "exercises/practice/spiral-matrix/.docs/introduction.md",
    "content": "# Introduction\n\nIn a small village near an ancient forest, there was a legend of a hidden treasure buried deep within the woods.\nDespite numerous attempts, no one had ever succeeded in finding it.\nThis was about to change, however, thanks to a young explorer named Elara.\nShe had discovered an old document containing instructions on how to locate the treasure.\nUsing these instructions, Elara was able to draw a map that revealed the path to the treasure.\n\nTo her surprise, the path followed a peculiar clockwise spiral.\nIt was no wonder no one had been able to find the treasure before!\nWith the map in hand, Elara embarks on her journey to uncover the hidden treasure.\n"
  },
  {
    "path": "exercises/practice/spiral-matrix/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"spiral-matrix.ts\"\n    ],\n    \"test\": [\n      \"spiral-matrix.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given the size, return a square matrix of numbers in spiral order.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Reddit r/dailyprogrammer challenge #320 [Easy] Spiral Ascension.\",\n  \"source_url\": \"https://web.archive.org/web/20230607064729/https://old.reddit.com/r/dailyprogrammer/comments/6i60lr/20170619_challenge_320_easy_spiral_ascension/\"\n}\n"
  },
  {
    "path": "exercises/practice/spiral-matrix/.meta/proof.ci.ts",
    "content": "export function ofSize(size: number): number[][] {\n  const spiral = Array(size)\n    .fill(Array<number>())\n    .map(() => Array<number>(size).fill(0))\n\n  const totalNumbers = size ** 2\n  let currentNumber = 1\n  let topLeft = 0\n  let bottomRight = size - 1\n\n  while (currentNumber <= totalNumbers) {\n    for (let x = topLeft; x <= bottomRight; x++) {\n      spiral[topLeft][x] = currentNumber++\n    }\n    for (let y = topLeft + 1; y <= bottomRight; y++) {\n      spiral[y][bottomRight] = currentNumber++\n    }\n    for (let x = bottomRight - 1; x >= topLeft; x--) {\n      spiral[bottomRight][x] = currentNumber++\n    }\n    for (let y = bottomRight - 1; y >= topLeft + 1; y--) {\n      spiral[y][topLeft] = currentNumber++\n    }\n    topLeft++\n    bottomRight--\n  }\n\n  return spiral\n}\n"
  },
  {
    "path": "exercises/practice/spiral-matrix/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[8f584201-b446-4bc9-b132-811c8edd9040]\ndescription = \"empty spiral\"\n\n[e40ae5f3-e2c9-4639-8116-8a119d632ab2]\ndescription = \"trivial spiral\"\n\n[cf05e42d-eb78-4098-a36e-cdaf0991bc48]\ndescription = \"spiral of size 2\"\n\n[1c475667-c896-4c23-82e2-e033929de939]\ndescription = \"spiral of size 3\"\n\n[05ccbc48-d891-44f5-9137-f4ce462a759d]\ndescription = \"spiral of size 4\"\n\n[f4d2165b-1738-4e0c-bed0-c459045ae50d]\ndescription = \"spiral of size 5\"\n"
  },
  {
    "path": "exercises/practice/spiral-matrix/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/spiral-matrix/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/spiral-matrix/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/spiral-matrix/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/spiral-matrix/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/spiral-matrix/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/spiral-matrix/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-spiral-matrix\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/spiral-matrix/spiral-matrix.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { ofSize } from './spiral-matrix.ts'\n\ndescribe('Spiral Matrix', () => {\n  it('empty spiral', () => {\n    const expected: number[][] = []\n    const actual = ofSize(0)\n    expect(actual).toEqual(expected)\n  })\n\n  xit('trivial spiral', () => {\n    const expected = [[1]]\n    const actual = ofSize(1)\n    expect(actual).toEqual(expected)\n  })\n\n  xit('spiral of size 2', () => {\n    const expected = [\n      [1, 2],\n      [4, 3],\n    ]\n    const actual = ofSize(2)\n    expect(actual).toEqual(expected)\n  })\n\n  xit('spiral of size 3', () => {\n    const expected = [\n      [1, 2, 3],\n      [8, 9, 4],\n      [7, 6, 5],\n    ]\n    const actual = ofSize(3)\n    expect(actual).toEqual(expected)\n  })\n\n  xit('spiral of size 4', () => {\n    const expected = [\n      [1, 2, 3, 4],\n      [12, 13, 14, 5],\n      [11, 16, 15, 6],\n      [10, 9, 8, 7],\n    ]\n    const actual = ofSize(4)\n    expect(actual).toEqual(expected)\n  })\n\n  xit('spiral of size 5', () => {\n    const expected = [\n      [1, 2, 3, 4, 5],\n      [16, 17, 18, 19, 6],\n      [15, 24, 25, 20, 7],\n      [14, 23, 22, 21, 8],\n      [13, 12, 11, 10, 9],\n    ]\n    const actual = ofSize(5)\n    expect(expected).toEqual(actual)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/spiral-matrix/spiral-matrix.ts",
    "content": "export function ofSize() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/spiral-matrix/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/spiral-matrix/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/split-second-stopwatch/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to build a stopwatch to keep precise track of lap times.\n\nThe stopwatch uses four commands (start, stop, lap, and reset) to keep track of:\n\n1. The current lap's tracked time\n2. Previously recorded lap times\n\nWhat commands can be used depends on which state the stopwatch is in:\n\n1. Ready: initial state\n2. Running: tracking time\n3. Stopped: not tracking time\n\n| Command | Begin state | End state | Effect                                                   |\n| ------- | ----------- | --------- | -------------------------------------------------------- |\n| Start   | Ready       | Running   | Start tracking time                                      |\n| Start   | Stopped     | Running   | Resume tracking time                                     |\n| Stop    | Running     | Stopped   | Stop tracking time                                       |\n| Lap     | Running     | Running   | Add current lap to previous laps, then reset current lap |\n| Reset   | Stopped     | Ready     | Reset current lap and clear previous laps                |\n"
  },
  {
    "path": "exercises/practice/split-second-stopwatch/.docs/introduction.md",
    "content": "# Introduction\n\nYou've always run for the thrill of it — no schedules, no timers, just the sound of your feet on the pavement.\nBut now that you've joined a competitive running crew, things are getting serious.\nTraining sessions are timed to the second, and every split second counts.\nTo keep pace, you've picked up the _Split-Second Stopwatch_ — a sleek, high-tech gadget that's about to become your new best friend.\n"
  },
  {
    "path": "exercises/practice/split-second-stopwatch/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"BNAndras\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"split-second-stopwatch.ts\"\n    ],\n    \"test\": [\n      \"split-second-stopwatch.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Keep track of time through a digital stopwatch.\",\n  \"source\": \"Erik Schierboom\",\n  \"source_url\": \"https://github.com/exercism/problem-specifications/pull/2547\"\n}\n"
  },
  {
    "path": "exercises/practice/split-second-stopwatch/.meta/proof.ci.ts",
    "content": "export type State = 'ready' | 'running' | 'stopped'\n\nexport class SplitSecondStopwatch {\n  private _state: State = 'ready'\n  private totalSeconds = 0\n  private currentLapSeconds = 0\n  private previousLapSeconds: number[] = []\n\n  public get state(): State {\n    return this._state\n  }\n\n  public get currentLap(): string {\n    return this.formatTime(this.currentLapSeconds)\n  }\n\n  public get total(): string {\n    return this.formatTime(this.totalSeconds)\n  }\n\n  public get previousLaps(): string[] {\n    return this.previousLapSeconds.map((s) => this.formatTime(s))\n  }\n\n  public start(): void {\n    if (this._state === 'running') {\n      throw new Error('cannot start an already running stopwatch')\n    }\n    this._state = 'running'\n  }\n\n  public stop(): void {\n    if (this._state !== 'running') {\n      throw new Error('cannot stop a stopwatch that is not running')\n    }\n    this._state = 'stopped'\n  }\n\n  public lap(): void {\n    if (this._state !== 'running') {\n      throw new Error('cannot lap a stopwatch that is not running')\n    }\n    this.previousLapSeconds.push(this.currentLapSeconds)\n    this.currentLapSeconds = 0\n  }\n\n  public reset(): void {\n    if (this._state !== 'stopped') {\n      throw new Error('cannot reset a stopwatch that is not stopped')\n    }\n    this._state = 'ready'\n    this.totalSeconds = 0\n    this.currentLapSeconds = 0\n    this.previousLapSeconds = []\n  }\n\n  public advanceTime(duration: string): void {\n    if (this._state === 'running') {\n      const seconds = this.toSeconds(duration)\n      this.currentLapSeconds += seconds\n      this.totalSeconds += seconds\n    }\n  }\n\n  private toSeconds(duration: string): number {\n    const [h, m, s] = duration.split(':').map(Number)\n    return h * 3600 + m * 60 + s\n  }\n\n  private formatTime(seconds: number): string {\n    const h = Math.floor(seconds / 3600)\n    const m = Math.floor((seconds % 3600) / 60)\n    const s = seconds % 60\n\n    return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`\n  }\n}\n"
  },
  {
    "path": "exercises/practice/split-second-stopwatch/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[ddb238ea-99d4-4eaa-a81d-3c917a525a23]\ndescription = \"new stopwatch starts in ready state\"\n\n[b19635d4-08ad-4ac3-b87f-aca10e844071]\ndescription = \"new stopwatch's current lap has no elapsed time\"\n\n[492eb532-268d-43ea-8a19-2a032067d335]\ndescription = \"new stopwatch's total has no elapsed time\"\n\n[8a892c1e-9ef7-4690-894e-e155a1fe4484]\ndescription = \"new stopwatch does not have previous laps\"\n\n[5b2705b6-a584-4042-ba3a-4ab8d0ab0281]\ndescription = \"start from ready state changes state to running\"\n\n[748235ce-1109-440b-9898-0a431ea179b6]\ndescription = \"start does not change previous laps\"\n\n[491487b1-593d-423e-a075-aa78d449ff1f]\ndescription = \"start initiates time tracking for current lap\"\n\n[a0a7ba2c-8db6-412c-b1b6-cb890e9b72ed]\ndescription = \"start initiates time tracking for total\"\n\n[7f558a17-ef6d-4a5b-803a-f313af7c41d3]\ndescription = \"start cannot be called from running state\"\n\n[32466eef-b2be-4d60-a927-e24fce52dab9]\ndescription = \"stop from running state changes state to stopped\"\n\n[621eac4c-8f43-4d99-919c-4cad776d93df]\ndescription = \"stop pauses time tracking for current lap\"\n\n[465bcc82-7643-41f2-97ff-5e817cef8db4]\ndescription = \"stop pauses time tracking for total\"\n\n[b1ba7454-d627-41ee-a078-891b2ed266fc]\ndescription = \"stop cannot be called from ready state\"\n\n[5c041078-0898-44dc-9d5b-8ebb5352626c]\ndescription = \"stop cannot be called from stopped state\"\n\n[3f32171d-8fbf-46b6-bc2b-0810e1ec53b7]\ndescription = \"start from stopped state changes state to running\"\n\n[626997cb-78d5-4fe8-b501-29fdef804799]\ndescription = \"start from stopped state resumes time tracking for current lap\"\n\n[58487c53-ab26-471c-a171-807ef6363319]\ndescription = \"start from stopped state resumes time tracking for total\"\n\n[091966e3-ed25-4397-908b-8bb0330118f8]\ndescription = \"lap adds current lap to previous laps\"\n\n[1aa4c5ee-a7d5-4d59-9679-419deef3c88f]\ndescription = \"lap resets current lap and resumes time tracking\"\n\n[4b46b92e-1b3f-46f6-97d2-0082caf56e80]\ndescription = \"lap continues time tracking for total\"\n\n[ea75d36e-63eb-4f34-97ce-8c70e620bdba]\ndescription = \"lap cannot be called from ready state\"\n\n[63731154-a23a-412d-a13f-c562f208eb1e]\ndescription = \"lap cannot be called from stopped state\"\n\n[e585ee15-3b3f-4785-976b-dd96e7cc978b]\ndescription = \"stop does not change previous laps\"\n\n[fc3645e2-86cf-4d11-97c6-489f031103f6]\ndescription = \"reset from stopped state changes state to ready\"\n\n[20fbfbf7-68ad-4310-975a-f5f132886c4e]\ndescription = \"reset resets current lap\"\n\n[00a8f7bb-dd5c-43e5-8705-3ef124007662]\ndescription = \"reset clears previous laps\"\n\n[76cea936-6214-4e95-b6d1-4d4edcf90499]\ndescription = \"reset cannot be called from ready state\"\n\n[ba4d8e69-f200-4721-b59e-90d8cf615153]\ndescription = \"reset cannot be called from running state\"\n\n[0b01751a-cb57-493f-bb86-409de6e84306]\ndescription = \"supports very long laps\"\n"
  },
  {
    "path": "exercises/practice/split-second-stopwatch/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/split-second-stopwatch/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/split-second-stopwatch/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/split-second-stopwatch/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/split-second-stopwatch/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/split-second-stopwatch/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/split-second-stopwatch/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-split-second-stopwatch\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/split-second-stopwatch/split-second-stopwatch.test.ts",
    "content": "import { describe, expect, it, xit } from '@jest/globals'\nimport { SplitSecondStopwatch } from './split-second-stopwatch.ts'\n\ndescribe('SplitSecondStopwatch', () => {\n  it('new stopwatch starts in ready state', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    expect(stopwatch.state).toBe('ready')\n  })\n\n  xit(\"new stopwatch's current lap has no elapsed time\", () => {\n    const stopwatch = new SplitSecondStopwatch()\n    expect(stopwatch.currentLap).toBe('00:00:00')\n  })\n\n  xit(\"new stopwatch's total has no elapsed time\", () => {\n    const stopwatch = new SplitSecondStopwatch()\n    expect(stopwatch.total).toBe('00:00:00')\n  })\n\n  xit('new stopwatch does not have previous laps', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    expect(stopwatch.previousLaps).toEqual([])\n  })\n\n  xit('start from ready state changes state to running', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    stopwatch.start()\n    expect(stopwatch.state).toBe('running')\n  })\n\n  xit('start does not change previous laps', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    stopwatch.start()\n    expect(stopwatch.previousLaps).toEqual([])\n  })\n\n  xit('start initiates time tracking for current lap', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    stopwatch.start()\n    stopwatch.advanceTime('00:00:05')\n    expect(stopwatch.currentLap).toBe('00:00:05')\n  })\n\n  xit('start initiates time tracking for total', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    stopwatch.start()\n    stopwatch.advanceTime('00:00:23')\n    expect(stopwatch.total).toBe('00:00:23')\n  })\n\n  xit('start cannot be called from running state', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    stopwatch.start()\n    expect(() => stopwatch.start()).toThrow(\n      'cannot start an already running stopwatch'\n    )\n  })\n\n  xit('stop from running state changes state to stopped', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    stopwatch.start()\n    stopwatch.stop()\n    expect(stopwatch.state).toBe('stopped')\n  })\n\n  xit('stop pauses time tracking for current lap', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    stopwatch.start()\n    stopwatch.advanceTime('00:00:05')\n    stopwatch.stop()\n    stopwatch.advanceTime('00:00:08')\n    expect(stopwatch.currentLap).toBe('00:00:05')\n  })\n\n  xit('stop pauses time tracking for total', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    stopwatch.start()\n    stopwatch.advanceTime('00:00:13')\n    stopwatch.stop()\n    stopwatch.advanceTime('00:00:44')\n    expect(stopwatch.total).toBe('00:00:13')\n  })\n\n  xit('stop cannot be called from ready state', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    expect(() => stopwatch.stop()).toThrow(\n      'cannot stop a stopwatch that is not running'\n    )\n  })\n\n  xit('stop cannot be called from stopped state', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    stopwatch.start()\n    stopwatch.stop()\n    expect(() => stopwatch.stop()).toThrow(\n      'cannot stop a stopwatch that is not running'\n    )\n  })\n\n  xit('start from stopped state changes state to running', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    stopwatch.start()\n    stopwatch.stop()\n    stopwatch.start()\n    expect(stopwatch.state).toBe('running')\n  })\n\n  xit('start from stopped state resumes time tracking for current lap', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    stopwatch.start()\n    stopwatch.advanceTime('00:01:20')\n    stopwatch.stop()\n    stopwatch.advanceTime('00:00:20')\n    stopwatch.start()\n    stopwatch.advanceTime('00:00:08')\n    expect(stopwatch.currentLap).toBe('00:01:28')\n  })\n\n  xit('start from stopped state resumes time tracking for total', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    stopwatch.start()\n    stopwatch.advanceTime('00:00:23')\n    stopwatch.stop()\n    stopwatch.advanceTime('00:00:44')\n    stopwatch.start()\n    stopwatch.advanceTime('00:00:09')\n    expect(stopwatch.total).toBe('00:00:32')\n  })\n\n  xit('lap adds current lap to previous laps', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    stopwatch.start()\n    stopwatch.advanceTime('00:01:38')\n    stopwatch.lap()\n    expect(stopwatch.previousLaps).toEqual(['00:01:38'])\n    stopwatch.advanceTime('00:00:44')\n    stopwatch.lap()\n    expect(stopwatch.previousLaps).toEqual(['00:01:38', '00:00:44'])\n  })\n\n  xit('lap resets current lap and resumes time tracking', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    stopwatch.start()\n    stopwatch.advanceTime('00:08:22')\n    stopwatch.lap()\n    expect(stopwatch.currentLap).toBe('00:00:00')\n    stopwatch.advanceTime('00:00:15')\n    expect(stopwatch.currentLap).toBe('00:00:15')\n  })\n\n  xit('lap continues time tracking for total', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    stopwatch.start()\n    stopwatch.advanceTime('00:00:22')\n    stopwatch.lap()\n    stopwatch.advanceTime('00:00:33')\n    expect(stopwatch.total).toBe('00:00:55')\n  })\n\n  xit('lap cannot be called from ready state', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    expect(() => stopwatch.lap()).toThrow(\n      'cannot lap a stopwatch that is not running'\n    )\n  })\n\n  xit('lap cannot be called from stopped state', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    stopwatch.start()\n    stopwatch.stop()\n    expect(() => stopwatch.lap()).toThrow(\n      'cannot lap a stopwatch that is not running'\n    )\n  })\n\n  xit('stop does not change previous laps', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    stopwatch.start()\n    stopwatch.advanceTime('00:11:22')\n    stopwatch.lap()\n    expect(stopwatch.previousLaps).toEqual(['00:11:22'])\n    stopwatch.stop()\n    expect(stopwatch.previousLaps).toEqual(['00:11:22'])\n  })\n\n  xit('reset from stopped state changes state to ready', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    stopwatch.start()\n    stopwatch.stop()\n    stopwatch.reset()\n    expect(stopwatch.state).toBe('ready')\n  })\n\n  xit('reset resets current lap', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    stopwatch.start()\n    stopwatch.advanceTime('00:00:10')\n    stopwatch.stop()\n    stopwatch.reset()\n    expect(stopwatch.currentLap).toBe('00:00:00')\n  })\n\n  xit('reset clears previous laps', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    stopwatch.start()\n    stopwatch.advanceTime('00:00:10')\n    stopwatch.lap()\n    stopwatch.advanceTime('00:00:20')\n    stopwatch.lap()\n    expect(stopwatch.previousLaps).toEqual(['00:00:10', '00:00:20'])\n    stopwatch.stop()\n    stopwatch.reset()\n    expect(stopwatch.previousLaps).toEqual([])\n  })\n\n  xit('reset cannot be called from ready state', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    expect(() => stopwatch.reset()).toThrow(\n      'cannot reset a stopwatch that is not stopped'\n    )\n  })\n\n  xit('reset cannot be called from running state', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    stopwatch.start()\n    expect(() => stopwatch.reset()).toThrow(\n      'cannot reset a stopwatch that is not stopped'\n    )\n  })\n\n  xit('supports very long laps', () => {\n    const stopwatch = new SplitSecondStopwatch()\n    stopwatch.start()\n    stopwatch.advanceTime('01:23:45')\n    expect(stopwatch.currentLap).toBe('01:23:45')\n    stopwatch.lap()\n    expect(stopwatch.previousLaps).toEqual(['01:23:45'])\n    stopwatch.advanceTime('04:01:40')\n    expect(stopwatch.currentLap).toBe('04:01:40')\n    expect(stopwatch.total).toBe('05:25:25')\n    stopwatch.lap()\n    expect(stopwatch.previousLaps).toEqual(['01:23:45', '04:01:40'])\n    stopwatch.advanceTime('08:43:05')\n    expect(stopwatch.currentLap).toBe('08:43:05')\n    expect(stopwatch.total).toBe('14:08:30')\n    stopwatch.lap()\n    expect(stopwatch.previousLaps).toEqual(['01:23:45', '04:01:40', '08:43:05'])\n  })\n})\n"
  },
  {
    "path": "exercises/practice/split-second-stopwatch/split-second-stopwatch.ts",
    "content": "export class SplitSecondStopwatch {\n  constructor() {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public get state(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public get currentLap(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public get total(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public get previousLaps(): unknown[] {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public start(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public stop(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public lap(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public reset(): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public advanceTime(duration: unknown): unknown {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/split-second-stopwatch/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/split-second-stopwatch/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/square-root/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to calculate the square root of a given number.\n\n- Try to avoid using the pre-existing math libraries of your language.\n- As input you'll be given a positive whole number, i.e. 1, 2, 3, 4…\n- You are only required to handle cases where the result is a positive whole number.\n\nSome potential approaches:\n\n- Linear or binary search for a number that gives the input number when squared.\n- Successive approximation using Newton's or Heron's method.\n- Calculating one digit at a time or one bit at a time.\n\nYou can check out the Wikipedia pages on [integer square root][integer-square-root] and [methods of computing square roots][computing-square-roots] to help with choosing a method of calculation.\n\n[integer-square-root]: https://en.wikipedia.org/wiki/Integer_square_root\n[computing-square-roots]: https://en.wikipedia.org/wiki/Methods_of_computing_square_roots\n"
  },
  {
    "path": "exercises/practice/square-root/.docs/introduction.md",
    "content": "# Introduction\n\nWe are launching a deep space exploration rocket and we need a way to make sure the navigation system stays on target.\n\nAs the first step in our calculation, we take a target number and find its square root (that is, the number that when multiplied by itself equals the target number).\n\nThe journey will be very long.\nTo make the batteries last as long as possible, we had to make our rocket's onboard computer very power efficient.\nUnfortunately that means that we can't rely on fancy math libraries and functions, as they use more power.\nInstead we want to implement our own square root calculation.\n"
  },
  {
    "path": "exercises/practice/square-root/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"BNAndras\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"square-root.ts\"\n    ],\n    \"test\": [\n      \"square-root.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given a natural radicand, return its square root.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"wolf99\",\n  \"source_url\": \"https://github.com/exercism/problem-specifications/pull/1582\"\n}\n"
  },
  {
    "path": "exercises/practice/square-root/.meta/proof.ci.ts",
    "content": "export function squareRoot(radicand: number): number {\n  if (radicand === 1) {\n    return 1\n  }\n\n  let guess = Math.floor(radicand / 2)\n  for (let i = 0; i < 10; i++) {\n    guess = Math.floor((guess + radicand / guess) / 2)\n  }\n\n  return guess\n}\n"
  },
  {
    "path": "exercises/practice/square-root/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[9b748478-7b0a-490c-b87a-609dacf631fd]\ndescription = \"root of 1\"\n\n[7d3aa9ba-9ac6-4e93-a18b-2e8b477139bb]\ndescription = \"root of 4\"\n\n[6624aabf-3659-4ae0-a1c8-25ae7f33c6ef]\ndescription = \"root of 25\"\n\n[93beac69-265e-4429-abb1-94506b431f81]\ndescription = \"root of 81\"\n\n[fbddfeda-8c4f-4bc4-87ca-6991af35360e]\ndescription = \"root of 196\"\n\n[c03d0532-8368-4734-a8e0-f96a9eb7fc1d]\ndescription = \"root of 65025\"\n"
  },
  {
    "path": "exercises/practice/square-root/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/square-root/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/square-root/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/square-root/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/square-root/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/square-root/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/square-root/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-square-root\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/square-root/square-root.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { squareRoot } from './square-root.ts'\n\ndescribe('Square Root', () => {\n  // Root of 1\n  it('root of 1', () => {\n    expect(squareRoot(1)).toEqual(1)\n  })\n\n  // Root of 4\n  xit('root of 4', () => {\n    expect(squareRoot(4)).toEqual(2)\n  })\n\n  // Root of 25\n  xit('root of 25', () => {\n    expect(squareRoot(25)).toEqual(5)\n  })\n\n  // Root of 81\n  xit('root of 81', () => {\n    expect(squareRoot(81)).toEqual(9)\n  })\n\n  // Root of 196\n  xit('root of 196', () => {\n    expect(squareRoot(196)).toEqual(14)\n  })\n\n  // Root of 65025\n  xit('root of 65025', () => {\n    expect(squareRoot(65025)).toEqual(255)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/square-root/square-root.ts",
    "content": "export function squareRoot(radicand: unknown): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/square-root/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/square-root/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/state-of-tic-tac-toe/.docs/instructions.md",
    "content": "# Instructions\n\nIn this exercise, you're going to implement a program that determines the state of a [tic-tac-toe][] game.\n(_You may also know the game as \"noughts and crosses\" or \"Xs and Os\"._)\n\nThe game is played on a 3×3 grid.\nPlayers take turns to place `X`s and `O`s on the grid.\nThe game ends when one player has won by placing three of marks in a row, column, or along a diagonal of the grid, or when the entire grid is filled up.\n\nIn this exercise, we will assume that `X` starts.\n\nIt's your job to determine which state a given game is in.\n\nThere are 3 potential game states:\n\n- The game is **ongoing**.\n- The game ended in a **draw**.\n- The game ended in a **win**.\n\nIf the given board is invalid, throw an appropriate error.\n\nIf a board meets the following conditions, it is invalid:\n\n- The given board cannot be reached when turns are taken in the correct order (remember that `X` starts).\n- The game was played after it already ended.\n\n## Examples\n\n### Ongoing game\n\n```text\n   |   |\n X |   |\n___|___|___\n   |   |\n   | X | O\n___|___|___\n   |   |\n O | X |\n   |   |\n```\n\n### Draw\n\n```text\n   |   |\n X | O | X\n___|___|___\n   |   |\n X | X | O\n___|___|___\n   |   |\n O | X | O\n   |   |\n```\n\n### Win\n\n```text\n   |   |\n X | X | X\n___|___|___\n   |   |\n   | O | O\n___|___|___\n   |   |\n   |   |\n   |   |\n```\n\n### Invalid\n\n#### Wrong turn order\n\n```text\n   |   |\n O | O | X\n___|___|___\n   |   |\n   |   |\n___|___|___\n   |   |\n   |   |\n   |   |\n```\n\n#### Continued playing after win\n\n```text\n   |   |\n X | X | X\n___|___|___\n   |   |\n O | O | O\n___|___|___\n   |   |\n   |   |\n   |   |\n```\n\n[tic-tac-toe]: https://en.wikipedia.org/wiki/Tic-tac-toe\n"
  },
  {
    "path": "exercises/practice/state-of-tic-tac-toe/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"Cool-Katt\"\n  ],\n  \"contributors\": [\n    \"BNAndras\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"state-of-tic-tac-toe.ts\"\n    ],\n    \"test\": [\n      \"state-of-tic-tac-toe.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Determine the game state of a match of Tic-Tac-Toe.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Created by Sascha Mann for the Julia track of the Exercism Research Experiment.\",\n  \"source_url\": \"https://github.com/exercism/research_experiment_1/tree/julia-dev/exercises/julia-1-a\"\n}\n"
  },
  {
    "path": "exercises/practice/state-of-tic-tac-toe/.meta/proof.ci.ts",
    "content": "export const gamestate = (board: string[]): string => {\n  const gridSize = board.length\n  const numberOfX = (board.join('').match(/X/g) || []).length\n  const numberOfO = (board.join('').match(/O/g) || []).length\n  const scoringArray = Array(gridSize * 2 + 2).fill(0)\n\n  const boardAsNumbers = board.flatMap((row) =>\n    row.split('').map((element) => {\n      if (element === 'X') return 1\n      if (element === 'O') return -1\n      return 0\n    })\n  )\n\n  boardAsNumbers.forEach((element, index) => {\n    const row = Math.floor(index / gridSize)\n    const col = index % gridSize\n\n    scoringArray[row] += element\n    scoringArray[gridSize + col] += element\n    if (row === col) {\n      scoringArray[2 * gridSize] += element\n    }\n    if (gridSize - 1 - col === row) {\n      scoringArray[2 * gridSize + 1] += element\n    }\n  })\n\n  if (numberOfX - numberOfO > 1) {\n    throw new Error('Wrong turn order: X went twice')\n  }\n  if (numberOfX - numberOfO < 0) {\n    throw new Error('Wrong turn order: O started')\n  }\n\n  const xWins = scoringArray.some((score) => score === gridSize)\n  const oWins = scoringArray.some((score) => score === -gridSize)\n\n  if (xWins && oWins) {\n    throw new Error(\n      'Impossible board: game should have ended after the game was won'\n    )\n  }\n  if (xWins || oWins) {\n    return 'win'\n  }\n  if (boardAsNumbers.includes(0)) {\n    return 'ongoing'\n  }\n  return 'draw'\n}\n"
  },
  {
    "path": "exercises/practice/state-of-tic-tac-toe/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[fe8e9fa9-37af-4d7e-aa24-2f4b8517161a]\ndescription = \"Won games -> Finished game where X won via left column victory\"\n\n[96c30df5-ae23-4cf6-bf09-5ef056dddea1]\ndescription = \"Won games -> Finished game where X won via middle column victory\"\n\n[0d7a4b0a-2afd-4a75-8389-5fb88ab05eda]\ndescription = \"Won games -> Finished game where X won via right column victory\"\n\n[bd1007c0-ec5d-4c60-bb9f-1a4f22177d51]\ndescription = \"Won games -> Finished game where O won via left column victory\"\n\n[c032f800-5735-4354-b1b9-46f14d4ee955]\ndescription = \"Won games -> Finished game where O won via middle column victory\"\n\n[662c8902-c94a-4c4c-9d9c-e8ca513db2b4]\ndescription = \"Won games -> Finished game where O won via right column victory\"\n\n[2d62121f-7e3a-44a0-9032-0d73e3494941]\ndescription = \"Won games -> Finished game where X won via top row victory\"\n\n[108a5e82-cc61-409f-aece-d7a18c1beceb]\ndescription = \"Won games -> Finished game where X won via middle row victory\"\ninclude = false\n\n[346527db-4db9-4a96-b262-d7023dc022b0]\ndescription = \"Won games -> Finished game where X won via middle row victory\"\nreimplements = \"108a5e82-cc61-409f-aece-d7a18c1beceb\"\n\n[a013c583-75f8-4ab2-8d68-57688ff04574]\ndescription = \"Won games -> Finished game where X won via bottom row victory\"\n\n[2c08e7d7-7d00-487f-9442-e7398c8f1727]\ndescription = \"Won games -> Finished game where O won via top row victory\"\n\n[bb1d6c62-3e3f-4d1a-9766-f8803c8ed70f]\ndescription = \"Won games -> Finished game where O won via middle row victory\"\n\n[6ef641e9-12ec-44f5-a21c-660ea93907af]\ndescription = \"Won games -> Finished game where O won via bottom row victory\"\n\n[ab145b7b-26a7-426c-ab71-bf418cd07f81]\ndescription = \"Won games -> Finished game where X won via falling diagonal victory\"\n\n[7450caab-08f5-4f03-a74b-99b98c4b7a4b]\ndescription = \"Won games -> Finished game where X won via rising diagonal victory\"\n\n[c2a652ee-2f93-48aa-a710-a70cd2edce61]\ndescription = \"Won games -> Finished game where O won via falling diagonal victory\"\n\n[5b20ceea-494d-4f0c-a986-b99efc163bcf]\ndescription = \"Won games -> Finished game where O won via rising diagonal victory\"\n\n[035a49b9-dc35-47d3-9d7c-de197161b9d4]\ndescription = \"Won games -> Finished game where X won via a row and a column victory\"\n\n[e5dfdeb0-d2bf-4b5a-b307-e673f69d4a53]\ndescription = \"Won games -> Finished game where X won via two diagonal victories\"\n\n[b42ed767-194c-4364-b36e-efbfb3de8788]\ndescription = \"Drawn games -> Draw\"\n\n[227a76b2-0fef-4e16-a4bd-8f9d7e4c3b13]\ndescription = \"Drawn games -> Another draw\"\n\n[4d93f15c-0c40-43d6-b966-418b040012a9]\ndescription = \"Ongoing games -> Ongoing game: one move in\"\n\n[c407ae32-4c44-4989-b124-2890cf531f19]\ndescription = \"Ongoing games -> Ongoing game: two moves in\"\n\n[199b7a8d-e2b6-4526-a85e-78b416e7a8a9]\ndescription = \"Ongoing games -> Ongoing game: five moves in\"\n\n[1670145b-1e3d-4269-a7eb-53cd327b302e]\ndescription = \"Invalid boards -> Invalid board: X went twice\"\n\n[47c048e8-b404-4bcf-9e51-8acbb3253f3b]\ndescription = \"Invalid boards -> Invalid board: O started\"\n\n[b1dc8b13-46c4-47db-a96d-aa90eedc4e8d]\ndescription = \"Invalid boards -> Invalid board\"\ninclude = false\n\n[6c1920f2-ab5c-4648-a0c9-997414dda5eb]\ndescription = \"Invalid boards -> Invalid board: X won and O kept playing\"\nreimplements = \"b1dc8b13-46c4-47db-a96d-aa90eedc4e8d\"\n\n[4801cda2-f5b7-4c36-8317-3cdd167ac22c]\ndescription = \"Invalid boards -> Invalid board: players kept playing after a win\"\n"
  },
  {
    "path": "exercises/practice/state-of-tic-tac-toe/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/state-of-tic-tac-toe/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/state-of-tic-tac-toe/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/state-of-tic-tac-toe/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/state-of-tic-tac-toe/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/state-of-tic-tac-toe/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/state-of-tic-tac-toe/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-state-of-tic-tac-toe\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/state-of-tic-tac-toe/state-of-tic-tac-toe.test.ts",
    "content": "import { describe, expect, it, xit } from '@jest/globals'\nimport { gamestate } from './state-of-tic-tac-toe.ts'\n\ndescribe('state-of-tic-tac-toe', () => {\n  describe('Won games', () => {\n    it('Finished game where X won via left column victory', () => {\n      const board = ['XOO', 'X  ', 'X  ']\n      expect(gamestate(board)).toEqual('win')\n    })\n\n    xit('Finished game where X won via middle column victory', () => {\n      const board = ['OXO', ' X ', ' X ']\n      expect(gamestate(board)).toEqual('win')\n    })\n\n    xit('Finished game where X won via right column victory', () => {\n      const board = ['OOX', '  X', '  X']\n      expect(gamestate(board)).toEqual('win')\n    })\n\n    xit('Finished game where O won via left column victory', () => {\n      const board = ['OXX', 'OX ', 'O  ']\n      expect(gamestate(board)).toEqual('win')\n    })\n\n    xit('Finished game where O won via middle column victory', () => {\n      const board = ['XOX', ' OX', ' O ']\n      expect(gamestate(board)).toEqual('win')\n    })\n\n    xit('Finished game where O won via right column victory', () => {\n      const board = ['XXO', ' XO', '  O']\n      expect(gamestate(board)).toEqual('win')\n    })\n\n    xit('Finished game where X won via top row victory', () => {\n      const board = ['XXX', 'XOO', 'O  ']\n      expect(gamestate(board)).toEqual('win')\n    })\n\n    xit('Finished game where X won via middle row victory', () => {\n      const board = ['O  ', 'XXX', ' O ']\n      expect(gamestate(board)).toEqual('win')\n    })\n\n    xit('Finished game where X won via bottom row victory', () => {\n      const board = [' OO', 'O X', 'XXX']\n      expect(gamestate(board)).toEqual('win')\n    })\n\n    xit('Finished game where O won via top row victory', () => {\n      const board = ['OOO', 'XXO', 'XX ']\n      expect(gamestate(board)).toEqual('win')\n    })\n\n    xit('Finished game where O won via middle row victory', () => {\n      const board = ['XX ', 'OOO', 'X  ']\n      expect(gamestate(board)).toEqual('win')\n    })\n\n    xit('Finished game where O won via bottom row victory', () => {\n      const board = ['XOX', ' XX', 'OOO']\n      expect(gamestate(board)).toEqual('win')\n    })\n\n    xit('Finished game where X won via falling diagonal victory', () => {\n      const board = ['XOO', ' X ', '  X']\n      expect(gamestate(board)).toEqual('win')\n    })\n\n    xit('Finished game where X won via rising diagonal victory', () => {\n      const board = ['O X', 'OX ', 'X  ']\n      expect(gamestate(board)).toEqual('win')\n    })\n\n    xit('Finished game where O won via falling diagonal victory', () => {\n      const board = ['OXX', 'OOX', 'X O']\n      expect(gamestate(board)).toEqual('win')\n    })\n\n    xit('Finished game where O won via rising diagonal victory', () => {\n      const board = ['  O', ' OX', 'OXX']\n      expect(gamestate(board)).toEqual('win')\n    })\n\n    xit('Finished game where X won via a row and a column victory', () => {\n      const board = ['XXX', 'XOO', 'XOO']\n      expect(gamestate(board)).toEqual('win')\n    })\n\n    xit('Finished game where X won via two diagonal victories', () => {\n      const board = ['XOX', 'OXO', 'XOX']\n      expect(gamestate(board)).toEqual('win')\n    })\n  })\n\n  describe('Draw games', () => {\n    xit('Draw', () => {\n      const board = ['XOX', 'XXO', 'OXO']\n      expect(gamestate(board)).toEqual('draw')\n    })\n\n    xit('Another draw', () => {\n      const board = ['XXO', 'OXX', 'XOO']\n      expect(gamestate(board)).toEqual('draw')\n    })\n  })\n\n  describe('Ongoing games', () => {\n    xit('Ongoing game: one move in', () => {\n      const board = ['   ', 'X  ', '   ']\n      expect(gamestate(board)).toEqual('ongoing')\n    })\n\n    xit('Ongoing game: two moves in', () => {\n      const board = ['O  ', ' X ', '   ']\n      expect(gamestate(board)).toEqual('ongoing')\n    })\n\n    xit('Ongoing game: five moves in', () => {\n      const board = ['X  ', ' XO', 'OX ']\n      expect(gamestate(board)).toEqual('ongoing')\n    })\n  })\n\n  describe('Invalid boards', () => {\n    xit('Invalid board: X went twice', () => {\n      const board = ['XX ', '   ', '   ']\n      expect(() => {\n        gamestate(board)\n      }).toThrow('Wrong turn order: X went twice')\n    })\n\n    xit('Invalid board: O started', () => {\n      const board = ['OOX', '   ', '   ']\n      expect(() => {\n        gamestate(board)\n      }).toThrow('Wrong turn order: O started')\n    })\n\n    xit('Invalid board: X won and O kept playing', () => {\n      const board = ['XXX', 'OOO', '   ']\n      expect(() => {\n        gamestate(board)\n      }).toThrow(\n        'Impossible board: game should have ended after the game was won'\n      )\n    })\n\n    xit('Invalid board: players kept playing after a win', () => {\n      const board = ['XXX', 'OOO', 'XOX']\n      expect(() => {\n        gamestate(board)\n      }).toThrow(\n        'Impossible board: game should have ended after the game was won'\n      )\n    })\n  })\n})\n"
  },
  {
    "path": "exercises/practice/state-of-tic-tac-toe/state-of-tic-tac-toe.ts",
    "content": "export const gamestate = (board: unknown): unknown => {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/state-of-tic-tac-toe/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/state-of-tic-tac-toe/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/strain/.docs/instructions.md",
    "content": "# Instructions\n\nImplement the `keep` and `discard` operation on collections.\nGiven a collection and a predicate on the collection's elements, `keep` returns a new collection containing those elements where the predicate is true, while `discard` returns a new collection containing those elements where the predicate is false.\n\nFor example, given the collection of numbers:\n\n- 1, 2, 3, 4, 5\n\nAnd the predicate:\n\n- is the number even?\n\nThen your keep operation should produce:\n\n- 2, 4\n\nWhile your discard operation should produce:\n\n- 1, 3, 5\n\nNote that the union of keep and discard is all the elements.\n\nThe functions may be called `keep` and `discard`, or they may need different names in order to not clash with existing functions or concepts in your language.\n\n## Restrictions\n\nKeep your hands off that filter/reject/whatchamacallit functionality provided by your standard library!\nSolve this one yourself using other basic tools instead.\n"
  },
  {
    "path": "exercises/practice/strain/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"jspengeman\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"strain.ts\"\n    ],\n    \"test\": [\n      \"strain.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Implement the `keep` and `discard` operation on collections.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Conversation with James Edward Gray II\",\n  \"source_url\": \"http://graysoftinc.com/\"\n}\n"
  },
  {
    "path": "exercises/practice/strain/.meta/proof.ci.ts",
    "content": "interface Predicate<T> {\n  (element: T): boolean\n}\n\nexport function keep<T>(array: T[], predicate: Predicate<T>): T[] {\n  const output: T[] = []\n  array.forEach((el: T) => {\n    if (predicate(el)) {\n      output.push(el)\n    }\n  })\n  return output\n}\n\nexport function discard<T>(array: T[], predicate: Predicate<T>): T[] {\n  const output: T[] = []\n  array.forEach((el: T) => {\n    if (!predicate(el)) {\n      output.push(el)\n    }\n  })\n  return output\n}\n"
  },
  {
    "path": "exercises/practice/strain/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[26af8c32-ba6a-4eb3-aa0a-ebd8f136e003]\ndescription = \"keep on empty list returns empty list\"\n\n[f535cb4d-e99b-472a-bd52-9fa0ffccf454]\ndescription = \"keeps everything\"\n\n[950b8e8e-f628-42a8-85e2-9b30f09cde38]\ndescription = \"keeps nothing\"\n\n[92694259-6e76-470c-af87-156bdf75018a]\ndescription = \"keeps first and last\"\n\n[938f7867-bfc7-449e-a21b-7b00cbb56994]\ndescription = \"keeps neither first nor last\"\n\n[8908e351-4437-4d2b-a0f7-770811e48816]\ndescription = \"keeps strings\"\n\n[2728036b-102a-4f1e-a3ef-eac6160d876a]\ndescription = \"keeps lists\"\n\n[ef16beb9-8d84-451a-996a-14e80607fce6]\ndescription = \"discard on empty list returns empty list\"\n\n[2f42f9bc-8e06-4afe-a222-051b5d8cd12a]\ndescription = \"discards everything\"\n\n[ca990fdd-08c2-4f95-aa50-e0f5e1d6802b]\ndescription = \"discards nothing\"\n\n[71595dae-d283-48ca-a52b-45fa96819d2f]\ndescription = \"discards first and last\"\n\n[ae141f79-f86d-4567-b407-919eaca0f3dd]\ndescription = \"discards neither first nor last\"\n\n[daf25b36-a59f-4f29-bcfe-302eb4e43609]\ndescription = \"discards strings\"\n\n[a38d03f9-95ad-4459-80d1-48e937e4acaf]\ndescription = \"discards lists\"\n"
  },
  {
    "path": "exercises/practice/strain/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/strain/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/strain/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/strain/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/strain/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/strain/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/strain/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-strain\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/strain/strain.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { keep, discard } from './strain.ts'\n\ndescribe('strain', () => {\n  it('keeps on empty array returns empty array', () => {\n    const predicate = (_: number): boolean => true\n    expect(keep<number>([], predicate)).toEqual([])\n  })\n\n  xit('keeps everything', () => {\n    const predicate = (_: number): boolean => true\n    expect(keep<number>([1, 3, 5], predicate)).toEqual([1, 3, 5])\n  })\n\n  xit('keeps nothing', () => {\n    const predicate = (_: number): boolean => false\n    expect(keep<number>([1, 3, 5], predicate)).toEqual([])\n  })\n\n  xit('keeps first and last', () => {\n    const predicate = (e: number): boolean => e % 2 === 1\n    expect(keep<number>([1, 2, 3], predicate)).toEqual([1, 3])\n  })\n\n  xit('keeps neither first nor last', () => {\n    const predicate = (e: number): boolean => e % 2 === 0\n    expect(keep<number>([1, 2, 3], predicate)).toEqual([2])\n  })\n\n  xit('keeps strings', () => {\n    const words = ['apple', 'zebra', 'banana', 'zombies', 'cherimoya', 'zealot']\n    const predicate = (word: string): boolean => word.indexOf('z') === 0\n    const result = keep<string>(words, predicate)\n    expect(result).toEqual(['zebra', 'zombies', 'zealot'])\n  })\n\n  xit('keeps arrays', () => {\n    const rows = [\n      [1, 2, 3],\n      [5, 5, 5],\n      [5, 1, 2],\n      [2, 1, 2],\n      [1, 5, 2],\n      [2, 2, 1],\n      [1, 2, 5],\n    ]\n    const predicate = (row: number[]): boolean => row.indexOf(5) > -1\n    const result = keep<number[]>(rows, predicate)\n    expect(result).toEqual([\n      [5, 5, 5],\n      [5, 1, 2],\n      [1, 5, 2],\n      [1, 2, 5],\n    ])\n  })\n\n  xit('empty discard', () => {\n    const predicate = (_: number): boolean => true\n    expect(discard<number>([], predicate)).toEqual([])\n  })\n\n  xit('discards everything', () => {\n    const predicate = (_: number): boolean => true\n    expect(discard<number>([1, 3, 5], predicate)).toEqual([])\n  })\n\n  it('discards nothing', () => {\n    const predicate = (_: number): boolean => false\n    expect(discard<number>([1, 3, 5], predicate)).toEqual([1, 3, 5])\n  })\n\n  xit('discards first and last', () => {\n    const predicate = (e: number): boolean => e % 2 === 1\n    expect(discard<number>([1, 2, 3], predicate)).toEqual([2])\n  })\n\n  xit('discards neither first nor last', () => {\n    const predicate = (e: number): boolean => e % 2 === 0\n    const result = discard<number>([1, 2, 3], predicate)\n    expect(result).toEqual([1, 3])\n  })\n\n  xit('discards strings', () => {\n    const words = ['apple', 'zebra', 'banana', 'zombies', 'cherimoya', 'zealot']\n    const predicate = (word: string): boolean => word.indexOf('z') === 0\n    const result = discard<string>(words, predicate)\n    expect(result).toEqual(['apple', 'banana', 'cherimoya'])\n  })\n\n  xit('discards arrays', () => {\n    const rows = [\n      [1, 2, 3],\n      [5, 5, 5],\n      [5, 1, 2],\n      [2, 1, 2],\n      [1, 5, 2],\n      [2, 2, 1],\n      [1, 2, 5],\n    ]\n\n    const predicate = (row: number[]): boolean => row.indexOf(5) > -1\n    const result = discard<number[]>(rows, predicate)\n    expect(result).toEqual([\n      [1, 2, 3],\n      [2, 1, 2],\n      [2, 2, 1],\n    ])\n  })\n})\n"
  },
  {
    "path": "exercises/practice/strain/strain.ts",
    "content": "export function keep<T>() {\n  throw new Error('Remove this line and implement the function')\n}\n\nexport function discard<T>() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/strain/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/strain/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/sublist/.docs/instructions.md",
    "content": "# Instructions\n\nGiven any two lists `A` and `B`, determine if:\n\n- List `A` is equal to list `B`; or\n- List `A` contains list `B` (`A` is a superlist of `B`); or\n- List `A` is contained by list `B` (`A` is a sublist of `B`); or\n- None of the above is true, thus lists `A` and `B` are unequal\n\nSpecifically, list `A` is equal to list `B` if both lists have the same values in the same order.\nList `A` is a superlist of `B` if `A` contains a contiguous sub-sequence of values equal to `B`.\nList `A` is a sublist of `B` if `B` contains a contiguous sub-sequence of values equal to `A`.\n\nExamples:\n\n- If `A = []` and `B = []` (both lists are empty), then `A` and `B` are equal\n- If `A = [1, 2, 3]` and `B = []`, then `A` is a superlist of `B`\n- If `A = []` and `B = [1, 2, 3]`, then `A` is a sublist of `B`\n- If `A = [1, 2, 3]` and `B = [1, 2, 3, 4, 5]`, then `A` is a sublist of `B`\n- If `A = [3, 4, 5]` and `B = [1, 2, 3, 4, 5]`, then `A` is a sublist of `B`\n- If `A = [3, 4]` and `B = [1, 2, 3, 4, 5]`, then `A` is a sublist of `B`\n- If `A = [1, 2, 3]` and `B = [1, 2, 3]`, then `A` and `B` are equal\n- If `A = [1, 2, 3, 4, 5]` and `B = [2, 3, 4]`, then `A` is a superlist of `B`\n- If `A = [1, 2, 4]` and `B = [1, 2, 3, 4, 5]`, then `A` and `B` are unequal\n- If `A = [1, 2, 3]` and `B = [1, 3, 2]`, then `A` and `B` are unequal\n"
  },
  {
    "path": "exercises/practice/sublist/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"sublist.ts\"\n    ],\n    \"test\": [\n      \"sublist.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Write a function to determine if a list is a sublist of another list.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  }\n}\n"
  },
  {
    "path": "exercises/practice/sublist/.meta/proof.ci.ts",
    "content": "export class List {\n  private readonly list: number[]\n\n  constructor(...list: number[]) {\n    this.list = list\n  }\n\n  public compare(other: List): 'sublist' | 'superlist' | 'unequal' | 'equal' {\n    switch (this.lengthDiff(this, other)) {\n      case '-1':\n        return this.isSublist(other.list, this.list) ? 'sublist' : 'unequal'\n      case '0':\n        return this.isSublist(other.list, this.list) ? 'equal' : 'unequal'\n      case '1':\n        return this.isSublist(this.list, other.list) ? 'superlist' : 'unequal'\n    }\n\n    return 'unequal'\n  }\n\n  private lengthDiff(listOne: List, listTwo: List): string {\n    return String(Math.sign(listOne.list.length - listTwo.list.length))\n  }\n\n  private isSublist(listOne: number[], listTwo: number[]): boolean {\n    const join = (list: number[]): string => {\n      const joiner = ','\n      return list.join(joiner) + joiner\n    }\n\n    return Boolean(join(listOne).match(join(listTwo)))\n  }\n}\n"
  },
  {
    "path": "exercises/practice/sublist/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[97319c93-ebc5-47ab-a022-02a1980e1d29]\ndescription = \"empty lists\"\n\n[de27dbd4-df52-46fe-a336-30be58457382]\ndescription = \"empty list within non empty list\"\n\n[5487cfd1-bc7d-429f-ac6f-1177b857d4fb]\ndescription = \"non empty list contains empty list\"\n\n[1f390b47-f6b2-4a93-bc23-858ba5dda9a6]\ndescription = \"list equals itself\"\n\n[7ed2bfb2-922b-4363-ae75-f3a05e8274f5]\ndescription = \"different lists\"\n\n[3b8a2568-6144-4f06-b0a1-9d266b365341]\ndescription = \"false start\"\n\n[dc39ed58-6311-4814-be30-05a64bc8d9b1]\ndescription = \"consecutive\"\n\n[d1270dab-a1ce-41aa-b29d-b3257241ac26]\ndescription = \"sublist at start\"\n\n[81f3d3f7-4f25-4ada-bcdc-897c403de1b6]\ndescription = \"sublist in middle\"\n\n[43bcae1e-a9cf-470e-923e-0946e04d8fdd]\ndescription = \"sublist at end\"\n\n[76cf99ed-0ff0-4b00-94af-4dfb43fe5caa]\ndescription = \"at start of superlist\"\n\n[b83989ec-8bdf-4655-95aa-9f38f3e357fd]\ndescription = \"in middle of superlist\"\n\n[26f9f7c3-6cf6-4610-984a-662f71f8689b]\ndescription = \"at end of superlist\"\n\n[0a6db763-3588-416a-8f47-76b1cedde31e]\ndescription = \"first list missing element from second list\"\n\n[83ffe6d8-a445-4a3c-8795-1e51a95e65c3]\ndescription = \"second list missing element from first list\"\n\n[7bc76cb8-5003-49ca-bc47-cdfbe6c2bb89]\ndescription = \"first list missing additional digits from second list\"\n\n[0d7ee7c1-0347-45c8-9ef5-b88db152b30b]\ndescription = \"order matters to a list\"\n\n[5f47ce86-944e-40f9-9f31-6368aad70aa6]\ndescription = \"same digits but different numbers\"\n"
  },
  {
    "path": "exercises/practice/sublist/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/sublist/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/sublist/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/sublist/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/sublist/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/sublist/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/sublist/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-sublist\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/sublist/sublist.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { List } from './sublist.ts'\n\ndescribe('Sublist', () => {\n  it('empty lists', () => {\n    const listOne = new List()\n    const listTwo = new List()\n    const expected = 'equal'\n\n    expect(listOne.compare(listTwo)).toEqual(expected)\n  })\n\n  xit('empty list within non empty list', () => {\n    const listOne = new List()\n    const listTwo = new List(1, 2, 3)\n    const expected = 'sublist'\n\n    expect(listOne.compare(listTwo)).toEqual(expected)\n  })\n\n  xit('non empty list contains empty list', () => {\n    const listOne = new List(1, 2, 3)\n    const listTwo = new List()\n    const expected = 'superlist'\n\n    expect(listOne.compare(listTwo)).toEqual(expected)\n  })\n\n  xit('list equals itself', () => {\n    const listOne = new List(1, 2, 3)\n    const listTwo = new List(1, 2, 3)\n    const expected = 'equal'\n\n    expect(listOne.compare(listTwo)).toEqual(expected)\n  })\n\n  xit('different lists', () => {\n    const listOne = new List(1, 2, 3)\n    const listTwo = new List(2, 3, 4)\n    const expected = 'unequal'\n\n    expect(listOne.compare(listTwo)).toEqual(expected)\n  })\n\n  xit('false start', () => {\n    const listOne = new List(1, 2, 5)\n    const listTwo = new List(0, 1, 2, 3, 1, 2, 5, 6)\n    const expected = 'sublist'\n\n    expect(listOne.compare(listTwo)).toEqual(expected)\n  })\n\n  xit('consecutive', () => {\n    const listOne = new List(1, 1, 2)\n    const listTwo = new List(0, 1, 1, 1, 2, 1, 2)\n    const expected = 'sublist'\n\n    expect(listOne.compare(listTwo)).toEqual(expected)\n  })\n\n  xit('sublist at start', () => {\n    const listOne = new List(0, 1, 2)\n    const listTwo = new List(0, 1, 2, 3, 4, 5)\n    const expected = 'sublist'\n\n    expect(listOne.compare(listTwo)).toEqual(expected)\n  })\n\n  xit('sublist in middle', () => {\n    const listOne = new List(2, 3, 4)\n    const listTwo = new List(0, 1, 2, 3, 4, 5)\n    const expected = 'sublist'\n\n    expect(listOne.compare(listTwo)).toEqual(expected)\n  })\n\n  xit('sublist at end', () => {\n    const listOne = new List(3, 4, 5)\n    const listTwo = new List(0, 1, 2, 3, 4, 5)\n    const expected = 'sublist'\n\n    expect(listOne.compare(listTwo)).toEqual(expected)\n  })\n\n  xit('at start of superlist', () => {\n    const listOne = new List(0, 1, 2, 3, 4, 5)\n    const listTwo = new List(0, 1, 2)\n    const expected = 'superlist'\n\n    expect(listOne.compare(listTwo)).toEqual(expected)\n  })\n\n  xit('in middle of superlist', () => {\n    const listOne = new List(0, 1, 2, 3, 4, 5)\n    const listTwo = new List(2, 3)\n    const expected = 'superlist'\n\n    expect(listOne.compare(listTwo)).toEqual(expected)\n  })\n\n  xit('at end of superlist', () => {\n    const listOne = new List(0, 1, 2, 3, 4, 5)\n    const listTwo = new List(3, 4, 5)\n    const expected = 'superlist'\n\n    expect(listOne.compare(listTwo)).toEqual(expected)\n  })\n\n  xit('first list missing element from second list', () => {\n    const listOne = new List(1, 3)\n    const listTwo = new List(1, 2, 3)\n    const expected = 'unequal'\n\n    expect(listOne.compare(listTwo)).toEqual(expected)\n  })\n\n  xit('second list missing element from first list', () => {\n    const listOne = new List(1, 2, 3)\n    const listTwo = new List(1, 3)\n    const expected = 'unequal'\n\n    expect(listOne.compare(listTwo)).toEqual(expected)\n  })\n\n  xit('first list missing additional digits from second list', () => {\n    const listOne = new List(1, 2)\n    const listTwo = new List(1, 22)\n    const expected = 'unequal'\n\n    expect(listOne.compare(listTwo)).toEqual(expected)\n  })\n\n  xit('order matters to a list', () => {\n    const listOne = new List(1, 2, 3)\n    const listTwo = new List(3, 2, 1)\n    const expected = 'unequal'\n\n    expect(listOne.compare(listTwo)).toEqual(expected)\n  })\n\n  xit('same digits but different numbers', () => {\n    const listOne = new List(1, 0, 1)\n    const listTwo = new List(10, 1)\n    const expected = 'unequal'\n\n    expect(listOne.compare(listTwo)).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/sublist/sublist.ts",
    "content": "export class List {\n  constructor() {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  compare() {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/sublist/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/sublist/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/sum-of-multiples/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to write the code that calculates the energy points that get awarded to players when they complete a level.\n\nThe points awarded depend on two things:\n\n- The level (a number) that the player completed.\n- The base value of each magical item collected by the player during that level.\n\nThe energy points are awarded according to the following rules:\n\n1. For each magical item, take the base value and find all the multiples of that value that are less than the level number.\n2. Combine the sets of numbers.\n3. Remove any duplicates.\n4. Calculate the sum of all the numbers that are left.\n\nLet's look at an example:\n\n**The player completed level 20 and found two magical items with base values of 3 and 5.**\n\nTo calculate the energy points earned by the player, we need to find all the unique multiples of these base values that are less than level 20.\n\n- Multiples of 3 less than 20: `{3, 6, 9, 12, 15, 18}`\n- Multiples of 5 less than 20: `{5, 10, 15}`\n- Combine the sets and remove duplicates: `{3, 5, 6, 9, 10, 12, 15, 18}`\n- Sum the unique multiples: `3 + 5 + 6 + 9 + 10 + 12 + 15 + 18 = 78`\n- Therefore, the player earns **78** energy points for completing level 20 and finding the two magical items with base values of 3 and 5.\n"
  },
  {
    "path": "exercises/practice/sum-of-multiples/.docs/introduction.md",
    "content": "# Introduction\n\nYou work for a company that makes an online, fantasy-survival game.\n\nWhen a player finishes a level, they are awarded energy points.\nThe amount of energy awarded depends on which magical items the player found while exploring that level.\n"
  },
  {
    "path": "exercises/practice/sum-of-multiples/.meta/config.json",
    "content": "{\n  \"authors\": [],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"sum-of-multiples.ts\"\n    ],\n    \"test\": [\n      \"sum-of-multiples.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given a number, find the sum of all the multiples of particular numbers up to but not including that number.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"A variation on Problem 1 at Project Euler\",\n  \"source_url\": \"https://projecteuler.net/problem=1\"\n}\n"
  },
  {
    "path": "exercises/practice/sum-of-multiples/.meta/proof.ci.ts",
    "content": "export const sum = (multiples: number[], limit: number): number => {\n  let result = 0\n  for (let i = 1; i < limit; i++) {\n    if (multiples.some((multiple) => i % multiple === 0)) {\n      result += i\n    }\n  }\n  return result\n}\n"
  },
  {
    "path": "exercises/practice/sum-of-multiples/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[54aaab5a-ce86-4edc-8b40-d3ab2400a279]\ndescription = \"no multiples within limit\"\n\n[361e4e50-c89b-4f60-95ef-5bc5c595490a]\ndescription = \"one factor has multiples within limit\"\n\n[e644e070-040e-4ae0-9910-93c69fc3f7ce]\ndescription = \"more than one multiple within limit\"\n\n[607d6eb9-535c-41ce-91b5-3a61da3fa57f]\ndescription = \"more than one factor with multiples within limit\"\n\n[f47e8209-c0c5-4786-b07b-dc273bf86b9b]\ndescription = \"each multiple is only counted once\"\n\n[28c4b267-c980-4054-93e9-07723db615ac]\ndescription = \"a much larger limit\"\n\n[09c4494d-ff2d-4e0f-8421-f5532821ee12]\ndescription = \"three factors\"\n\n[2d0d5faa-f177-4ad6-bde9-ebb865083751]\ndescription = \"factors not relatively prime\"\n\n[ece8f2e8-96aa-4166-bbb7-6ce71261e354]\ndescription = \"some pairs of factors relatively prime and some not\"\n\n[624fdade-6ffb-400e-8472-456a38c171c0]\ndescription = \"one factor is a multiple of another\"\n\n[949ee7eb-db51-479c-b5cb-4a22b40ac057]\ndescription = \"much larger factors\"\n\n[41093673-acbd-482c-ab80-d00a0cbedecd]\ndescription = \"all numbers are multiples of 1\"\n\n[1730453b-baaa-438e-a9c2-d754497b2a76]\ndescription = \"no factors means an empty sum\"\n\n[214a01e9-f4bf-45bb-80f1-1dce9fbb0310]\ndescription = \"the only multiple of 0 is 0\"\n\n[c423ae21-a0cb-4ec7-aeb1-32971af5b510]\ndescription = \"the factor 0 does not affect the sum of multiples of other factors\"\n\n[17053ba9-112f-4ac0-aadb-0519dd836342]\ndescription = \"solutions using include-exclude must extend to cardinality greater than 3\"\n"
  },
  {
    "path": "exercises/practice/sum-of-multiples/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/sum-of-multiples/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/sum-of-multiples/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/sum-of-multiples/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/sum-of-multiples/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/sum-of-multiples/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/sum-of-multiples/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-sum-of-multiples\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/sum-of-multiples/sum-of-multiples.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { sum } from './sum-of-multiples.ts'\n\ndescribe('Sum Of Multiples', () => {\n  it('no multiples within limit', () => {\n    expect(sum([3, 5], 1)).toEqual(0)\n  })\n\n  xit('one factor has multiples within limit', () => {\n    expect(sum([3, 5], 4)).toEqual(3)\n  })\n\n  xit('more than one multiple within limit', () => {\n    expect(sum([3], 7)).toEqual(9)\n  })\n\n  xit('more than one factor with multiples within limit', () => {\n    expect(sum([3, 5], 10)).toEqual(23)\n  })\n\n  xit('each multiple is only counted once', () => {\n    expect(sum([3, 5], 100)).toEqual(2318)\n  })\n\n  xit('a much larger limit', () => {\n    expect(sum([3, 5], 1000)).toEqual(233168)\n  })\n\n  xit('three factors', () => {\n    expect(sum([7, 13, 17], 20)).toEqual(51)\n  })\n\n  xit('factors not relatively prime', () => {\n    expect(sum([4, 6], 15)).toEqual(30)\n  })\n\n  xit('some pairs of factors relatively prime and some not', () => {\n    expect(sum([5, 6, 8], 150)).toEqual(4419)\n  })\n\n  xit('one factor is a multiple of another', () => {\n    expect(sum([5, 25], 51)).toEqual(275)\n  })\n\n  xit('much larger factors', () => {\n    expect(sum([43, 47], 10000)).toEqual(2203160)\n  })\n\n  xit('all numbers are multiples of 1', () => {\n    expect(sum([1], 100)).toEqual(4950)\n  })\n\n  xit('no factors means an empty sum', () => {\n    expect(sum([], 10000)).toEqual(0)\n  })\n\n  xit('the only multiple of 0 is 0', () => {\n    expect(sum([0], 1)).toEqual(0)\n  })\n\n  xit('the factor 0 does not affect the sum of multiples of other factors', () => {\n    expect(sum([3, 0], 4)).toEqual(3)\n  })\n\n  xit('solutions using include-exclude must extend to cardinality greater than 3', () => {\n    expect(sum([2, 3, 5, 7, 11], 10000)).toEqual(39614537)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/sum-of-multiples/sum-of-multiples.ts",
    "content": "export function sum() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/sum-of-multiples/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/sum-of-multiples/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/tournament/.docs/instructions.md",
    "content": "# Instructions\n\nTally the results of a small football competition.\n\nBased on an input file containing which team played against which and what the outcome was, create a file with a table like this:\n\n```text\nTeam                           | MP |  W |  D |  L |  P\nDevastating Donkeys            |  3 |  2 |  1 |  0 |  7\nAllegoric Alaskans             |  3 |  2 |  0 |  1 |  6\nBlithering Badgers             |  3 |  1 |  0 |  2 |  3\nCourageous Californians        |  3 |  0 |  1 |  2 |  1\n```\n\nWhat do those abbreviations mean?\n\n- MP: Matches Played\n- W: Matches Won\n- D: Matches Drawn (Tied)\n- L: Matches Lost\n- P: Points\n\nA win earns a team 3 points.\nA draw earns 1.\nA loss earns 0.\n\nThe outcome is ordered by points, descending.\nIn case of a tie, teams are ordered alphabetically.\n\n## Input\n\nYour tallying program will receive input that looks like:\n\n```text\nAllegoric Alaskans;Blithering Badgers;win\nDevastating Donkeys;Courageous Californians;draw\nDevastating Donkeys;Allegoric Alaskans;win\nCourageous Californians;Blithering Badgers;loss\nBlithering Badgers;Devastating Donkeys;loss\nAllegoric Alaskans;Courageous Californians;win\n```\n\nThe result of the match refers to the first team listed.\nSo this line:\n\n```text\nAllegoric Alaskans;Blithering Badgers;win\n```\n\nmeans that the Allegoric Alaskans beat the Blithering Badgers.\n\nThis line:\n\n```text\nCourageous Californians;Blithering Badgers;loss\n```\n\nmeans that the Blithering Badgers beat the Courageous Californians.\n\nAnd this line:\n\n```text\nDevastating Donkeys;Courageous Californians;draw\n```\n\nmeans that the Devastating Donkeys and Courageous Californians tied.\n"
  },
  {
    "path": "exercises/practice/tournament/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"BrianDGLS\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"tournament.ts\"\n    ],\n    \"test\": [\n      \"tournament.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Tally the results of a small football competition.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  }\n}\n"
  },
  {
    "path": "exercises/practice/tournament/.meta/proof.ci.ts",
    "content": "class TeamStats {\n  public won = 0\n  public lost = 0\n  public drawn = 0\n  public played = 0\n\n  public get points(): number {\n    return this.won * 3 + this.drawn\n  }\n\n  constructor(public name: string) {}\n\n  public getStatTableRow(): string {\n    const { name, won, lost, played, drawn } = this\n    const namePad = name.padEnd(31, ' ')\n    const wonPad = won.toString().padStart(3 - won.toString().length, ' ')\n    const lostPad = lost.toString().padStart(3 - lost.toString().length, ' ')\n    const drawnPad = drawn.toString().padStart(3 - drawn.toString().length, ' ')\n    const playedPad = played\n      .toString()\n      .padStart(3 - played.toString().length, ' ')\n    const poinntsPad = this.points\n      .toString()\n      .padStart(3 - this.points.toString().length, ' ')\n    return `${namePad}| ${playedPad} | ${wonPad} | ${drawnPad} | ${lostPad} | ${poinntsPad}`\n  }\n}\n\nexport class Tournament {\n  private tableHeader =\n    'Team                           | MP |  W |  D |  L |  P'\n\n  private teams: { [key: string]: TeamStats } = {}\n\n  public tally(input: string): string {\n    if (!input) return this.tableHeader\n\n    for (const line of input.split('\\n')) {\n      const [teamAName, teamBName, result] = line.split(';')\n\n      if (!this.teams[teamAName]) {\n        this.teams[teamAName] = new TeamStats(teamAName)\n      }\n\n      if (!this.teams[teamBName]) {\n        this.teams[teamBName] = new TeamStats(teamBName)\n      }\n\n      this.applyResult(this.teams[teamAName], this.teams[teamBName], result)\n    }\n\n    return Object.keys(this.teams)\n      .sort(this.sortByPointsAlphabetically)\n      .reduce(\n        (acc, team) => acc + this.teams[team].getStatTableRow() + '\\n',\n        this.tableHeader + '\\n'\n      )\n      .trimEnd()\n  }\n\n  private sortByPointsAlphabetically = (a: string, b: string): number => {\n    const teamA = this.teams[a]\n    const teamB = this.teams[b]\n    if (teamA.points === teamB.points) {\n      return teamA.name.localeCompare(teamB.name)\n    }\n    return teamB.points - teamA.points\n  }\n\n  private applyResult(\n    teamA: TeamStats,\n    teamB: TeamStats,\n    result: string\n  ): void {\n    if (result === 'draw') {\n      teamA.drawn++\n      teamB.drawn++\n    }\n\n    if (result === 'win') {\n      teamA.won++\n      teamB.lost++\n    }\n\n    if (result === 'loss') {\n      teamA.lost++\n      teamB.won++\n    }\n\n    teamA.played++\n    teamB.played++\n  }\n}\n"
  },
  {
    "path": "exercises/practice/tournament/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[67e9fab1-07c1-49cf-9159-bc8671cc7c9c]\ndescription = \"just the header if no input\"\n\n[1b4a8aef-0734-4007-80a2-0626178c88f4]\ndescription = \"a win is three points, a loss is zero points\"\n\n[5f45ac09-4efe-46e7-8ddb-75ad85f86e05]\ndescription = \"a win can also be expressed as a loss\"\n\n[fd297368-efa0-442d-9f37-dd3f9a437239]\ndescription = \"a different team can win\"\n\n[26c016f9-e753-4a93-94e9-842f7b4d70fc]\ndescription = \"a draw is one point each\"\n\n[731204f6-4f34-4928-97eb-1c307ba83e62]\ndescription = \"There can be more than one match\"\n\n[49dc2463-42af-4ea6-95dc-f06cc5776adf]\ndescription = \"There can be more than one winner\"\n\n[6d930f33-435c-4e6f-9e2d-63fa85ce7dc7]\ndescription = \"There can be more than two teams\"\n\n[97022974-0c8a-4a50-8fe7-e36bdd8a5945]\ndescription = \"typical input\"\n\n[fe562f0d-ac0a-4c62-b9c9-44ee3236392b]\ndescription = \"incomplete competition (not all pairs have played)\"\n\n[3aa0386f-150b-4f99-90bb-5195e7b7d3b8]\ndescription = \"ties broken alphabetically\"\n\n[f9e20931-8a65-442a-81f6-503c0205b17a]\ndescription = \"ensure points sorted numerically\"\n"
  },
  {
    "path": "exercises/practice/tournament/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/tournament/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/tournament/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/tournament/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/tournament/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/tournament/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/tournament/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-tournament\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/tournament/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/tournament/tournament.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { Tournament } from './tournament.ts'\n\ndescribe('Tournament', () => {\n  it('just the header if no input', () => {\n    expect(new Tournament().tally('')).toBe(\n      'Team                           | MP |  W |  D |  L |  P'\n    )\n  })\n\n  xit('a win is three points, a loss is zero points', () => {\n    expect(\n      new Tournament().tally('Allegoric Alaskans;Blithering Badgers;win')\n    ).toBe(\n      [\n        'Team                           | MP |  W |  D |  L |  P',\n        'Allegoric Alaskans             |  1 |  1 |  0 |  0 |  3',\n        'Blithering Badgers             |  1 |  0 |  0 |  1 |  0',\n      ].join('\\n')\n    )\n  })\n\n  xit('a win can also be expressed as a loss', () => {\n    expect(\n      new Tournament().tally('Blithering Badgers;Allegoric Alaskans;loss')\n    ).toBe(\n      [\n        'Team                           | MP |  W |  D |  L |  P',\n        'Allegoric Alaskans             |  1 |  1 |  0 |  0 |  3',\n        'Blithering Badgers             |  1 |  0 |  0 |  1 |  0',\n      ].join('\\n')\n    )\n  })\n\n  xit('a different team can win', () => {\n    expect(\n      new Tournament().tally('Blithering Badgers;Allegoric Alaskans;win')\n    ).toBe(\n      [\n        'Team                           | MP |  W |  D |  L |  P',\n        'Blithering Badgers             |  1 |  1 |  0 |  0 |  3',\n        'Allegoric Alaskans             |  1 |  0 |  0 |  1 |  0',\n      ].join('\\n')\n    )\n  })\n\n  xit('a draw is one point each', () => {\n    expect(\n      new Tournament().tally('Allegoric Alaskans;Blithering Badgers;draw')\n    ).toBe(\n      [\n        'Team                           | MP |  W |  D |  L |  P',\n        'Allegoric Alaskans             |  1 |  0 |  1 |  0 |  1',\n        'Blithering Badgers             |  1 |  0 |  1 |  0 |  1',\n      ].join('\\n')\n    )\n  })\n\n  xit('There can be more than one match', () => {\n    expect(\n      new Tournament().tally(\n        [\n          'Allegoric Alaskans;Blithering Badgers;win',\n          'Allegoric Alaskans;Blithering Badgers;win',\n        ].join('\\n')\n      )\n    ).toBe(\n      [\n        'Team                           | MP |  W |  D |  L |  P',\n        'Allegoric Alaskans             |  2 |  2 |  0 |  0 |  6',\n        'Blithering Badgers             |  2 |  0 |  0 |  2 |  0',\n      ].join('\\n')\n    )\n  })\n\n  xit('There can be more than one winner', () => {\n    expect(\n      new Tournament().tally(\n        [\n          'Allegoric Alaskans;Blithering Badgers;loss',\n          'Allegoric Alaskans;Blithering Badgers;win',\n        ].join('\\n')\n      )\n    ).toBe(\n      [\n        'Team                           | MP |  W |  D |  L |  P',\n        'Allegoric Alaskans             |  2 |  1 |  0 |  1 |  3',\n        'Blithering Badgers             |  2 |  1 |  0 |  1 |  3',\n      ].join('\\n')\n    )\n  })\n\n  xit('There can be more than two teams', () => {\n    expect(\n      new Tournament().tally(\n        [\n          'Allegoric Alaskans;Blithering Badgers;win',\n          'Blithering Badgers;Courageous Californians;win',\n          'Courageous Californians;Allegoric Alaskans;loss',\n        ].join('\\n')\n      )\n    ).toBe(\n      [\n        'Team                           | MP |  W |  D |  L |  P',\n        'Allegoric Alaskans             |  2 |  2 |  0 |  0 |  6',\n        'Blithering Badgers             |  2 |  1 |  0 |  1 |  3',\n        'Courageous Californians        |  2 |  0 |  0 |  2 |  0',\n      ].join('\\n')\n    )\n  })\n\n  xit('typical input', () => {\n    expect(\n      new Tournament().tally(\n        [\n          'Allegoric Alaskans;Blithering Badgers;win',\n          'Devastating Donkeys;Courageous Californians;draw',\n          'Devastating Donkeys;Allegoric Alaskans;win',\n          'Courageous Californians;Blithering Badgers;loss',\n          'Blithering Badgers;Devastating Donkeys;loss',\n          'Allegoric Alaskans;Courageous Californians;win',\n        ].join('\\n')\n      )\n    ).toBe(\n      [\n        'Team                           | MP |  W |  D |  L |  P',\n        'Devastating Donkeys            |  3 |  2 |  1 |  0 |  7',\n        'Allegoric Alaskans             |  3 |  2 |  0 |  1 |  6',\n        'Blithering Badgers             |  3 |  1 |  0 |  2 |  3',\n        'Courageous Californians        |  3 |  0 |  1 |  2 |  1',\n      ].join('\\n')\n    )\n  })\n\n  xit('incomplete competition (not all pairs have played)', () => {\n    expect(\n      new Tournament().tally(\n        [\n          'Allegoric Alaskans;Blithering Badgers;loss',\n          'Devastating Donkeys;Allegoric Alaskans;loss',\n          'Courageous Californians;Blithering Badgers;draw',\n          'Allegoric Alaskans;Courageous Californians;win',\n        ].join('\\n')\n      )\n    ).toBe(\n      [\n        'Team                           | MP |  W |  D |  L |  P',\n        'Allegoric Alaskans             |  3 |  2 |  0 |  1 |  6',\n        'Blithering Badgers             |  2 |  1 |  1 |  0 |  4',\n        'Courageous Californians        |  2 |  0 |  1 |  1 |  1',\n        'Devastating Donkeys            |  1 |  0 |  0 |  1 |  0',\n      ].join('\\n')\n    )\n  })\n\n  xit('ties broken alphabetically', () => {\n    expect(\n      new Tournament().tally(\n        [\n          'Courageous Californians;Devastating Donkeys;win',\n          'Allegoric Alaskans;Blithering Badgers;win',\n          'Devastating Donkeys;Allegoric Alaskans;loss',\n          'Courageous Californians;Blithering Badgers;win',\n          'Blithering Badgers;Devastating Donkeys;draw',\n          'Allegoric Alaskans;Courageous Californians;draw',\n        ].join('\\n')\n      )\n    ).toBe(\n      [\n        'Team                           | MP |  W |  D |  L |  P',\n        'Allegoric Alaskans             |  3 |  2 |  1 |  0 |  7',\n        'Courageous Californians        |  3 |  2 |  1 |  0 |  7',\n        'Blithering Badgers             |  3 |  0 |  1 |  2 |  1',\n        'Devastating Donkeys            |  3 |  0 |  1 |  2 |  1',\n      ].join('\\n')\n    )\n  })\n\n  xit('ensure points sorted numerically', () => {\n    expect(\n      new Tournament().tally(\n        [\n          'Devastating Donkeys;Blithering Badgers;win',\n          'Devastating Donkeys;Blithering Badgers;win',\n          'Devastating Donkeys;Blithering Badgers;win',\n          'Devastating Donkeys;Blithering Badgers;win',\n          'Blithering Badgers;Devastating Donkeys;win',\n        ].join('\\n')\n      )\n    ).toBe(\n      [\n        'Team                           | MP |  W |  D |  L |  P',\n        'Devastating Donkeys            |  5 |  4 |  0 |  1 | 12',\n        'Blithering Badgers             |  5 |  1 |  0 |  4 |  3',\n      ].join('\\n')\n    )\n  })\n})\n"
  },
  {
    "path": "exercises/practice/tournament/tournament.ts",
    "content": "export class Tournament {\n  // eslint-disable-next-line no-unused-vars\n  public tally(input: string): string {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/tournament/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/transpose/.docs/instructions.md",
    "content": "# Instructions\n\nGiven an input text output it transposed.\n\nRoughly explained, the transpose of a matrix:\n\n```text\nABC\nDEF\n```\n\nis given by:\n\n```text\nAD\nBE\nCF\n```\n\nRows become columns and columns become rows.\nSee [transpose][].\n\nIf the input has rows of different lengths, this is to be solved as follows:\n\n- Pad to the left with spaces.\n- Don't pad to the right.\n\nTherefore, transposing this matrix:\n\n```text\nABC\nDE\n```\n\nresults in:\n\n```text\nAD\nBE\nC\n```\n\nAnd transposing:\n\n```text\nAB\nDEF\n```\n\nresults in:\n\n```text\nAD\nBE\n F\n```\n\nIn general, all characters from the input should also be present in the transposed output.\nThat means that if a column in the input text contains only spaces on its bottom-most row(s), the corresponding output row should contain the spaces in its right-most column(s).\n\n[transpose]: https://en.wikipedia.org/wiki/Transpose\n"
  },
  {
    "path": "exercises/practice/transpose/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"peerreynders\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"transpose.ts\"\n    ],\n    \"test\": [\n      \"transpose.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Take input text and output it transposed.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Reddit r/dailyprogrammer challenge #270 [Easy].\",\n  \"source_url\": \"https://web.archive.org/web/20230630051421/https://old.reddit.com/r/dailyprogrammer/comments/4msu2x/challenge_270_easy_transpose_the_input_text/\"\n}\n"
  },
  {
    "path": "exercises/practice/transpose/.meta/proof.ci.ts",
    "content": "const fillColumn: (t: string[], l: string, r: number) => void = (\n  transposed,\n  fromSource,\n  toColumn\n) => {\n  for (let row = 0; row < fromSource.length; row++) {\n    transposed[row] =\n      (row in transposed ? transposed[row] : '').padEnd(toColumn) +\n      fromSource.charAt(row)\n  }\n}\n\nexport function transpose(lines: string[]): string[] {\n  const transposed: string[] = []\n  for (let toColumn = 0; toColumn < lines.length; toColumn++)\n    fillColumn(transposed, lines[toColumn], toColumn)\n\n  return transposed\n}\n"
  },
  {
    "path": "exercises/practice/transpose/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[404b7262-c050-4df0-a2a2-0cb06cd6a821]\ndescription = \"empty string\"\n\n[a89ce8a3-c940-4703-a688-3ea39412fbcb]\ndescription = \"two characters in a row\"\n\n[855bb6ae-4180-457c-abd0-ce489803ce98]\ndescription = \"two characters in a column\"\n\n[5ceda1c0-f940-441c-a244-0ced197769c8]\ndescription = \"simple\"\n\n[a54675dd-ae7d-4a58-a9c4-0c20e99a7c1f]\ndescription = \"single line\"\n\n[0dc2ec0b-549d-4047-aeeb-8029fec8d5c5]\ndescription = \"first line longer than second line\"\n\n[984e2ec3-b3d3-4b53-8bd6-96f5ef404102]\ndescription = \"second line longer than first line\"\n\n[eccd3784-45f0-4a3f-865a-360cb323d314]\ndescription = \"mixed line length\"\n\n[85b96b3f-d00c-4f80-8ca2-c8a5c9216c2d]\ndescription = \"square\"\n\n[b9257625-7a53-4748-8863-e08e9d27071d]\ndescription = \"rectangle\"\n\n[b80badc9-057e-4543-bd07-ce1296a1ea2c]\ndescription = \"triangle\"\n\n[76acfd50-5596-4d05-89f1-5116328a7dd9]\ndescription = \"jagged triangle\"\n"
  },
  {
    "path": "exercises/practice/transpose/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/transpose/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/transpose/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/transpose/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/transpose/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/transpose/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/transpose/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-transpose\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/transpose/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/transpose/transpose.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { transpose } from './transpose.ts'\n\ndescribe('Transpose', () => {\n  it('empty string', () => {\n    const expected: string[] = []\n    expect(transpose([])).toEqual(expected)\n  })\n\n  xit('two characters in a row', () => {\n    const expected = ['A', '1']\n    expect(transpose(['A1'])).toEqual(expected)\n  })\n\n  xit('two characters in a column', () => {\n    const expected = ['A1']\n    expect(transpose(['A', '1'])).toEqual(expected)\n  })\n\n  xit('simple', () => {\n    const expected = ['A1', 'B2', 'C3']\n    expect(transpose(['ABC', '123'])).toEqual(expected)\n  })\n\n  xit('single line', () => {\n    const expected = [\n      'S',\n      'i',\n      'n',\n      'g',\n      'l',\n      'e',\n      ' ',\n      'l',\n      'i',\n      'n',\n      'e',\n      '.',\n    ]\n    expect(transpose(['Single line.'])).toEqual(expected)\n  })\n\n  xit('first line longer than second line', () => {\n    const expected = [\n      'TT',\n      'hh',\n      'ee',\n      '  ',\n      'ff',\n      'oi',\n      'uf',\n      'rt',\n      'th',\n      'h ',\n      ' l',\n      'li',\n      'in',\n      'ne',\n      'e.',\n      '.',\n    ]\n    expect(transpose(['The fourth line.', 'The fifth line.'])).toEqual(expected)\n  })\n\n  xit('second line longer than first line', () => {\n    const expected = [\n      'TT',\n      'hh',\n      'ee',\n      '  ',\n      'fs',\n      'ie',\n      'rc',\n      'so',\n      'tn',\n      ' d',\n      'l ',\n      'il',\n      'ni',\n      'en',\n      '.e',\n      ' .',\n    ]\n    expect(transpose(['The first line.', 'The second line.'])).toEqual(expected)\n  })\n\n  xit('square', () => {\n    const expected = ['HEART', 'EMBER', 'ABUSE', 'RESIN', 'TREND']\n    expect(transpose(['HEART', 'EMBER', 'ABUSE', 'RESIN', 'TREND'])).toEqual(\n      expected\n    )\n  })\n\n  xit('rectangle', () => {\n    const expected = [\n      'FOBS',\n      'RULE',\n      'ATOP',\n      'CLOT',\n      'TIME',\n      'UNIT',\n      'RENT',\n      'EDGE',\n    ]\n    expect(transpose(['FRACTURE', 'OUTLINED', 'BLOOMING', 'SEPTETTE'])).toEqual(\n      expected\n    )\n  })\n\n  xit('triangle', () => {\n    const expected = [\n      'TEASER',\n      ' EASER',\n      '  ASER',\n      '   SER',\n      '    ER',\n      '     R',\n    ]\n    expect(transpose(['T', 'EE', 'AAA', 'SSSS', 'EEEEE', 'RRRRRR'])).toEqual(\n      expected\n    )\n  })\n\n  xit('jagged triangle', () => {\n    const expected = ['123456', '1 3456', '  3456', '  3 56', '    56', '    5']\n\n    expect(transpose(['11', '2', '3333', '444', '555555', '66666'])).toEqual(\n      expected\n    )\n  })\n\n  xit('test many lines', () => {\n    const expected = [\n      'CIFWFAWDTAWITW',\n      'hnrhr hohnhshh',\n      'o oeopotedi ea',\n      'rfmrmash  cn t',\n      '.a e ie fthow ',\n      ' ia fr weh,whh',\n      'Trnco miae  ie',\n      'w ciroitr btcr',\n      'oVivtfshfcuhhe',\n      ' eeih a uote  ',\n      'hrnl sdtln  is',\n      'oot ttvh tttfh',\n      'un bhaeepihw a',\n      'saglernianeoyl',\n      'e,ro -trsui ol',\n      'h uofcu sarhu ',\n      'owddarrdan o m',\n      \"lhg to'egccuwi\",\n      'deemasdaeehris',\n      'sr als t  ists',\n      \",ebk 'phool'h,\",\n      '  reldi ffd   ',\n      'bweso tb  rtpo',\n      'oea ileutterau',\n      't kcnoorhhnatr',\n      \"hl isvuyee'fi \",\n      ' atv es iisfet',\n      'ayoior trr ino',\n      'l  lfsoh  ecti',\n      'ion   vedpn  l',\n      'kuehtteieadoe ',\n      'erwaharrar,fas',\n      '   nekt te  rh',\n      'ismdsehphnnosa',\n      'ncuse ra-tau l',\n      ' et  tormsural',\n      \"dniuthwea'g t \",\n      'iennwesnr hsts',\n      'g,ycoi tkrttet',\n      \"n ,l r s'a anr\",\n      \"i  ef  'dgcgdi\",\n      't  aol   eoe,v',\n      'y  nei sl,u; e',\n      ',  .sf to l   ',\n      '     e rv d  t',\n      '     ; ie    o',\n      '       f, r   ',\n      '       e  e  m',\n      '       .  m  e',\n      '          o  n',\n      '          v  d',\n      '          e  .',\n      '          ,',\n    ]\n    expect(\n      transpose([\n        'Chor. Two households, both alike in dignity,',\n        'In fair Verona, where we lay our scene,',\n        'From ancient grudge break to new mutiny,',\n        'Where civil blood makes civil hands unclean.',\n        'From forth the fatal loins of these two foes',\n        \"A pair of star-cross'd lovers take their life;\",\n        \"Whose misadventur'd piteous overthrows\",\n        \"Doth with their death bury their parents' strife.\",\n        \"The fearful passage of their death-mark'd love,\",\n        \"And the continuance of their parents' rage,\",\n        \"Which, but their children's end, naught could remove,\",\n        \"Is now the two hours' traffic of our stage;\",\n        'The which if you with patient ears attend,',\n        'What here shall miss, our toil shall strive to mend.',\n      ])\n    ).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/transpose/transpose.ts",
    "content": "export function transpose() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/transpose/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/triangle/.docs/instructions.md",
    "content": "# Instructions\n\nDetermine if a triangle is equilateral, isosceles, or scalene.\n\nAn _equilateral_ triangle has all three sides the same length.\n\nAn _isosceles_ triangle has at least two sides the same length.\n(It is sometimes specified as having exactly two sides the same length, but for the purposes of this exercise we'll say at least two.)\n\nA _scalene_ triangle has all sides of different lengths.\n\n## Note\n\nFor a shape to be a triangle at all, all sides have to be of length > 0, and the sum of the lengths of any two sides must be greater than or equal to the length of the third side.\n\n~~~~exercism/note\n_Degenerate triangles_ are triangles where the sum of the length of two sides is **equal** to the length of the third side, e.g. `1, 1, 2`.\nWe opted to not include tests for degenerate triangles in this exercise.\nYou may handle those situations if you wish to do so, or safely ignore them.\n~~~~\n\nIn equations:\n\nLet `a`, `b`, and `c` be sides of the triangle.\nThen all three of the following expressions must be true:\n\n```text\na + b ≥ c\nb + c ≥ a\na + c ≥ b\n```\n\nSee [Triangle Inequality][triangle-inequality]\n\n[triangle-inequality]: https://en.wikipedia.org/wiki/Triangle_inequality\n"
  },
  {
    "path": "exercises/practice/triangle/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"anuragsoni\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"triangle.ts\"\n    ],\n    \"test\": [\n      \"triangle.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Determine if a triangle is equilateral, isosceles, or scalene.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"The Ruby Koans triangle project, parts 1 & 2\",\n  \"source_url\": \"https://www.rubykoans.com/\"\n}\n"
  },
  {
    "path": "exercises/practice/triangle/.meta/proof.ci.ts",
    "content": "export class Triangle {\n  private readonly sides: number[]\n\n  constructor(...sides: number[]) {\n    this.sides = sides\n  }\n\n  public get isValid(): boolean {\n    const [s1, s2, s3] = this.sides\n    const sidesArePositive = s1 > 0 && s2 > 0 && s3 > 0\n    const validatesTriangleInequality =\n      s1 + s2 >= s3 && s1 + s3 >= s2 && s2 + s3 >= s1\n    return sidesArePositive && validatesTriangleInequality\n  }\n\n  public get isEquilateral(): boolean {\n    if (!this.isValid) {\n      return false\n    }\n    const [s1, s2, s3] = this.sides\n    return s1 === s2 && s2 === s3 && s1 === s3\n  }\n\n  public get isIsosceles(): boolean {\n    if (!this.isValid) {\n      return false\n    }\n    const [s1, s2, s3] = this.sides\n    return s1 === s2 || s1 === s3 || s2 === s3\n  }\n\n  public get isScalene(): boolean {\n    if (!this.isValid) {\n      return false\n    }\n    return !this.isIsosceles\n  }\n}\n"
  },
  {
    "path": "exercises/practice/triangle/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[8b2c43ac-7257-43f9-b552-7631a91988af]\ndescription = \"equilateral triangle -> all sides are equal\"\n\n[33eb6f87-0498-4ccf-9573-7f8c3ce92b7b]\ndescription = \"equilateral triangle -> any side is unequal\"\n\n[c6585b7d-a8c0-4ad8-8a34-e21d36f7ad87]\ndescription = \"equilateral triangle -> no sides are equal\"\n\n[16e8ceb0-eadb-46d1-b892-c50327479251]\ndescription = \"equilateral triangle -> all zero sides is not a triangle\"\n\n[3022f537-b8e5-4cc1-8f12-fd775827a00c]\ndescription = \"equilateral triangle -> sides may be floats\"\n\n[cbc612dc-d75a-4c1c-87fc-e2d5edd70b71]\ndescription = \"isosceles triangle -> last two sides are equal\"\n\n[e388ce93-f25e-4daf-b977-4b7ede992217]\ndescription = \"isosceles triangle -> first two sides are equal\"\n\n[d2080b79-4523-4c3f-9d42-2da6e81ab30f]\ndescription = \"isosceles triangle -> first and last sides are equal\"\n\n[8d71e185-2bd7-4841-b7e1-71689a5491d8]\ndescription = \"isosceles triangle -> equilateral triangles are also isosceles\"\n\n[840ed5f8-366f-43c5-ac69-8f05e6f10bbb]\ndescription = \"isosceles triangle -> no sides are equal\"\n\n[2eba0cfb-6c65-4c40-8146-30b608905eae]\ndescription = \"isosceles triangle -> first triangle inequality violation\"\n\n[278469cb-ac6b-41f0-81d4-66d9b828f8ac]\ndescription = \"isosceles triangle -> second triangle inequality violation\"\n\n[90efb0c7-72bb-4514-b320-3a3892e278ff]\ndescription = \"isosceles triangle -> third triangle inequality violation\"\n\n[adb4ee20-532f-43dc-8d31-e9271b7ef2bc]\ndescription = \"isosceles triangle -> sides may be floats\"\n\n[e8b5f09c-ec2e-47c1-abec-f35095733afb]\ndescription = \"scalene triangle -> no sides are equal\"\n\n[2510001f-b44d-4d18-9872-2303e7977dc1]\ndescription = \"scalene triangle -> all sides are equal\"\n\n[c6e15a92-90d9-4fb3-90a2-eef64f8d3e1e]\ndescription = \"scalene triangle -> first and second sides are equal\"\n\n[3da23a91-a166-419a-9abf-baf4868fd985]\ndescription = \"scalene triangle -> first and third sides are equal\"\n\n[b6a75d98-1fef-4c42-8e9a-9db854ba0a4d]\ndescription = \"scalene triangle -> second and third sides are equal\"\n\n[70ad5154-0033-48b7-af2c-b8d739cd9fdc]\ndescription = \"scalene triangle -> may not violate triangle inequality\"\n\n[26d9d59d-f8f1-40d3-ad58-ae4d54123d7d]\ndescription = \"scalene triangle -> sides may be floats\"\n"
  },
  {
    "path": "exercises/practice/triangle/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/triangle/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/triangle/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/triangle/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/triangle/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/triangle/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/triangle/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-triangle\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/triangle/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/triangle/triangle.test.ts",
    "content": "import { describe, xdescribe, it, expect, xit } from '@jest/globals'\nimport { Triangle } from './triangle.ts'\n\ndescribe('Triangle', () => {\n  describe('equilateral triangle', () => {\n    it('all sides are equal', () => {\n      const triangle = new Triangle(2, 2, 2)\n      expect(triangle.isEquilateral).toBe(true)\n    })\n\n    xit('any side is unequal', () => {\n      const triangle = new Triangle(2, 3, 2)\n      expect(triangle.isEquilateral).toBe(false)\n    })\n\n    xit('no sides are equal', () => {\n      const triangle = new Triangle(5, 4, 6)\n      expect(triangle.isEquilateral).toBe(false)\n    })\n\n    xit('all zero sides is not a triangle', () => {\n      const triangle = new Triangle(0, 0, 0)\n      expect(triangle.isEquilateral).toBe(false)\n    })\n\n    xit('sides may be floats', () => {\n      const triangle = new Triangle(0.5, 0.5, 0.5)\n      expect(triangle.isEquilateral).toBe(true)\n    })\n  })\n\n  xdescribe('isosceles triangle', () => {\n    xit('last two sides are equal', () => {\n      const triangle = new Triangle(3, 4, 4)\n      expect(triangle.isIsosceles).toBe(true)\n    })\n\n    xit('first two sides are equal', () => {\n      const triangle = new Triangle(4, 4, 3)\n      expect(triangle.isIsosceles).toBe(true)\n    })\n\n    xit('first and last sides are equal', () => {\n      const triangle = new Triangle(4, 3, 4)\n      expect(triangle.isIsosceles).toBe(true)\n    })\n\n    xit('equilateral triangles are also isosceles', () => {\n      const triangle = new Triangle(4, 4, 4)\n      expect(triangle.isIsosceles).toBe(true)\n    })\n\n    xit('no sides are equal', () => {\n      const triangle = new Triangle(2, 3, 4)\n      expect(triangle.isIsosceles).toBe(false)\n    })\n\n    xit('first triangle inequality violation', () => {\n      const triangle = new Triangle(1, 1, 3)\n      expect(triangle.isIsosceles).toBe(false)\n    })\n\n    xit('second triangle inequality violation', () => {\n      const triangle = new Triangle(1, 3, 1)\n      expect(triangle.isIsosceles).toBe(false)\n    })\n\n    xit('third triangle inequality violation', () => {\n      const triangle = new Triangle(3, 1, 1)\n      expect(triangle.isIsosceles).toBe(false)\n    })\n\n    xit('sides may be floats', () => {\n      const triangle = new Triangle(0.5, 0.4, 0.5)\n      expect(triangle.isIsosceles).toBe(true)\n    })\n  })\n\n  xdescribe('scalene triangle', () => {\n    xit('no sides are equal', () => {\n      const triangle = new Triangle(5, 4, 6)\n      expect(triangle.isScalene).toBe(true)\n    })\n\n    xit('all sides are equal', () => {\n      const triangle = new Triangle(4, 4, 4)\n      expect(triangle.isScalene).toBe(false)\n    })\n\n    xit('first and second sides are equal', () => {\n      const triangle = new Triangle(4, 4, 3)\n      expect(triangle.isScalene).toBe(false)\n    })\n\n    xit('first and third sides are equal', () => {\n      const triangle = new Triangle(3, 4, 3)\n      expect(triangle.isScalene).toBe(false)\n    })\n\n    xit('second and third sides are equal', () => {\n      const triangle = new Triangle(4, 3, 3)\n      expect(triangle.isScalene).toBe(false)\n    })\n\n    xit('may not violate triangle inequality', () => {\n      const triangle = new Triangle(7, 3, 2)\n      expect(triangle.isScalene).toBe(false)\n    })\n\n    xit('sides may be floats', () => {\n      const triangle = new Triangle(0.5, 0.4, 0.6)\n      expect(triangle.isScalene).toBe(true)\n    })\n  })\n})\n"
  },
  {
    "path": "exercises/practice/triangle/triangle.ts",
    "content": "export class Triangle {\n  constructor(...sides) {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  get isEquilateral() {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  get isIsosceles() {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  get isScalene() {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/triangle/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/twelve-days/.docs/instructions.md",
    "content": "# Instructions\n\nYour task in this exercise is to write code that returns the lyrics of the song: \"The Twelve Days of Christmas.\"\n\n\"The Twelve Days of Christmas\" is a common English Christmas carol.\nEach subsequent verse of the song builds on the previous verse.\n\nThe lyrics your code returns should _exactly_ match the full song text shown below.\n\n## Lyrics\n\n```text\nOn the first day of Christmas my true love gave to me: a Partridge in a Pear Tree.\n\nOn the second day of Christmas my true love gave to me: two Turtle Doves, and a Partridge in a Pear Tree.\n\nOn the third day of Christmas my true love gave to me: three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n\nOn the fourth day of Christmas my true love gave to me: four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n\nOn the fifth day of Christmas my true love gave to me: five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n\nOn the sixth day of Christmas my true love gave to me: six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n\nOn the seventh day of Christmas my true love gave to me: seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n\nOn the eighth day of Christmas my true love gave to me: eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n\nOn the ninth day of Christmas my true love gave to me: nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n\nOn the tenth day of Christmas my true love gave to me: ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n\nOn the eleventh day of Christmas my true love gave to me: eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n\nOn the twelfth day of Christmas my true love gave to me: twelve Drummers Drumming, eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n```\n"
  },
  {
    "path": "exercises/practice/twelve-days/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"PatrickMcSweeny\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"twelve-days.ts\"\n    ],\n    \"test\": [\n      \"twelve-days.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Output the lyrics to 'The Twelve Days of Christmas'.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Wikipedia\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/The_Twelve_Days_of_Christmas_(song)\"\n}\n"
  },
  {
    "path": "exercises/practice/twelve-days/.meta/proof.ci.ts",
    "content": "const days = [\n  'first',\n  'second',\n  'third',\n  'fourth',\n  'fifth',\n  'sixth',\n  'seventh',\n  'eighth',\n  'ninth',\n  'tenth',\n  'eleventh',\n  'twelfth',\n] as const\n\nconst gifts = [\n  'a Partridge in a Pear Tree.',\n  'two Turtle Doves, ',\n  'three French Hens, ',\n  'four Calling Birds, ',\n  'five Gold Rings, ',\n  'six Geese-a-Laying, ',\n  'seven Swans-a-Swimming, ',\n  'eight Maids-a-Milking, ',\n  'nine Ladies Dancing, ',\n  'ten Lords-a-Leaping, ',\n  'eleven Pipers Piping, ',\n  'twelve Drummers Drumming, ',\n] as const\n\nexport function recite(startVerse: number, endVerse: number): string {\n  let lyrics = reciteVerse(startVerse)\n  for (let i = startVerse + 1; i <= endVerse; i++) {\n    lyrics += reciteVerse(i)\n  }\n  return lyrics\n}\n\nfunction reciteVerse(verse: number): string {\n  let result =\n    'On the ' + days[verse - 1] + ' day of Christmas my true love gave to me: '\n  for (let i = verse; i > 0; i--) {\n    if (verse !== 1 && i === 1) {\n      result += 'and '\n    }\n    result += gifts[i - 1]\n  }\n  result += '\\n'\n  return result\n}\n"
  },
  {
    "path": "exercises/practice/twelve-days/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[c0b5a5e6-c89d-49b1-a6b2-9f523bff33f7]\ndescription = \"first day a partridge in a pear tree\"\n\n[1c64508a-df3d-420a-b8e1-fe408847854a]\ndescription = \"second day two turtle doves\"\n\n[a919e09c-75b2-4e64-bb23-de4a692060a8]\ndescription = \"third day three french hens\"\n\n[9bed8631-ec60-4894-a3bb-4f0ec9fbe68d]\ndescription = \"fourth day four calling birds\"\n\n[cf1024f0-73b6-4545-be57-e9cea565289a]\ndescription = \"fifth day five gold rings\"\n\n[50bd3393-868a-4f24-a618-68df3d02ff04]\ndescription = \"sixth day six geese-a-laying\"\n\n[8f29638c-9bf1-4680-94be-e8b84e4ade83]\ndescription = \"seventh day seven swans-a-swimming\"\n\n[7038d6e1-e377-47ad-8c37-10670a05bc05]\ndescription = \"eighth day eight maids-a-milking\"\n\n[37a800a6-7a56-4352-8d72-0f51eb37cfe8]\ndescription = \"ninth day nine ladies dancing\"\n\n[10b158aa-49ff-4b2d-afc3-13af9133510d]\ndescription = \"tenth day ten lords-a-leaping\"\n\n[08d7d453-f2ba-478d-8df0-d39ea6a4f457]\ndescription = \"eleventh day eleven pipers piping\"\n\n[0620fea7-1704-4e48-b557-c05bf43967f0]\ndescription = \"twelfth day twelve drummers drumming\"\n\n[da8b9013-b1e8-49df-b6ef-ddec0219e398]\ndescription = \"recites first three verses of the song\"\n\n[c095af0d-3137-4653-ad32-bfb899eda24c]\ndescription = \"recites three verses from the middle of the song\"\n\n[20921bc9-cc52-4627-80b3-198cbbfcf9b7]\ndescription = \"recites the whole song\"\n"
  },
  {
    "path": "exercises/practice/twelve-days/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/twelve-days/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/twelve-days/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/twelve-days/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/twelve-days/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/twelve-days/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/twelve-days/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-twelve-days\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/twelve-days/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/twelve-days/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/twelve-days/twelve-days.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { recite } from './twelve-days.ts'\n\ndescribe('verse', () => {\n  it('first day a partridge in a pear tree', () => {\n    const expected =\n      'On the first day of Christmas my true love gave to me: a Partridge in a Pear Tree.\\n'\n    expect(recite(1, 1)).toEqual(expected)\n  })\n\n  xit('second day two turtle doves', () => {\n    const expected =\n      'On the second day of Christmas my true love gave to me: two Turtle Doves, and a Partridge in a Pear Tree.\\n'\n    expect(recite(2, 2)).toEqual(expected)\n  })\n\n  xit('third day three french hens', () => {\n    const expected =\n      'On the third day of Christmas my true love gave to me: three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\n'\n    expect(recite(3, 3)).toEqual(expected)\n  })\n\n  xit('fourth day four calling birds', () => {\n    const expected =\n      'On the fourth day of Christmas my true love gave to me: four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\n'\n    expect(recite(4, 4)).toEqual(expected)\n  })\n\n  xit('fifth day five gold rings', () => {\n    const expected =\n      'On the fifth day of Christmas my true love gave to me: five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\n'\n    expect(recite(5, 5)).toEqual(expected)\n  })\n\n  xit('sixth day six geese-a-laying', () => {\n    const expected =\n      'On the sixth day of Christmas my true love gave to me: six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\n'\n    expect(recite(6, 6)).toEqual(expected)\n  })\n\n  xit('seventh day seven swans-a-swimming', () => {\n    const expected =\n      'On the seventh day of Christmas my true love gave to me: seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\n'\n    expect(recite(7, 7)).toEqual(expected)\n  })\n\n  xit('eighth day eight maids-a-milking', () => {\n    const expected =\n      'On the eighth day of Christmas my true love gave to me: eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\n'\n    expect(recite(8, 8)).toEqual(expected)\n  })\n\n  xit('ninth day nine ladies dancing', () => {\n    const expected =\n      'On the ninth day of Christmas my true love gave to me: nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\n'\n    expect(recite(9, 9)).toEqual(expected)\n  })\n\n  xit('tenth day ten lords-a-leaping', () => {\n    const expected =\n      'On the tenth day of Christmas my true love gave to me: ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\n'\n    expect(recite(10, 10)).toEqual(expected)\n  })\n\n  xit('eleventh day eleven pipers piping', () => {\n    const expected =\n      'On the eleventh day of Christmas my true love gave to me: eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\n'\n    expect(recite(11, 11)).toEqual(expected)\n  })\n\n  xit('twelfth day twelve drummers drumming', () => {\n    const expected =\n      'On the twelfth day of Christmas my true love gave to me: twelve Drummers Drumming, eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\n'\n    expect(recite(12, 12)).toEqual(expected)\n  })\n})\n\ndescribe('lyrics', () => {\n  xit('recites first three verses of the song', () => {\n    const expected =\n      'On the first day of Christmas my true love gave to me: a Partridge in a Pear Tree.\\nOn the second day of Christmas my true love gave to me: two Turtle Doves, and a Partridge in a Pear Tree.\\nOn the third day of Christmas my true love gave to me: three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\n'\n    expect(recite(1, 3)).toEqual(expected)\n  })\n\n  xit('recites three verses from the middle of the song', () => {\n    const expected =\n      'On the fourth day of Christmas my true love gave to me: four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\nOn the fifth day of Christmas my true love gave to me: five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\nOn the sixth day of Christmas my true love gave to me: six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\n'\n    expect(recite(4, 6)).toEqual(expected)\n  })\n\n  xit('recites the whole song', () => {\n    const expected =\n      'On the first day of Christmas my true love gave to me: a Partridge in a Pear Tree.\\nOn the second day of Christmas my true love gave to me: two Turtle Doves, and a Partridge in a Pear Tree.\\nOn the third day of Christmas my true love gave to me: three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\nOn the fourth day of Christmas my true love gave to me: four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\nOn the fifth day of Christmas my true love gave to me: five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\nOn the sixth day of Christmas my true love gave to me: six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\nOn the seventh day of Christmas my true love gave to me: seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\nOn the eighth day of Christmas my true love gave to me: eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\nOn the ninth day of Christmas my true love gave to me: nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\nOn the tenth day of Christmas my true love gave to me: ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\nOn the eleventh day of Christmas my true love gave to me: eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\nOn the twelfth day of Christmas my true love gave to me: twelve Drummers Drumming, eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\\n'\n    expect(recite(1, 12)).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/twelve-days/twelve-days.ts",
    "content": "export function recite() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/two-bucket/.docs/instructions.md",
    "content": "# Instructions\n\nGiven two buckets of different size and which bucket to fill first, determine how many actions are required to measure an exact number of liters by strategically transferring fluid between the buckets.\n\nThere are some rules that your solution must follow:\n\n- You can only do one action at a time.\n- There are only 3 possible actions:\n  1. Pouring one bucket into the other bucket until either:\n     a) the first bucket is empty\n     b) the second bucket is full\n  2. Emptying a bucket and doing nothing to the other.\n  3. Filling a bucket and doing nothing to the other.\n- After an action, you may not arrive at a state where the initial starting bucket is empty and the other bucket is full.\n\nYour program will take as input:\n\n- the size of bucket one\n- the size of bucket two\n- the desired number of liters to reach\n- which bucket to fill first, either bucket one or bucket two\n\nYour program should determine:\n\n- the total number of actions it should take to reach the desired number of liters, including the first fill of the starting bucket\n- which bucket should end up with the desired number of liters - either bucket one or bucket two\n- how many liters are left in the other bucket\n\nNote: any time a change is made to either or both buckets counts as one (1) action.\n\nExample:\nBucket one can hold up to 7 liters, and bucket two can hold up to 11 liters.\nLet's say at a given step, bucket one is holding 7 liters and bucket two is holding 8 liters (7,8).\nIf you empty bucket one and make no change to bucket two, leaving you with 0 liters and 8 liters respectively (0,8), that counts as one action.\nInstead, if you had poured from bucket one into bucket two until bucket two was full, resulting in 4 liters in bucket one and 11 liters in bucket two (4,11), that would also only count as one action.\n\nAnother Example:\nBucket one can hold 3 liters, and bucket two can hold up to 5 liters.\nYou are told you must start with bucket one.\nSo your first action is to fill bucket one.\nYou choose to empty bucket one for your second action.\nFor your third action, you may not fill bucket two, because this violates the third rule -- you may not end up in a state after any action where the starting bucket is empty and the other bucket is full.\n\nWritten with <3 at [Fullstack Academy][fullstack] by Lindsay Levine.\n\n[fullstack]: https://www.fullstackacademy.com/\n"
  },
  {
    "path": "exercises/practice/two-bucket/.meta/config.json",
    "content": "{\n  \"authors\": [],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"two-bucket.ts\"\n    ],\n    \"test\": [\n      \"two-bucket.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given two buckets of different size, demonstrate how to measure an exact number of liters.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Water Pouring Problem\",\n  \"source_url\": \"https://demonstrations.wolfram.com/WaterPouringProblem/\"\n}\n"
  },
  {
    "path": "exercises/practice/two-bucket/.meta/proof.ci.ts",
    "content": "class Bucket {\n  public name: string\n  public readonly size: number\n  public amount: number\n\n  constructor(name: string, size: number) {\n    this.name = name\n    this.size = size\n    this.amount = 0\n  }\n\n  // accessors\n  public get available(): number {\n    return this.size - this.amount\n  }\n  public get isFull(): boolean {\n    return this.amount === this.size\n  }\n  public get isEmpty(): boolean {\n    return this.amount === 0\n  }\n\n  public fill(): void {\n    this.amount = this.size\n  }\n  public empty(): void {\n    this.amount = 0\n  }\n\n  public pourInto(other: Bucket): void {\n    const quantity = Math.min(this.amount, other.available)\n    this.amount -= quantity\n    other.amount += quantity\n  }\n}\n\nconst gcd: (a: number, b: number) => number = (a, b) =>\n  b === 0 ? a : gcd(b, a % b)\n\nexport class TwoBucket {\n  private readonly buckets: Bucket[]\n  private readonly goal: number\n  public goalBucket: string | undefined\n  public otherBucket: number | undefined\n\n  constructor(size1: number, size2: number, goal: number, start: string) {\n    this.goal = goal\n    this.buckets = [new Bucket('one', size1), new Bucket('two', size2)]\n\n    if (start === 'two') {\n      this.buckets.reverse()\n    }\n  }\n\n  private get first(): Bucket {\n    return this.buckets[0]\n  }\n  private get second(): Bucket {\n    return this.buckets[1]\n  }\n\n  private validate(): void {\n    if (this.goal > Math.max(this.first.size, this.second.size)) {\n      throw new Error('Goal is bigger than the largest bucket.')\n    }\n\n    if (this.goal % gcd(this.first.size, this.second.size) !== 0) {\n      throw new Error(\n        'Goal must be a multiple of the GCD of the sizes of the two buckets.'\n      )\n    }\n  }\n\n  private moves(): number {\n    this.validate()\n\n    this.first.empty()\n    this.second.empty()\n    let moves = 0\n\n    // fill the start bucket with the first move\n    this.first.fill()\n    moves += 1\n\n    // optimization: if the other bucket is the right size,\n    // fill it immediately with the second move\n    if (this.second.size === this.goal) {\n      this.second.fill()\n      moves += 1\n    }\n\n    while (true) {\n      if (this.first.amount === this.goal) {\n        this.goalBucket = this.first.name\n        this.otherBucket = this.second.amount\n        return moves\n      }\n\n      if (this.second.amount === this.goal) {\n        this.goalBucket = this.second.name\n        this.otherBucket = this.first.amount\n        return moves\n      }\n\n      if (this.first.isEmpty) {\n        this.first.fill()\n      } else if (this.second.isFull) {\n        this.second.empty()\n      } else {\n        this.first.pourInto(this.second)\n      }\n\n      moves += 1\n    }\n  }\n}\n"
  },
  {
    "path": "exercises/practice/two-bucket/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[a6f2b4ba-065f-4dca-b6f0-e3eee51cb661]\ndescription = \"Measure using bucket one of size 3 and bucket two of size 5 - start with bucket one\"\n\n[6c4ea451-9678-4926-b9b3-68364e066d40]\ndescription = \"Measure using bucket one of size 3 and bucket two of size 5 - start with bucket two\"\n\n[3389f45e-6a56-46d5-9607-75aa930502ff]\ndescription = \"Measure using bucket one of size 7 and bucket two of size 11 - start with bucket one\"\n\n[fe0ff9a0-3ea5-4bf7-b17d-6d4243961aa1]\ndescription = \"Measure using bucket one of size 7 and bucket two of size 11 - start with bucket two\"\n\n[0ee1f57e-da84-44f7-ac91-38b878691602]\ndescription = \"Measure one step using bucket one of size 1 and bucket two of size 3 - start with bucket two\"\n\n[eb329c63-5540-4735-b30b-97f7f4df0f84]\ndescription = \"Measure using bucket one of size 2 and bucket two of size 3 - start with bucket one and end with bucket two\"\n\n[58d70152-bf2b-46bb-ad54-be58ebe94c03]\ndescription = \"Measure using bucket one much bigger than bucket two\"\n\n[9dbe6499-caa5-4a58-b5ce-c988d71b8981]\ndescription = \"Measure using bucket one much smaller than bucket two\"\n\n[449be72d-b10a-4f4b-a959-ca741e333b72]\ndescription = \"Not possible to reach the goal\"\n\n[aac38b7a-77f4-4d62-9b91-8846d533b054]\ndescription = \"With the same buckets but a different goal, then it is possible\"\n\n[74633132-0ccf-49de-8450-af4ab2e3b299]\ndescription = \"Goal larger than both buckets is impossible\"\n"
  },
  {
    "path": "exercises/practice/two-bucket/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/two-bucket/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/two-bucket/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/two-bucket/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/two-bucket/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/two-bucket/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/two-bucket/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-two-bucket\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/two-bucket/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/two-bucket/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/two-bucket/two-bucket.test.ts",
    "content": "import { describe, xdescribe, it, expect, xit } from '@jest/globals'\nimport { TwoBucket } from './two-bucket.ts'\n\ndescribe('TwoBucket', () => {\n  describe('Measure using bucket one of size 3 and bucket two of size 5', () => {\n    const buckOne = 3\n    const buckTwo = 5\n    const goal = 1\n\n    it('start with bucket one', () => {\n      // indicates which bucket to fill first\n      const starterBuck = 'one'\n      const twoBucket = new TwoBucket(buckOne, buckTwo, goal, starterBuck)\n      // includes the first fill\n      expect(twoBucket.moves()).toEqual(4)\n      // which bucket should end up with the desired # of liters\n      expect(twoBucket.goalBucket).toEqual('one')\n      // leftover value in the \"other\" bucket once the goal has been reached\n      expect(twoBucket.otherBucket).toEqual(5)\n    })\n\n    xit('start with bucket two', () => {\n      const starterBuck = 'two'\n      const twoBucket = new TwoBucket(buckOne, buckTwo, goal, starterBuck)\n      expect(twoBucket.moves()).toEqual(8)\n      expect(twoBucket.goalBucket).toEqual('two')\n      expect(twoBucket.otherBucket).toEqual(3)\n    })\n  })\n\n  xdescribe('Measure using bucket one of size 7 and bucket two of size 11', () => {\n    const buckOne = 7\n    const buckTwo = 11\n    const goal = 2\n\n    xit('start with bucket one', () => {\n      const starterBuck = 'one'\n      const twoBucket = new TwoBucket(buckOne, buckTwo, goal, starterBuck)\n      expect(twoBucket.moves()).toEqual(14)\n      expect(twoBucket.goalBucket).toEqual('one')\n      expect(twoBucket.otherBucket).toEqual(11)\n    })\n\n    xit('start with bucket two', () => {\n      const starterBuck = 'two'\n      const twoBucket = new TwoBucket(buckOne, buckTwo, goal, starterBuck)\n      expect(twoBucket.moves()).toEqual(18)\n      expect(twoBucket.goalBucket).toEqual('two')\n      expect(twoBucket.otherBucket).toEqual(7)\n    })\n  })\n\n  xdescribe('Measure one step using bucket one of size 1 and bucket two of size 3', () => {\n    xit('start with bucket two', () => {\n      const twoBucket = new TwoBucket(1, 3, 3, 'two')\n      expect(twoBucket.moves()).toEqual(1)\n      expect(twoBucket.goalBucket).toEqual('two')\n      expect(twoBucket.otherBucket).toEqual(0)\n    })\n  })\n\n  xdescribe('Measure using bucket one of size 2 and bucket two of size 3', () => {\n    xit('start with bucket one and end with bucket two', () => {\n      const twoBucket = new TwoBucket(2, 3, 3, 'one')\n      expect(twoBucket.moves()).toEqual(2)\n      expect(twoBucket.goalBucket).toEqual('two')\n      expect(twoBucket.otherBucket).toEqual(2)\n    })\n  })\n\n  xdescribe('Very different sizes', () => {\n    xit('measure using bucket one much bigger than bucket two', () => {\n      const twoBucket = new TwoBucket(5, 1, 2, 'one')\n      expect(twoBucket.moves()).toEqual(6)\n      expect(twoBucket.goalBucket).toEqual('one')\n      expect(twoBucket.otherBucket).toEqual(1)\n    })\n\n    xit('measure using bucket one much smaller than bucket two', () => {\n      const twoBucket = new TwoBucket(3, 15, 9, 'one')\n      expect(twoBucket.moves()).toEqual(6)\n      expect(twoBucket.goalBucket).toEqual('two')\n      expect(twoBucket.otherBucket).toEqual(0)\n    })\n  })\n\n  xdescribe('Reachability', () => {\n    const buckOne = 6\n    const buckTwo = 15\n    const starterBuck = 'one'\n\n    xit('Not possible to reach the goal', () => {\n      const goal = 5\n      const twoBucket = new TwoBucket(buckOne, buckTwo, goal, starterBuck)\n      expect(() => twoBucket.moves()).toThrow()\n    })\n\n    xit('With the same buckets but a different goal, then it is possible', () => {\n      const goal = 9\n      const twoBucket = new TwoBucket(buckOne, buckTwo, goal, starterBuck)\n      expect(twoBucket.moves()).toEqual(10)\n      expect(twoBucket.goalBucket).toEqual('two')\n      expect(twoBucket.otherBucket).toEqual(0)\n    })\n  })\n\n  xdescribe('Goal larger than both buckets', () => {\n    xit('Is impossible', () => {\n      const twoBucket = new TwoBucket(5, 7, 8, 'one')\n      expect(() => twoBucket.moves()).toThrow()\n    })\n  })\n})\n"
  },
  {
    "path": "exercises/practice/two-bucket/two-bucket.ts",
    "content": "export class TwoBucket {\n  constructor() {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  moves() {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  get goalBucket() {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  get otherBucket() {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/two-fer/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to determine what you will say as you give away the extra cookie.\n\nIf you know the person's name (e.g. if they're named Do-yun), then you will say:\n\n```text\nOne for Do-yun, one for me.\n```\n\nIf you don't know the person's name, you will say _you_ instead.\n\n```text\nOne for you, one for me.\n```\n\nHere are some examples:\n\n| Name   | Dialogue                    |\n| :----- | :-------------------------- |\n| Alice  | One for Alice, one for me.  |\n| Bohdan | One for Bohdan, one for me. |\n|        | One for you, one for me.    |\n| Zaphod | One for Zaphod, one for me. |\n"
  },
  {
    "path": "exercises/practice/two-fer/.docs/introduction.md",
    "content": "# Introduction\n\nIn some English accents, when you say \"two for\" quickly, it sounds like \"two fer\".\nTwo-for-one is a way of saying that if you buy one, you also get one for free.\nSo the phrase \"two-fer\" often implies a two-for-one offer.\n\nImagine a bakery that has a holiday offer where you can buy two cookies for the price of one (\"two-fer one!\").\nYou take the offer and (very generously) decide to give the extra cookie to someone else in the queue.\n"
  },
  {
    "path": "exercises/practice/two-fer/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"two-fer.ts\"\n    ],\n    \"test\": [\n      \"two-fer.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Create a sentence of the form \\\"One for X, one for me.\\\".\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source_url\": \"https://github.com/exercism/problem-specifications/issues/757\"\n}\n"
  },
  {
    "path": "exercises/practice/two-fer/.meta/proof.ci.ts",
    "content": "export function twoFer(name = 'you'): string {\n  return `One for ${name}, one for me.`\n}\n"
  },
  {
    "path": "exercises/practice/two-fer/.meta/tests.toml",
    "content": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will not touch any manually added keys,\n# so comments can be added in a \"comment\" key.\n\n[1cf3e15a-a3d7-4a87-aeb3-ba1b43bc8dce]\ndescription = \"no name given\"\n\n[b4c6dbb8-b4fb-42c2-bafd-10785abe7709]\ndescription = \"a name given\"\n\n[3549048d-1a6e-4653-9a79-b0bda163e8d5]\ndescription = \"another name given\"\n"
  },
  {
    "path": "exercises/practice/two-fer/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/two-fer/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/two-fer/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/two-fer/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/two-fer/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/two-fer/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/two-fer/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-two-fer\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/two-fer/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/two-fer/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/two-fer/two-fer.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { twoFer } from './two-fer.ts'\n\ndescribe('TwoFer', () => {\n  it('no name given', () => {\n    const expected = 'One for you, one for me.'\n    expect(twoFer()).toEqual(expected)\n  })\n\n  xit('a name given', () => {\n    const expected = 'One for Alice, one for me.'\n    expect(twoFer('Alice')).toEqual(expected)\n  })\n\n  xit('another name given', () => {\n    const expected = 'One for Bob, one for me.'\n    expect(twoFer('Bob')).toEqual(expected)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/two-fer/two-fer.ts",
    "content": "/**\n * This stub is provided to make it straightforward to get started.\n */\n\nexport function twoFer(): string {\n  // ^                 ^   ^ this is called a return type; it's the type of the\n  // ^                 ^     value that is returned from this function\n  // ^                 ^\n  // ^                 parameters go here\n  // ^\n  // allows the tests to import this function and call it\n  // <-- Your code goes here. You may remove all the commentary in this file.\n}\n"
  },
  {
    "path": "exercises/practice/variable-length-quantity/.docs/instructions.md",
    "content": "# Instructions\n\nImplement variable length quantity encoding and decoding.\n\nThe goal of this exercise is to implement [VLQ][vlq] encoding/decoding.\n\nIn short, the goal of this encoding is to encode integer values in a way that would save bytes.\nOnly the first 7 bits of each byte are significant (right-justified; sort of like an ASCII byte).\nSo, if you have a 32-bit value, you have to unpack it into a series of 7-bit bytes.\nOf course, you will have a variable number of bytes depending upon your integer.\nTo indicate which is the last byte of the series, you leave bit #7 clear.\nIn all of the preceding bytes, you set bit #7.\n\nSo, if an integer is between `0-127`, it can be represented as one byte.\nAlthough VLQ can deal with numbers of arbitrary sizes, for this exercise we will restrict ourselves to only numbers that fit in a 32-bit unsigned integer.\nHere are examples of integers as 32-bit values, and the variable length quantities that they translate to:\n\n```text\n NUMBER        VARIABLE QUANTITY\n00000000              00\n00000040              40\n0000007F              7F\n00000080             81 00\n00002000             C0 00\n00003FFF             FF 7F\n00004000           81 80 00\n00100000           C0 80 00\n001FFFFF           FF FF 7F\n00200000          81 80 80 00\n08000000          C0 80 80 00\n0FFFFFFF          FF FF FF 7F\n```\n\n[vlq]: https://en.wikipedia.org/wiki/Variable-length_quantity\n"
  },
  {
    "path": "exercises/practice/variable-length-quantity/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"variable-length-quantity.ts\"\n    ],\n    \"test\": [\n      \"variable-length-quantity.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Implement variable length quantity encoding and decoding.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"A poor Splice developer having to implement MIDI encoding/decoding.\",\n  \"source_url\": \"https://splice.com\"\n}\n"
  },
  {
    "path": "exercises/practice/variable-length-quantity/.meta/proof.ci.ts",
    "content": "const LENGTH = 7\nconst CONT_BITS = 1 << LENGTH\nconst DATA_BITS = CONT_BITS - 1\n\nfunction encodeOne(val: number): number[] {\n  const buf: number[] = []\n  let left = val\n\n  while (left) {\n    const bits = (left & DATA_BITS) | CONT_BITS // set continuation everywhere\n    left = left >>> LENGTH\n    buf.push(bits)\n  }\n  buf[0] = buf[0] & DATA_BITS // cancel the last continuation\n  return buf.reverse()\n}\n\nfunction decodeOne(buf: number[]): number {\n  let val = 0\n\n  for (let i = 0; i <= buf.length - 1; i++) {\n    val = (val << LENGTH) | (buf[i] & DATA_BITS)\n  }\n  return val >>> 0 // convert to unsigned 32-bit\n}\n\nexport function encode(data: number[]): number[] {\n  let buf: number[] = []\n\n  for (let i = 0; i <= data.length - 1; i++) {\n    buf = buf.concat(encodeOne(data[i]))\n  }\n  return buf\n}\n\nexport function decode(data: number[]): number[] {\n  let start = 0\n  const vals = []\n\n  for (let i = 0; i < data.length; i++) {\n    if (~data[i] & CONT_BITS) {\n      vals.push(decodeOne(data.slice(start, i + 1)))\n      start = i + 1\n    }\n  }\n  if (start < data.length) {\n    throw new Error('Incomplete sequence')\n  }\n  return vals\n}\n"
  },
  {
    "path": "exercises/practice/variable-length-quantity/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[35c9db2e-f781-4c52-b73b-8e76427defd0]\ndescription = \"Encode a series of integers, producing a series of bytes. -> zero\"\n\n[be44d299-a151-4604-a10e-d4b867f41540]\ndescription = \"Encode a series of integers, producing a series of bytes. -> arbitrary single byte\"\n\n[890bc344-cb80-45af-b316-6806a6971e81]\ndescription = \"Encode a series of integers, producing a series of bytes. -> asymmetric single byte\"\n\n[ea399615-d274-4af6-bbef-a1c23c9e1346]\ndescription = \"Encode a series of integers, producing a series of bytes. -> largest single byte\"\n\n[77b07086-bd3f-4882-8476-8dcafee79b1c]\ndescription = \"Encode a series of integers, producing a series of bytes. -> smallest double byte\"\n\n[63955a49-2690-4e22-a556-0040648d6b2d]\ndescription = \"Encode a series of integers, producing a series of bytes. -> arbitrary double byte\"\n\n[4977d113-251b-4d10-a3ad-2f5a7756bb58]\ndescription = \"Encode a series of integers, producing a series of bytes. -> asymmetric double byte\"\n\n[29da7031-0067-43d3-83a7-4f14b29ed97a]\ndescription = \"Encode a series of integers, producing a series of bytes. -> largest double byte\"\n\n[3345d2e3-79a9-4999-869e-d4856e3a8e01]\ndescription = \"Encode a series of integers, producing a series of bytes. -> smallest triple byte\"\n\n[5df0bc2d-2a57-4300-a653-a75ee4bd0bee]\ndescription = \"Encode a series of integers, producing a series of bytes. -> arbitrary triple byte\"\n\n[6731045f-1e00-4192-b5ae-98b22e17e9f7]\ndescription = \"Encode a series of integers, producing a series of bytes. -> asymmetric triple byte\"\n\n[f51d8539-312d-4db1-945c-250222c6aa22]\ndescription = \"Encode a series of integers, producing a series of bytes. -> largest triple byte\"\n\n[da78228b-544f-47b7-8bfe-d16b35bbe570]\ndescription = \"Encode a series of integers, producing a series of bytes. -> smallest quadruple byte\"\n\n[11ed3469-a933-46f1-996f-2231e05d7bb6]\ndescription = \"Encode a series of integers, producing a series of bytes. -> arbitrary quadruple byte\"\n\n[b45ef770-cbba-48c2-bd3c-c6362679516e]\ndescription = \"Encode a series of integers, producing a series of bytes. -> asymmetric quadruple byte\"\n\n[d5f3f3c3-e0f1-4e7f-aad0-18a44f223d1c]\ndescription = \"Encode a series of integers, producing a series of bytes. -> largest quadruple byte\"\n\n[91a18b33-24e7-4bfb-bbca-eca78ff4fc47]\ndescription = \"Encode a series of integers, producing a series of bytes. -> smallest quintuple byte\"\n\n[5f34ff12-2952-4669-95fe-2d11b693d331]\ndescription = \"Encode a series of integers, producing a series of bytes. -> arbitrary quintuple byte\"\n\n[9be46731-7cd5-415c-b960-48061cbc1154]\ndescription = \"Encode a series of integers, producing a series of bytes. -> asymmetric quintuple byte\"\n\n[7489694b-88c3-4078-9864-6fe802411009]\ndescription = \"Encode a series of integers, producing a series of bytes. -> maximum 32-bit integer input\"\n\n[f9b91821-cada-4a73-9421-3c81d6ff3661]\ndescription = \"Encode a series of integers, producing a series of bytes. -> two single-byte values\"\n\n[68694449-25d2-4974-ba75-fa7bb36db212]\ndescription = \"Encode a series of integers, producing a series of bytes. -> two multi-byte values\"\n\n[51a06b5c-de1b-4487-9a50-9db1b8930d85]\ndescription = \"Encode a series of integers, producing a series of bytes. -> many multi-byte values\"\n\n[baa73993-4514-4915-bac0-f7f585e0e59a]\ndescription = \"Decode a series of bytes, producing a series of integers. -> one byte\"\n\n[72e94369-29f9-46f2-8c95-6c5b7a595aee]\ndescription = \"Decode a series of bytes, producing a series of integers. -> two bytes\"\n\n[df5a44c4-56f7-464e-a997-1db5f63ce691]\ndescription = \"Decode a series of bytes, producing a series of integers. -> three bytes\"\n\n[1bb58684-f2dc-450a-8406-1f3452aa1947]\ndescription = \"Decode a series of bytes, producing a series of integers. -> four bytes\"\n\n[cecd5233-49f1-4dd1-a41a-9840a40f09cd]\ndescription = \"Decode a series of bytes, producing a series of integers. -> maximum 32-bit integer\"\n\n[e7d74ba3-8b8e-4bcb-858d-d08302e15695]\ndescription = \"Decode a series of bytes, producing a series of integers. -> incomplete sequence causes error\"\n\n[aa378291-9043-4724-bc53-aca1b4a3fcb6]\ndescription = \"Decode a series of bytes, producing a series of integers. -> incomplete sequence causes error, even if value is zero\"\n\n[a91e6f5a-c64a-48e3-8a75-ce1a81e0ebee]\ndescription = \"Decode a series of bytes, producing a series of integers. -> multiple values\"\n"
  },
  {
    "path": "exercises/practice/variable-length-quantity/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/variable-length-quantity/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/variable-length-quantity/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/variable-length-quantity/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/variable-length-quantity/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/variable-length-quantity/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/variable-length-quantity/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-variable-length-quantity\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/variable-length-quantity/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/variable-length-quantity/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/variable-length-quantity/variable-length-quantity.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { encode, decode } from './variable-length-quantity.ts'\n\ndescribe('VariableLengthQuantity', () => {\n  describe('Encode a series of integers, producing a series of bytes.', () => {\n    it('zero', () => {\n      expect(encode([0])).toEqual([0])\n    })\n\n    xit('arbitrary single byte', () => {\n      expect(encode([0x40])).toEqual([0x40])\n    })\n\n    xit('asymmetric single byte', () => {\n      expect(encode([0x53])).toEqual([0x53])\n    })\n\n    xit('largest single byte', () => {\n      expect(encode([0x7f])).toEqual([0x7f])\n    })\n\n    xit('smallest double byte', () => {\n      expect(encode([0x80])).toEqual([0x81, 0])\n    })\n\n    xit('arbitrary double byte', () => {\n      expect(encode([0x2000])).toEqual([0xc0, 0])\n    })\n\n    xit('asymmetric double byte', () => {\n      expect(encode([0xad])).toEqual([0x81, 0x2d])\n    })\n\n    xit('largest double byte', () => {\n      expect(encode([0x3fff])).toEqual([0xff, 0x7f])\n    })\n\n    xit('smallest triple byte', () => {\n      expect(encode([0x4000])).toEqual([0x81, 0x80, 0])\n    })\n\n    xit('arbitrary triple byte', () => {\n      expect(encode([0x100000])).toEqual([0xc0, 0x80, 0])\n    })\n\n    xit('asymmetric triple byte', () => {\n      expect(encode([0x1d59c])).toEqual([0x87, 0xab, 0x1c])\n    })\n\n    xit('largest triple byte', () => {\n      expect(encode([0x1fffff])).toEqual([0xff, 0xff, 0x7f])\n    })\n\n    xit('smallest quadruple byte', () => {\n      expect(encode([0x200000])).toEqual([0x81, 0x80, 0x80, 0])\n    })\n\n    xit('arbitrary quadruple byte', () => {\n      expect(encode([0x8000000])).toEqual([0xc0, 0x80, 0x80, 0])\n    })\n\n    xit('asymmetric quadruple byte', () => {\n      expect(encode([0x357704])).toEqual([0x81, 0xd5, 0xee, 0x04])\n    })\n\n    xit('largest quadruple byte', () => {\n      expect(encode([0xfffffff])).toEqual([0xff, 0xff, 0xff, 0x7f])\n    })\n\n    xit('smallest quintuple byte', () => {\n      expect(encode([0x10000000])).toEqual([0x81, 0x80, 0x80, 0x80, 0])\n    })\n\n    xit('arbitrary quintuple byte', () => {\n      expect(encode([0xff000000])).toEqual([0x8f, 0xf8, 0x80, 0x80, 0])\n    })\n\n    xit('asymmetric quintuple byte', () => {\n      expect(encode([0x86656105])).toEqual([0x88, 0xb3, 0x95, 0xc2, 0x05])\n    })\n\n    xit('maximum 32-bit integer input', () => {\n      expect(encode([0xffffffff])).toEqual([0x8f, 0xff, 0xff, 0xff, 0x7f])\n    })\n\n    xit('two single-byte values', () => {\n      expect(encode([0x40, 0x7f])).toEqual([0x40, 0x7f])\n    })\n\n    xit('two multi-byte values', () => {\n      expect(encode([0x4000, 0x123456])).toEqual([\n        0x81, 0x80, 0, 0xc8, 0xe8, 0x56,\n      ])\n    })\n\n    xit('many multi-byte values', () => {\n      const input = [0x2000, 0x123456, 0xfffffff, 0, 0x3fff, 0x4000]\n      const expected = [\n        0xc0, 0, 0xc8, 0xe8, 0x56, 0xff, 0xff, 0xff, 0x7f, 0, 0xff, 0x7f, 0x81,\n        0x80, 0,\n      ]\n      expect(encode(input)).toEqual(expected)\n    })\n  })\n\n  describe('Decode a series of bytes, producing a series of integers.', () => {\n    xit('one byte', () => {\n      expect(decode([0x7f])).toEqual([0x7f])\n    })\n\n    xit('two bytes', () => {\n      expect(decode([0xc0, 0])).toEqual([0x2000])\n    })\n\n    xit('three bytes', () => {\n      expect(decode([0xff, 0xff, 0x7f])).toEqual([0x1fffff])\n    })\n\n    xit('four bytes', () => {\n      expect(decode([0x81, 0x80, 0x80, 0])).toEqual([0x200000])\n    })\n\n    xit('maximum 32-bit integer', () => {\n      expect(decode([0x8f, 0xff, 0xff, 0xff, 0x7f])).toEqual([0xffffffff])\n    })\n\n    xit('incomplete sequence causes error', () => {\n      expect(() => {\n        decode([0xff])\n      }).toThrow('Incomplete sequence')\n    })\n\n    xit('incomplete sequence causes error, even if value is zero', () => {\n      expect(() => {\n        decode([0x80])\n      }).toThrow('Incomplete sequence')\n    })\n\n    xit('multiple values', () => {\n      const input = [\n        0xc0, 0, 0xc8, 0xe8, 0x56, 0xff, 0xff, 0xff, 0x7f, 0, 0xff, 0x7f, 0x81,\n        0x80, 0,\n      ]\n      const expected = [0x2000, 0x123456, 0xfffffff, 0, 0x3fff, 0x4000]\n      expect(decode(input)).toEqual(expected)\n    })\n  })\n})\n"
  },
  {
    "path": "exercises/practice/variable-length-quantity/variable-length-quantity.ts",
    "content": "export function encode() {\n  throw new Error('Remove this line and implement the function')\n}\n\nexport function decode() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/word-count/.docs/instructions.md",
    "content": "# Instructions\n\nYour task is to count how many times each word occurs in a subtitle of a drama.\n\nThe subtitles from these dramas use only ASCII characters.\n\nThe characters often speak in casual English, using contractions like _they're_ or _it's_.\nThough these contractions come from two words (e.g. _we are_), the contraction (_we're_) is considered a single word.\n\nWords can be separated by any form of punctuation (e.g. \":\", \"!\", or \"?\") or whitespace (e.g. \"\\t\", \"\\n\", or \" \").\nThe only punctuation that does not separate words is the apostrophe in contractions.\n\nNumbers are considered words.\nIf the subtitles say _It costs 100 dollars._ then _100_ will be its own word.\n\nWords are case insensitive.\nFor example, the word _you_ occurs three times in the following sentence:\n\n> You come back, you hear me? DO YOU HEAR ME?\n\nThe ordering of the word counts in the results doesn't matter.\n\nHere's an example that incorporates several of the elements discussed above:\n\n- simple words\n- contractions\n- numbers\n- case insensitive words\n- punctuation (including apostrophes) to separate words\n- different forms of whitespace to separate words\n\n`\"That's the password: 'PASSWORD 123'!\", cried the Special Agent.\\nSo I fled.`\n\nThe mapping for this subtitle would be:\n\n```text\n123: 1\nagent: 1\ncried: 1\nfled: 1\ni: 1\npassword: 2\nso: 1\nspecial: 1\nthat's: 1\nthe: 2\n```\n"
  },
  {
    "path": "exercises/practice/word-count/.docs/introduction.md",
    "content": "# Introduction\n\nYou teach English as a foreign language to high school students.\n\nYou've decided to base your entire curriculum on TV shows.\nYou need to analyze which words are used, and how often they're repeated.\n\nThis will let you choose the simplest shows to start with, and to gradually increase the difficulty as time passes.\n"
  },
  {
    "path": "exercises/practice/word-count/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"masters3d\"\n  ],\n  \"contributors\": [\n    \"lukaszklis\",\n    \"SleeplessByte\",\n    \"angelikatyborska\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"word-count.ts\"\n    ],\n    \"test\": [\n      \"word-count.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Given a phrase, count the occurrences of each word in that phrase.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"This is a classic toy problem, but we were reminded of it by seeing it in the Go Tour.\"\n}\n"
  },
  {
    "path": "exercises/practice/word-count/.meta/proof.ci.ts",
    "content": "export function count(input: string): Map<string, number> {\n  const inputArray = input\n    .trim()\n    .toLowerCase()\n    .split(/[ ,\\n]+/g)\n  const inputMap = new Map<string, number>()\n\n  for (const each of inputArray) {\n    const word = each.replace(/[.,!:\"&@$%^?]|^'|'$/g, '')\n\n    if (word === '') {\n      continue\n    }\n    const value = inputMap.get(word) || 0\n\n    inputMap.set(word, value + 1)\n  }\n  return inputMap\n}\n"
  },
  {
    "path": "exercises/practice/word-count/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[61559d5f-2cad-48fb-af53-d3973a9ee9ef]\ndescription = \"count one word\"\n\n[5abd53a3-1aed-43a4-a15a-29f88c09cbbd]\ndescription = \"count one of each word\"\n\n[2a3091e5-952e-4099-9fac-8f85d9655c0e]\ndescription = \"multiple occurrences of a word\"\n\n[e81877ae-d4da-4af4-931c-d923cd621ca6]\ndescription = \"handles cramped lists\"\n\n[7349f682-9707-47c0-a9af-be56e1e7ff30]\ndescription = \"handles expanded lists\"\n\n[a514a0f2-8589-4279-8892-887f76a14c82]\ndescription = \"ignore punctuation\"\n\n[d2e5cee6-d2ec-497b-bdc9-3ebe092ce55e]\ndescription = \"include numbers\"\n\n[dac6bc6a-21ae-4954-945d-d7f716392dbf]\ndescription = \"normalize case\"\n\n[4185a902-bdb0-4074-864c-f416e42a0f19]\ndescription = \"with apostrophes\"\ninclude = false\n\n[4ff6c7d7-fcfc-43ef-b8e7-34ff1837a2d3]\ndescription = \"with apostrophes\"\nreimplements = \"4185a902-bdb0-4074-864c-f416e42a0f19\"\n\n[be72af2b-8afe-4337-b151-b297202e4a7b]\ndescription = \"with quotations\"\n\n[8d6815fe-8a51-4a65-96f9-2fb3f6dc6ed6]\ndescription = \"substrings from the beginning\"\n\n[c5f4ef26-f3f7-4725-b314-855c04fb4c13]\ndescription = \"multiple spaces not detected as a word\"\n\n[50176e8a-fe8e-4f4c-b6b6-aa9cf8f20360]\ndescription = \"alternating word separators not detected as a word\"\n\n[6d00f1db-901c-4bec-9829-d20eb3044557]\ndescription = \"quotation for word with apostrophe\"\n"
  },
  {
    "path": "exercises/practice/word-count/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/word-count/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/word-count/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/word-count/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/word-count/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/word-count/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/word-count/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-word-count\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/word-count/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/word-count/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/word-count/word-count.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { count } from './word-count.ts'\n\ndescribe('count()', () => {\n  it('counts one word', () => {\n    const expectedCounts = new Map(Object.entries({ word: 1 }))\n    expect(count('word')).toEqual(expectedCounts)\n  })\n\n  xit('counts one of each', () => {\n    const expectedCounts = new Map(Object.entries({ one: 1, of: 1, each: 1 }))\n    expect(count('one of each')).toEqual(expectedCounts)\n  })\n\n  xit('counts multiple occurrences', () => {\n    const expectedCounts = new Map(\n      Object.entries({ one: 1, fish: 4, two: 1, red: 1, blue: 1 })\n    )\n    expect(count('one fish two fish red fish blue fish')).toEqual(\n      expectedCounts\n    )\n  })\n\n  xit('handles cramped lists', () => {\n    const expectedCounts = new Map(Object.entries({ one: 1, two: 1, three: 1 }))\n    expect(count('one,two,three')).toEqual(expectedCounts)\n  })\n\n  xit('handles expanded lists', () => {\n    const expectedCounts = new Map(Object.entries({ one: 1, two: 1, three: 1 }))\n    expect(count('one,\\ntwo,\\nthree')).toEqual(expectedCounts)\n  })\n\n  xit('ignores punctuation', () => {\n    const expectedCounts = new Map(\n      Object.entries({\n        car: 1,\n        carpet: 1,\n        as: 1,\n        java: 1,\n        javascript: 1,\n      })\n    )\n    expect(count('car: carpet as java: javascript!!&@$%^&\"')).toEqual(\n      expectedCounts\n    )\n  })\n\n  xit('includes numbers', () => {\n    const expectedCounts = new Map(Object.entries({ testing: 2, 1: 1, 2: 1 }))\n    expect(count('testing, 1, 2 testing')).toEqual(expectedCounts)\n  })\n\n  xit('normalizes case', () => {\n    const expectedCounts = new Map(Object.entries({ go: 3, stop: 2 }))\n    expect(count('go Go GO Stop stop')).toEqual(expectedCounts)\n  })\n\n  xit('with apostrophes', () => {\n    const expectedCounts = new Map(\n      Object.entries({\n        first: 1,\n        \"don't\": 2,\n        laugh: 1,\n        then: 1,\n        cry: 1,\n        \"you're\": 1,\n        getting: 1,\n        it: 1,\n      })\n    )\n    expect(\n      count(\"'First: don't laugh. Then: don't cry. You're getting it.'\")\n    ).toEqual(expectedCounts)\n  })\n\n  xit('substrings from the beginning', () => {\n    const expectedCounts = new Map(\n      Object.entries({\n        joe: 1,\n        \"can't\": 1,\n        tell: 1,\n        between: 1,\n        app: 1,\n        apple: 1,\n        and: 1,\n        a: 1,\n      })\n    )\n    expect(count(\"Joe can't tell between app, apple and a.\")).toEqual(\n      expectedCounts\n    )\n  })\n\n  xit('multiple spaces not detected as a word', () => {\n    const expectedCounts = new Map(\n      Object.entries({ multiple: 1, whitespaces: 1 })\n    )\n    expect(count(' multiple   whitespaces')).toEqual(expectedCounts)\n  })\n\n  xit('alternating word separators not detected as a word', () => {\n    const expectedCounts = new Map(Object.entries({ one: 1, two: 1, three: 1 }))\n    expect(count(\",\\n,one,\\n ,two \\n 'three'\")).toEqual(expectedCounts)\n  })\n\n  xit('quotation for word with apostrophe', () => {\n    const expectedCounts = new Map(Object.entries({ can: 1, \"can't\": 2 }))\n    expect(count(\"can, can't, 'can't'\")).toEqual(expectedCounts)\n  })\n\n  xit('handles properties that exist on Object’s prototype', () => {\n    const expectedCounts = new Map(\n      Object.entries({\n        reserved: 1,\n        words: 1,\n        like: 1,\n        constructor: 1,\n        and: 1,\n        tostring: 1,\n        ok: 1,\n      })\n    )\n    expect(count('reserved words like constructor and toString ok?')).toEqual(\n      expectedCounts\n    )\n  })\n})\n"
  },
  {
    "path": "exercises/practice/word-count/word-count.ts",
    "content": "export function count() {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/word-search/.docs/instructions.md",
    "content": "# Instructions\n\nIn word search puzzles you get a square of letters and have to find specific words in them.\n\nFor example:\n\n```text\njefblpepre\ncamdcimgtc\noivokprjsm\npbwasqroua\nrixilelhrs\nwolcqlirpc\nscreeaumgr\nalxhpburyi\njalaycalmp\nclojurermt\n```\n\nThere are several programming languages hidden in the above square.\n\nWords can be hidden in all kinds of directions: left-to-right, right-to-left, vertical and diagonal.\n\nGiven a puzzle and a list of words return the location of the first and last letter of each word.\n"
  },
  {
    "path": "exercises/practice/word-search/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"msomji\"\n  ],\n  \"contributors\": [\n    \"ErikSchierboom\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"word-search.ts\"\n    ],\n    \"test\": [\n      \"word-search.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Create a program to solve a word search puzzle.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  }\n}\n"
  },
  {
    "path": "exercises/practice/word-search/.meta/proof.ci.ts",
    "content": "interface Result {\n  start: number[]\n  end: number[]\n}\n\nexport class WordSearch {\n  private grid: string[]\n  constructor(grid: string[]) {\n    this.grid = grid\n  }\n  private findCoordsWhereLetterMatch(\n    currentLetter: string,\n    board: string[]\n  ): number[][] {\n    return board.reduce(\n      (accumulatedCoordinates: number[][], row: string, rowNumber: number) => [\n        ...accumulatedCoordinates,\n        ...row\n          .split('')\n          .reduce(\n            (\n              matchingLetterIndecies: number[],\n              letter: string,\n              index: number\n            ) =>\n              letter === currentLetter\n                ? [...matchingLetterIndecies, index]\n                : matchingLetterIndecies,\n            []\n          )\n          .reduce(\n            (coordinates: number[][], col) => [\n              ...coordinates,\n              [rowNumber, col],\n            ],\n            []\n          ),\n      ],\n      []\n    )\n  }\n\n  private getCoordsOfSurroundingLetters(\n    initialCoord: number[],\n    totalRows: number,\n    totalColumns: number\n  ): number[][] {\n    const top: number[] = [initialCoord[0] - 1, initialCoord[1]]\n    const bottom: number[] = [initialCoord[0] + 1, initialCoord[1]]\n\n    const right: number[] = [initialCoord[0], initialCoord[1] + 1]\n    const left: number[] = [initialCoord[0], initialCoord[1] - 1]\n\n    const topRight: number[] = [initialCoord[0] + 1, initialCoord[1] + 1]\n    const topLeft: number[] = [initialCoord[0] + 1, initialCoord[1] - 1]\n\n    const bottomRight: number[] = [initialCoord[0] - 1, initialCoord[1] + 1]\n    const bottomLeft: number[] = [initialCoord[0] - 1, initialCoord[1] - 1]\n\n    return [\n      top,\n      bottom,\n      right,\n      left,\n      topRight,\n      topLeft,\n      bottomRight,\n      bottomLeft,\n    ].filter(\n      (coordinates: number[]) =>\n        coordinates[0] <= totalRows - 1 &&\n        coordinates[1] <= totalColumns - 1 &&\n        coordinates[0] >= 0 &&\n        coordinates[1] >= 0\n    )\n  }\n\n  private getValueFromCoordinate(\n    board: string[],\n    coordinates: number[]\n  ): string {\n    return (\n      board[coordinates[0]] && board[coordinates[0]].split('')[coordinates[1]]\n    )\n  }\n\n  private matchingValues(\n    board: string[],\n    coordinates: number[],\n    letter: string\n  ): boolean {\n    return this.getValueFromCoordinate(board, coordinates) === letter\n  }\n\n  private getDirectionFunction(\n    originCoords: number[],\n    destinationCoords: number[]\n  ): (currentCoords: number[]) => number[] {\n    return (nextCoord: number[]): number[] => [\n      nextCoord[0] + (destinationCoords[0] - originCoords[0]),\n      nextCoord[1] + (destinationCoords[1] - originCoords[1]),\n    ]\n  }\n\n  private getValidNeighbouringCoordinates(\n    initial: number[],\n    board: string[],\n    letter: string\n  ): number[][] {\n    return this.getCoordsOfSurroundingLetters(\n      initial,\n      board.length,\n      board[0].length\n    ).filter((neighbouringCoordinate) =>\n      this.matchingValues(board, neighbouringCoordinate, letter)\n    )\n  }\n\n  private findOne(word: string, board: string[]): Result {\n    const allPossibleStartCoords: number[][] = this.findCoordsWhereLetterMatch(\n      word[0],\n      board\n    )\n    const allPossibleCoordsForFirstTwoLetters: number[][][] =\n      allPossibleStartCoords.reduce((accum: number[][][], initial) => {\n        return [\n          ...accum,\n          ...this.getValidNeighbouringCoordinates(initial, board, word[1]).map(\n            (secondCoordinate) => [initial, secondCoordinate]\n          ),\n        ]\n      }, [])\n\n    const allPossiblePaths: number[][][] =\n      allPossibleCoordsForFirstTwoLetters.map((coordsSoFar: number[][]) => {\n        const incrementFunction = this.getDirectionFunction(\n          coordsSoFar[0],\n          coordsSoFar[1]\n        )\n        return word\n          .substr(2, word.length)\n          .split('')\n          .reduce(\n            (accum: number[][], _) => [\n              ...accum,\n              incrementFunction(accum[accum.length - 1]),\n            ],\n            coordsSoFar\n          )\n      })\n\n    const validPaths: number[][][] = allPossiblePaths.reduce(\n      (result: number[][][], path: number[][]) =>\n        word\n          .split('')\n          .map((letter, index) =>\n            this.matchingValues(board, path[index], letter)\n          )\n          .includes(false)\n          ? result\n          : [...result, path],\n      [] as number[][][]\n    )\n\n    return validPaths.reduce(\n      (_: Result, path: number[][]) => ({\n        start: path[0].map((c) => c + 1),\n        end: path[path.length - 1].map((c) => c + 1),\n      }),\n      {} as Result\n    )\n  }\n\n  public find(\n    words: string[]\n  ): { [word: string]: Result } | { [word: string]: undefined } {\n    return words.reduce(\n      (\n        accum: { [word: string]: Result } | { [word: string]: undefined },\n        word\n      ) => {\n        const result = this.findOne(word, this.grid)\n        accum[word] = Object.keys(result).length === 0 ? undefined : result\n\n        return accum\n      },\n      {} as { [word: string]: Result } | { [word: string]: undefined }\n    )\n  }\n}\n"
  },
  {
    "path": "exercises/practice/word-search/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[b4057815-0d01-41f0-9119-6a91f54b2a0a]\ndescription = \"Should accept an initial game grid and a target search word\"\n\n[6b22bcc5-6cbf-4674-931b-d2edbff73132]\ndescription = \"Should locate one word written left to right\"\n\n[ff462410-434b-442d-9bc3-3360c75f34a8]\ndescription = \"Should locate the same word written left to right in a different position\"\n\n[a02febae-6347-443e-b99c-ab0afb0b8fca]\ndescription = \"Should locate a different left to right word\"\n\n[e42e9987-6304-4e13-8232-fa07d5280130]\ndescription = \"Should locate that different left to right word in a different position\"\n\n[9bff3cee-49b9-4775-bdfb-d55b43a70b2f]\ndescription = \"Should locate a left to right word in two line grid\"\n\n[851a35fb-f499-4ec1-9581-395a87903a22]\ndescription = \"Should locate a left to right word in three line grid\"\n\n[2f3dcf84-ba7d-4b75-8b8d-a3672b32c035]\ndescription = \"Should locate a left to right word in ten line grid\"\n\n[006d4856-f365-4e84-a18c-7d129ce9eefb]\ndescription = \"Should locate that left to right word in a different position in a ten line grid\"\n\n[eff7ac9f-ff11-443e-9747-40850c12ab60]\ndescription = \"Should locate a different left to right word in a ten line grid\"\n\n[dea39f86-8c67-4164-8884-13bfc48bd13b]\ndescription = \"Should locate multiple words\"\n\n[29e6a6a5-f80c-48a6-8e68-05bbbe187a09]\ndescription = \"Should locate a single word written right to left\"\n\n[3cf34428-b43f-48b6-b332-ea0b8836011d]\ndescription = \"Should locate multiple words written in different horizontal directions\"\n\n[2c8cd344-a02f-464b-93b6-8bf1bd890003]\ndescription = \"Should locate words written top to bottom\"\n\n[9ee1e43d-e59d-4c32-9a5f-6a22d4a1550f]\ndescription = \"Should locate words written bottom to top\"\n\n[6a21a676-f59e-4238-8e88-9f81015afae9]\ndescription = \"Should locate words written top left to bottom right\"\n\n[c9125189-1861-4b0d-a14e-ba5dab29ca7c]\ndescription = \"Should locate words written bottom right to top left\"\n\n[b19e2149-7fc5-41ec-a8a9-9bc6c6c38c40]\ndescription = \"Should locate words written bottom left to top right\"\n\n[69e1d994-a6d7-4e24-9b5a-db76751c2ef8]\ndescription = \"Should locate words written top right to bottom left\"\n\n[695531db-69eb-463f-8bad-8de3bf5ef198]\ndescription = \"Should fail to locate a word that is not in the puzzle\"\n\n[fda5b937-6774-4a52-8f89-f64ed833b175]\ndescription = \"Should fail to locate words that are not on horizontal, vertical, or diagonal lines\"\n\n[5b6198eb-2847-4e2f-8efe-65045df16bd3]\ndescription = \"Should not concatenate different lines to find a horizontal word\"\n\n[eba44139-a34f-4a92-98e1-bd5f259e5769]\ndescription = \"Should not wrap around horizontally to find a word\"\n\n[cd1f0fa8-76af-4167-b105-935f78364dac]\ndescription = \"Should not wrap around vertically to find a word\"\n"
  },
  {
    "path": "exercises/practice/word-search/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/word-search/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/word-search/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/word-search/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/word-search/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/word-search/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/word-search/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-word-search\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/word-search/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/word-search/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/word-search/word-search.test.ts",
    "content": "import { describe, xdescribe, it, expect, xit } from '@jest/globals'\nimport { WordSearch } from './word-search.ts'\n\ndescribe('single line grids', () => {\n  it('should accept an initial game grid', () => {\n    const grid = ['jefblpepre']\n    const wordSearch = new WordSearch(grid)\n\n    expect(wordSearch instanceof WordSearch).toEqual(true)\n  })\n\n  xit('should accept a target search word', () => {\n    const grid = ['jefblpepre']\n    const wordSearch = new WordSearch(grid)\n\n    expect(wordSearch.find(['glasnost'])).toEqual({ glasnost: undefined })\n  })\n\n  xit('should locate a word written left to right', () => {\n    const grid = ['clojurermt']\n    const expectedResults = {\n      clojure: {\n        start: [1, 1],\n        end: [1, 7],\n      },\n    }\n    const wordSearch = new WordSearch(grid)\n\n    expect(wordSearch.find(['clojure'])).toEqual(expectedResults)\n  })\n\n  xit('should locate the same word written left to right in a different position', () => {\n    const grid = ['mtclojurer']\n    const expectedResults = {\n      clojure: {\n        start: [1, 3],\n        end: [1, 9],\n      },\n    }\n    const wordSearch = new WordSearch(grid)\n\n    expect(wordSearch.find(['clojure'])).toEqual(expectedResults)\n  })\n\n  xit('should locate a different left to right word', () => {\n    const grid = ['coffeelplx']\n    const expectedResults = {\n      coffee: {\n        start: [1, 1],\n        end: [1, 6],\n      },\n    }\n    const wordSearch = new WordSearch(grid)\n\n    expect(wordSearch.find(['coffee'])).toEqual(expectedResults)\n  })\n\n  xit('should locate that different left to right word in a different position', () => {\n    const grid = ['xcoffeezlp']\n    const expectedResults = {\n      coffee: {\n        start: [1, 2],\n        end: [1, 7],\n      },\n    }\n    const wordSearch = new WordSearch(grid)\n\n    expect(wordSearch.find(['coffee'])).toEqual(expectedResults)\n  })\n})\n\nxdescribe('multi line grids', () => {\n  xit('should locate a left to right word in a two line grid', () => {\n    const grid = ['jefblpepre', 'clojurermt']\n\n    const expectedResults = {\n      clojure: {\n        start: [2, 1],\n        end: [2, 7],\n      },\n    }\n\n    const wordSearch = new WordSearch(grid)\n\n    expect(wordSearch.find(['clojure'])).toEqual(expectedResults)\n  })\n\n  xit('should locate a left to right word in a different position in a two line grid', () => {\n    const grid = ['jefblpepre', 'tclojurerm']\n    const expectedResults = {\n      clojure: {\n        start: [2, 2],\n        end: [2, 8],\n      },\n    }\n    const wordSearch = new WordSearch(grid)\n\n    expect(wordSearch.find(['clojure'])).toEqual(expectedResults)\n  })\n\n  xit('should locate a left to right word in a three line grid', () => {\n    const grid = ['camdcimgtc', 'jefblpepre', 'clojurermt']\n    const expectedResults = {\n      clojure: {\n        start: [3, 1],\n        end: [3, 7],\n      },\n    }\n    const wordSearch = new WordSearch(grid)\n\n    expect(wordSearch.find(['clojure'])).toEqual(expectedResults)\n  })\n\n  xit('should locate a left to right word in a ten line grid', () => {\n    const grid = [\n      'jefblpepre',\n      'camdcimgtc',\n      'oivokprjsm',\n      'pbwasqroua',\n      'rixilelhrs',\n      'wolcqlirpc',\n      'screeaumgr',\n      'alxhpburyi',\n      'jalaycalmp',\n      'clojurermt',\n    ]\n\n    const expectedResults = {\n      clojure: {\n        start: [10, 1],\n        end: [10, 7],\n      },\n    }\n    const wordSearch = new WordSearch(grid)\n\n    expect(wordSearch.find(['clojure'])).toEqual(expectedResults)\n  })\n\n  xit('should locate a left to right word in a different position in a ten line grid', () => {\n    const grid = [\n      'jefblpepre',\n      'camdcimgtc',\n      'oivokprjsm',\n      'pbwasqroua',\n      'rixilelhrs',\n      'wolcqlirpc',\n      'screeaumgr',\n      'alxhpburyi',\n      'clojurermt',\n      'jalaycalmp',\n    ]\n\n    const expectedResults = {\n      clojure: {\n        start: [9, 1],\n        end: [9, 7],\n      },\n    }\n    const wordSearch = new WordSearch(grid)\n\n    expect(wordSearch.find(['clojure'])).toEqual(expectedResults)\n  })\n\n  xit('should locate a different left to right word in a ten line grid', () => {\n    const grid = [\n      'jefblpepre',\n      'camdcimgtc',\n      'oivokprjsm',\n      'pbwasqroua',\n      'rixilelhrs',\n      'wolcqlirpc',\n      'screeaumgr',\n      'alxhpburyi',\n      'clojurermt',\n      'jalaycalmp',\n    ]\n    const expectedResults = {\n      scree: {\n        start: [7, 1],\n        end: [7, 5],\n      },\n    }\n    const wordSearch = new WordSearch(grid)\n\n    expect(wordSearch.find(['scree'])).toEqual(expectedResults)\n  })\n})\n\nxdescribe('multiple words', () => {\n  xit('should locate two words written left to right', () => {\n    const grid = [\n      'aefblpepre',\n      'camdcimgtc',\n      'oivokprjsm',\n      'pbwasqroua',\n      'rixilelhrs',\n      'wolcqlirpc',\n      'screeaumgr',\n      'alxhpburyi',\n      'jalaycalmp',\n      'clojurermt',\n      'xjavamtzlp',\n    ]\n    const expectedResults = {\n      clojure: {\n        start: [10, 1],\n        end: [10, 7],\n      },\n      java: {\n        start: [11, 2],\n        end: [11, 5],\n      },\n    }\n    const wordSearch = new WordSearch(grid)\n\n    expect(wordSearch.find(['java', 'clojure'])).toEqual(expectedResults)\n  })\n})\n\nxdescribe('different directions', () => {\n  xit('should locate a single word written right to left', () => {\n    const grid = ['rixilelhrs']\n    const expectedResults = {\n      elixir: {\n        start: [1, 6],\n        end: [1, 1],\n      },\n    }\n    const wordSearch = new WordSearch(grid)\n\n    expect(wordSearch.find(['elixir'])).toEqual(expectedResults)\n  })\n\n  xit('should locate multiple words written in different horizontal directions', () => {\n    const grid = [\n      'jefblpepre',\n      'camdcimgtc',\n      'oivokprjsm',\n      'pbwasqroua',\n      'rixilelhrs',\n      'wolcqlirpc',\n      'screeaumgr',\n      'alxhpburyi',\n      'jalaycalmp',\n      'clojurermt',\n    ]\n    const expectedResults = {\n      clojure: {\n        start: [10, 1],\n        end: [10, 7],\n      },\n      elixir: {\n        start: [5, 6],\n        end: [5, 1],\n      },\n    }\n    const wordSearch = new WordSearch(grid)\n\n    expect(wordSearch.find(['elixir', 'clojure'])).toEqual(expectedResults)\n  })\n})\n\nxdescribe('vertical directions', () => {\n  xit('should locate words written top to bottom', () => {\n    const grid = [\n      'jefblpepre',\n      'camdcimgtc',\n      'oivokprjsm',\n      'pbwasqroua',\n      'rixilelhrs',\n      'wolcqlirpc',\n      'screeaumgr',\n      'alxhpburyi',\n      'jalaycalmp',\n      'clojurermt',\n    ]\n    const expectedResults = {\n      clojure: {\n        start: [10, 1],\n        end: [10, 7],\n      },\n      elixir: {\n        start: [5, 6],\n        end: [5, 1],\n      },\n      ecmascript: {\n        start: [1, 10],\n        end: [10, 10],\n      },\n    }\n    const wordSearch = new WordSearch(grid)\n    expect(wordSearch.find(['elixir', 'clojure', 'ecmascript'])).toEqual(\n      expectedResults\n    )\n  })\n\n  xit('should locate words written bottom to top', () => {\n    const grid = [\n      'jefblpepre',\n      'camdcimgtc',\n      'oivokprjsm',\n      'pbwasqroua',\n      'rixilelhrs',\n      'wolcqlirpc',\n      'screeaumgr',\n      'alxhpburyi',\n      'jalaycalmp',\n      'clojurermt',\n    ]\n    const expectedResults = {\n      clojure: {\n        start: [10, 1],\n        end: [10, 7],\n      },\n      elixir: {\n        start: [5, 6],\n        end: [5, 1],\n      },\n      ecmascript: {\n        start: [1, 10],\n        end: [10, 10],\n      },\n      rust: {\n        start: [5, 9],\n        end: [2, 9],\n      },\n    }\n    const wordSearch = new WordSearch(grid)\n\n    expect(\n      wordSearch.find(['elixir', 'clojure', 'ecmascript', 'rust'])\n    ).toEqual(expectedResults)\n  })\n\n  xit('should locate words written top left to bottom right', () => {\n    const grid = [\n      'jefblpepre',\n      'camdcimgtc',\n      'oivokprjsm',\n      'pbwasqroua',\n      'rixilelhrs',\n      'wolcqlirpc',\n      'screeaumgr',\n      'alxhpburyi',\n      'jalaycalmp',\n      'clojurermt',\n    ]\n    const expectedResults = {\n      clojure: {\n        start: [10, 1],\n        end: [10, 7],\n      },\n      elixir: {\n        start: [5, 6],\n        end: [5, 1],\n      },\n      ecmascript: {\n        start: [1, 10],\n        end: [10, 10],\n      },\n      rust: {\n        start: [5, 9],\n        end: [2, 9],\n      },\n      java: {\n        start: [1, 1],\n        end: [4, 4],\n      },\n    }\n    const wordSearch = new WordSearch(grid)\n\n    expect(\n      wordSearch.find(['clojure', 'elixir', 'ecmascript', 'rust', 'java'])\n    ).toEqual(expectedResults)\n  })\n\n  xit('should locate words written bottom right to top left', () => {\n    const grid = [\n      'jefblpepre',\n      'camdcimgtc',\n      'oivokprjsm',\n      'pbwasqroua',\n      'rixilelhrs',\n      'wolcqlirpc',\n      'screeaumgr',\n      'alxhpburyi',\n      'jalaycalmp',\n      'clojurermt',\n    ]\n\n    const expectedResults = {\n      clojure: {\n        start: [10, 1],\n        end: [10, 7],\n      },\n      elixir: {\n        start: [5, 6],\n        end: [5, 1],\n      },\n      ecmascript: {\n        start: [1, 10],\n        end: [10, 10],\n      },\n      rust: {\n        start: [5, 9],\n        end: [2, 9],\n      },\n      java: {\n        start: [1, 1],\n        end: [4, 4],\n      },\n      lua: {\n        start: [9, 8],\n        end: [7, 6],\n      },\n    }\n    const wordSearch = new WordSearch(grid)\n\n    expect(\n      wordSearch.find([\n        'clojure',\n        'elixir',\n        'ecmascript',\n        'rust',\n        'java',\n        'lua',\n      ])\n    ).toEqual(expectedResults)\n  })\n\n  xit('should locate words written bottom left to top right', () => {\n    const grid = [\n      'jefblpepre',\n      'camdcimgtc',\n      'oivokprjsm',\n      'pbwasqroua',\n      'rixilelhrs',\n      'wolcqlirpc',\n      'screeaumgr',\n      'alxhpburyi',\n      'jalaycalmp',\n      'clojurermt',\n    ]\n    const expectedResults = {\n      clojure: {\n        start: [10, 1],\n        end: [10, 7],\n      },\n      elixir: {\n        start: [5, 6],\n        end: [5, 1],\n      },\n      ecmascript: {\n        start: [1, 10],\n        end: [10, 10],\n      },\n      rust: {\n        start: [5, 9],\n        end: [2, 9],\n      },\n      java: {\n        start: [1, 1],\n        end: [4, 4],\n      },\n      lua: {\n        start: [9, 8],\n        end: [7, 6],\n      },\n      lisp: {\n        start: [6, 3],\n        end: [3, 6],\n      },\n    }\n\n    const wordSearch = new WordSearch(grid)\n\n    expect(\n      wordSearch.find([\n        'clojure',\n        'elixir',\n        'ecmascript',\n        'rust',\n        'java',\n        'lua',\n        'lisp',\n      ])\n    ).toEqual(expectedResults)\n  })\n\n  xit('should locate words written top right to bottom left', () => {\n    const grid = [\n      'jefblpepre',\n      'camdcimgtc',\n      'oivokprjsm',\n      'pbwasqroua',\n      'rixilelhrs',\n      'wolcqlirpc',\n      'screeaumgr',\n      'alxhpburyi',\n      'jalaycalmp',\n      'clojurermt',\n    ]\n\n    const expectedResults = {\n      clojure: {\n        start: [10, 1],\n        end: [10, 7],\n      },\n      elixir: {\n        start: [5, 6],\n        end: [5, 1],\n      },\n      ecmascript: {\n        start: [1, 10],\n        end: [10, 10],\n      },\n      rust: {\n        start: [5, 9],\n        end: [2, 9],\n      },\n      java: {\n        start: [1, 1],\n        end: [4, 4],\n      },\n      lua: {\n        start: [9, 8],\n        end: [7, 6],\n      },\n      lisp: {\n        start: [6, 3],\n        end: [3, 6],\n      },\n      ruby: {\n        start: [6, 8],\n        end: [9, 5],\n      },\n    }\n    const wordSearch = new WordSearch(grid)\n\n    expect(\n      wordSearch.find([\n        'clojure',\n        'elixir',\n        'ecmascript',\n        'rust',\n        'java',\n        'lua',\n        'lisp',\n        'ruby',\n      ])\n    ).toEqual(expectedResults)\n  })\n})\n\nxdescribe('avoiding false-positives', () => {\n  xit('should fail to locate a word that is not in the puzzle', () => {\n    const grid = [\n      'jefblpepre',\n      'camdcimgtc',\n      'oivokprjsm',\n      'pbwasqroua',\n      'rixilelhrs',\n      'wolcqlirpc',\n      'screeaumgr',\n      'alxhpburyi',\n      'jalaycalmp',\n      'clojurermt',\n    ]\n\n    const expectedResults = {\n      clojure: {\n        start: [10, 1],\n        end: [10, 7],\n      },\n      elixir: {\n        start: [5, 6],\n        end: [5, 1],\n      },\n      ecmascript: {\n        start: [1, 10],\n        end: [10, 10],\n      },\n      rust: {\n        start: [5, 9],\n        end: [2, 9],\n      },\n      java: {\n        start: [1, 1],\n        end: [4, 4],\n      },\n      lua: {\n        start: [9, 8],\n        end: [7, 6],\n      },\n      lisp: {\n        start: [6, 3],\n        end: [3, 6],\n      },\n      ruby: {\n        start: [6, 8],\n        end: [9, 5],\n      },\n      haskell: undefined,\n    }\n    const wordSearch = new WordSearch(grid)\n\n    expect(\n      wordSearch.find([\n        'clojure',\n        'elixir',\n        'ecmascript',\n        'rust',\n        'java',\n        'lua',\n        'lisp',\n        'ruby',\n        'haskell',\n      ])\n    ).toEqual(expectedResults)\n  })\n\n  xit('should fail to locate words that are not on horizontal, vertical, or diagonal lines', () => {\n    const grid = ['abc', 'def']\n\n    const expectedResults = {\n      aef: undefined,\n      ced: undefined,\n      abf: undefined,\n      cbd: undefined,\n    }\n    const wordSearch = new WordSearch(grid)\n\n    expect(wordSearch.find(['aef', 'ced', 'abf', 'cbd'])).toEqual(\n      expectedResults\n    )\n  })\n\n  xit('should not concatenate different lines to find a horizontal word', () => {\n    const grid = ['abceli', 'xirdfg']\n\n    const expectedResults = {\n      elixir: undefined,\n    }\n    const wordSearch = new WordSearch(grid)\n\n    expect(wordSearch.find(['elixir'])).toEqual(expectedResults)\n  })\n\n  xit('should not wrap around horizontally to find a word', () => {\n    const grid = ['silabcdefp']\n\n    const expectedResults = {\n      lisp: undefined,\n    }\n    const wordSearch = new WordSearch(grid)\n\n    expect(wordSearch.find(['lisp'])).toEqual(expectedResults)\n  })\n\n  xit('should not wrap around vertically to find a word', () => {\n    const grid = ['s', 'u', 'r', 'a', 'b', 'c', 't']\n\n    const expectedResults = {\n      rust: undefined,\n    }\n    const wordSearch = new WordSearch(grid)\n\n    expect(wordSearch.find(['rust'])).toEqual(expectedResults)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/word-search/word-search.ts",
    "content": "export class WordSearch {\n  constructor() {\n    throw new Error('Remove this line and implement the function')\n  }\n\n  public find(words: string[]) {\n    throw new Error('Remove this line and implement the function')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/wordy/.docs/instructions.md",
    "content": "# Instructions\n\nParse and evaluate simple math word problems returning the answer as an integer.\n\n## Iteration 0 — Numbers\n\nProblems with no operations simply evaluate to the number given.\n\n> What is 5?\n\nEvaluates to 5.\n\n## Iteration 1 — Addition\n\nAdd two numbers together.\n\n> What is 5 plus 13?\n\nEvaluates to 18.\n\nHandle large numbers and negative numbers.\n\n## Iteration 2 — Subtraction, Multiplication and Division\n\nNow, perform the other three operations.\n\n> What is 7 minus 5?\n\n2\n\n> What is 6 multiplied by 4?\n\n24\n\n> What is 25 divided by 5?\n\n5\n\n## Iteration 3 — Multiple Operations\n\nHandle a set of operations, in sequence.\n\nSince these are verbal word problems, evaluate the expression from left-to-right, _ignoring the typical order of operations._\n\n> What is 5 plus 13 plus 6?\n\n24\n\n> What is 3 plus 2 multiplied by 3?\n\n15 (i.e. not 9)\n\n## Iteration 4 — Errors\n\nThe parser should reject:\n\n- Unsupported operations (\"What is 52 cubed?\")\n- Non-math questions (\"Who is the President of the United States\")\n- Word problems with invalid syntax (\"What is 1 plus plus 2?\")\n"
  },
  {
    "path": "exercises/practice/wordy/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"masters3d\"\n  ],\n  \"contributors\": [\n    \"lukaszklis\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"wordy.ts\"\n    ],\n    \"test\": [\n      \"wordy.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Parse and evaluate simple math word problems returning the answer as an integer.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"Inspired by one of the generated questions in the Extreme Startup game.\",\n  \"source_url\": \"https://github.com/rchatley/extreme_startup\"\n}\n"
  },
  {
    "path": "exercises/practice/wordy/.meta/proof.ci.ts",
    "content": "const compute = (\n  operand1: number,\n  operand2: number,\n  operation: string\n): number => {\n  switch (operation) {\n    case 'plus':\n      return operand1 + operand2\n    case 'minus':\n      return operand1 - operand2\n    case 'divided by':\n      return operand1 / operand2\n    case 'multiplied by':\n      return operand1 * operand2\n  }\n}\n\nexport const answer = (question: string): number => {\n  const operationsPattern = new RegExp(/plus|minus|divided by|multiplied by/g)\n  if (\n    !operationsPattern.test(question) &&\n    !/^What is ?-?\\d*\\?$/.test(question)\n  ) {\n    throw new Error('Unknown operation')\n  }\n\n  const generalPattern =\n    /^What is -?\\d+( (plus|minus|multiplied by|divided by) -?\\d+)*\\?$/g\n  if (!generalPattern.test(question)) {\n    throw new Error('Syntax error')\n  }\n\n  const operations = question.match(operationsPattern)\n  const operands = question.match(/-?\\d+/g)\n\n  let result = parseInt(operands[0])\n\n  if (!operations) {\n    return result\n  }\n\n  for (let i = 0; i < operations.length; i++) {\n    result = compute(result, parseInt(operands[i + 1]), operations[i])\n  }\n  return result\n}\n"
  },
  {
    "path": "exercises/practice/wordy/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[88bf4b28-0de3-4883-93c7-db1b14aa806e]\ndescription = \"just a number\"\n\n[18983214-1dfc-4ebd-ac77-c110dde699ce]\ndescription = \"just a zero\"\n\n[607c08ee-2241-4288-916d-dae5455c87e6]\ndescription = \"just a negative number\"\n\n[bb8c655c-cf42-4dfc-90e0-152fcfd8d4e0]\ndescription = \"addition\"\n\n[bb9f2082-171c-46ad-ad4e-c3f72087c1b5]\ndescription = \"addition with a left hand zero\"\n\n[6fa05f17-405a-4742-80ae-5d1a8edb0d5d]\ndescription = \"addition with a right hand zero\"\n\n[79e49e06-c5ae-40aa-a352-7a3a01f70015]\ndescription = \"more addition\"\n\n[b345dbe0-f733-44e1-863c-5ae3568f3803]\ndescription = \"addition with negative numbers\"\n\n[cd070f39-c4cc-45c4-97fb-1be5e5846f87]\ndescription = \"large addition\"\n\n[0d86474a-cd93-4649-a4fa-f6109a011191]\ndescription = \"subtraction\"\n\n[30bc8395-5500-4712-a0cf-1d788a529be5]\ndescription = \"multiplication\"\n\n[34c36b08-8605-4217-bb57-9a01472c427f]\ndescription = \"division\"\n\n[da6d2ce4-fb94-4d26-8f5f-b078adad0596]\ndescription = \"multiple additions\"\n\n[7fd74c50-9911-4597-be09-8de7f2fea2bb]\ndescription = \"addition and subtraction\"\n\n[b120ffd5-bad6-4e22-81c8-5512e8faf905]\ndescription = \"multiple subtraction\"\n\n[4f4a5749-ef0c-4f60-841f-abcfaf05d2ae]\ndescription = \"subtraction then addition\"\n\n[312d908c-f68f-42c9-aa75-961623cc033f]\ndescription = \"multiple multiplication\"\n\n[38e33587-8940-4cc1-bc28-bfd7e3966276]\ndescription = \"addition and multiplication\"\n\n[3c854f97-9311-46e8-b574-92b60d17d394]\ndescription = \"multiple division\"\n\n[3ad3e433-8af7-41ec-aa9b-97b42ab49357]\ndescription = \"unknown operation\"\n\n[8a7e85a8-9e7b-4d46-868f-6d759f4648f8]\ndescription = \"Non math question\"\n\n[42d78b5f-dbd7-4cdb-8b30-00f794bb24cf]\ndescription = \"reject problem missing an operand\"\n\n[c2c3cbfc-1a72-42f2-b597-246e617e66f5]\ndescription = \"reject problem with no operands or operators\"\n\n[4b3df66d-6ed5-4c95-a0a1-d38891fbdab6]\ndescription = \"reject two operations in a row\"\n\n[6abd7a50-75b4-4665-aa33-2030fd08bab1]\ndescription = \"reject two numbers in a row\"\n\n[10a56c22-e0aa-405f-b1d2-c642d9c4c9de]\ndescription = \"reject postfix notation\"\n\n[0035bc63-ac43-4bb5-ad6d-e8651b7d954e]\ndescription = \"reject prefix notation\"\n"
  },
  {
    "path": "exercises/practice/wordy/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/wordy/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/wordy/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/wordy/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/wordy/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/wordy/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/wordy/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-wordy\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/wordy/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/wordy/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/wordy/wordy.test.ts",
    "content": "import { describe, it, expect, xit } from '@jest/globals'\nimport { answer } from './wordy.ts'\n\ndescribe('Wordy', () => {\n  it('just a number', () => {\n    expect(answer('What is 5?')).toEqual(5)\n  })\n\n  xit('just a zero', () => {\n    expect(answer('What is 0?')).toEqual(0)\n  })\n\n  xit('just a negative number', () => {\n    expect(answer('What is -123?')).toEqual(-123)\n  })\n\n  xit('addition', () => {\n    expect(answer('What is 1 plus 1?')).toEqual(2)\n  })\n\n  xit('addition with a left hand zero', () => {\n    expect(answer('What is 0 plus 2?')).toEqual(2)\n  })\n\n  xit('addition with a right hand zero', () => {\n    expect(answer('What is 3 plus 0?')).toEqual(3)\n  })\n\n  xit('more addition', () => {\n    expect(answer('What is 53 plus 2?')).toEqual(55)\n  })\n\n  xit('addition with negative numbers', () => {\n    expect(answer('What is -1 plus -10?')).toEqual(-11)\n  })\n\n  xit('large addition', () => {\n    expect(answer('What is 123 plus 45678?')).toEqual(45801)\n  })\n\n  xit('subtraction', () => {\n    expect(answer('What is 4 minus -12?')).toEqual(16)\n  })\n\n  xit('multiplication', () => {\n    expect(answer('What is -3 multiplied by 25?')).toEqual(-75)\n  })\n\n  xit('division', () => {\n    expect(answer('What is 33 divided by -3?')).toEqual(-11)\n  })\n\n  xit('multiple additions', () => {\n    expect(answer('What is 1 plus 1 plus 1?')).toEqual(3)\n  })\n\n  xit('addition and subtraction', () => {\n    expect(answer('What is 1 plus 5 minus -2?')).toEqual(8)\n  })\n\n  xit('multiple subtraction', () => {\n    expect(answer('What is 20 minus 4 minus 13?')).toEqual(3)\n  })\n\n  xit('subtraction then addition', () => {\n    expect(answer('What is 17 minus 6 plus 3?')).toEqual(14)\n  })\n\n  xit('multiple multiplication', () => {\n    expect(answer('What is 2 multiplied by -2 multiplied by 3?')).toEqual(-12)\n  })\n\n  xit('addition and multiplication', () => {\n    expect(answer('What is -3 plus 7 multiplied by -2?')).toEqual(-8)\n  })\n\n  xit('multiple division', () => {\n    expect(answer('What is -12 divided by 2 divided by -3?')).toEqual(2)\n  })\n\n  xit('unknown operation', () => {\n    expect(() => answer('What is 52 cubed?')).toThrow(\n      new Error('Unknown operation')\n    )\n  })\n\n  xit('Non math question', () => {\n    expect(() => answer('Who is the President of the United States?')).toThrow(\n      new Error('Unknown operation')\n    )\n  })\n\n  xit('reject problem missing an operand', () => {\n    expect(() => answer('What is 1 plus?')).toThrow(new Error('Syntax error'))\n  })\n\n  xit('reject problem with no operands or operators', () => {\n    expect(() => answer('What is?')).toThrow(new Error('Syntax error'))\n  })\n\n  xit('reject two operations in a row', () => {\n    expect(() => answer('What is 1 plus plus 2?')).toThrow(\n      new Error('Syntax error')\n    )\n  })\n\n  xit('reject two numbers in a row', () => {\n    expect(() => answer('What is 1 plus 2 1?')).toThrow(\n      new Error('Syntax error')\n    )\n  })\n\n  xit('reject postfix notation', () => {\n    expect(() => answer('What is 1 2 plus?')).toThrow(new Error('Syntax error'))\n  })\n\n  xit('reject prefix notation', () => {\n    expect(() => answer('What is plus 1 2?')).toThrow(new Error('Syntax error'))\n  })\n})\n"
  },
  {
    "path": "exercises/practice/wordy/wordy.ts",
    "content": "export const answer = () => {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/yacht/.docs/instructions.md",
    "content": "# Instructions\n\nGiven five dice and a category, calculate the score of the dice for that category.\n\n~~~~exercism/note\nYou'll always be presented with five dice.\nEach dice's value will be between one and six inclusively.\nThe dice may be unordered.\n~~~~\n\n## Scores in Yacht\n\n| Category        | Score                  | Description                              | Example             |\n| --------------- | ---------------------- | ---------------------------------------- | ------------------- |\n| Ones            | 1 × number of ones     | Any combination                          | 1 1 1 4 5 scores 3  |\n| Twos            | 2 × number of twos     | Any combination                          | 2 2 3 4 5 scores 4  |\n| Threes          | 3 × number of threes   | Any combination                          | 3 3 3 3 3 scores 15 |\n| Fours           | 4 × number of fours    | Any combination                          | 1 2 3 3 5 scores 0  |\n| Fives           | 5 × number of fives    | Any combination                          | 5 1 5 2 5 scores 15 |\n| Sixes           | 6 × number of sixes    | Any combination                          | 2 3 4 5 6 scores 6  |\n| Full House      | Total of the dice      | Three of one number and two of another   | 3 3 3 5 5 scores 19 |\n| Four of a Kind  | Total of the four dice | At least four dice showing the same face | 4 4 4 4 6 scores 16 |\n| Little Straight | 30 points              | 1-2-3-4-5                                | 1 2 3 4 5 scores 30 |\n| Big Straight    | 30 points              | 2-3-4-5-6                                | 2 3 4 5 6 scores 30 |\n| Choice          | Sum of the dice        | Any combination                          | 2 3 3 4 6 scores 18 |\n| Yacht           | 50 points              | All five dice showing the same face      | 4 4 4 4 4 scores 50 |\n\nIf the dice do **not** satisfy the requirements of a category, the score is zero.\nIf, for example, _Four Of A Kind_ is entered in the _Yacht_ category, zero points are scored.\nA _Yacht_ scores zero if entered in the _Full House_ category.\n"
  },
  {
    "path": "exercises/practice/yacht/.docs/introduction.md",
    "content": "# Introduction\n\nEach year, something new is \"all the rage\" in your high school.\nThis year it is a dice game: [Yacht][yacht].\n\nThe game of Yacht is from the same family as Poker Dice, Generala and particularly Yahtzee, of which it is a precursor.\nThe game consists of twelve rounds.\nIn each, five dice are rolled and the player chooses one of twelve categories.\nThe chosen category is then used to score the throw of the dice.\n\n[yacht]: https://en.wikipedia.org/wiki/Yacht_(dice_game)\n"
  },
  {
    "path": "exercises/practice/yacht/.meta/config.json",
    "content": "{\n  \"authors\": [\n    \"xavdid\"\n  ],\n  \"contributors\": [\n    \"BNAndras\"\n  ],\n  \"files\": {\n    \"solution\": [\n      \"yacht.ts\"\n    ],\n    \"test\": [\n      \"yacht.test.ts\"\n    ],\n    \"example\": [\n      \".meta/proof.ci.ts\"\n    ]\n  },\n  \"blurb\": \"Score a single throw of dice in the game Yacht.\",\n  \"custom\": {\n    \"version.tests.compatibility\": \"jest-29\",\n    \"flag.tests.task-per-describe\": false,\n    \"flag.tests.may-run-long\": false,\n    \"flag.tests.includes-optional\": false,\n    \"flag.tests.jest\": true,\n    \"flag.tests.tstyche\": false\n  },\n  \"source\": \"James Kilfiger, using Wikipedia\",\n  \"source_url\": \"https://en.wikipedia.org/wiki/Yacht_(dice_game)\"\n}\n"
  },
  {
    "path": "exercises/practice/yacht/.meta/proof.ci.ts",
    "content": "export const enum Category {\n  ONES,\n  TWOS,\n  THREES,\n  FOURS,\n  FIVES,\n  SIXES,\n  FULL_HOUSE,\n  FOUR_OF_A_KIND,\n  LITTLE_STRAIGHT,\n  BIG_STRAIGHT,\n  CHOICE,\n  YACHT,\n}\n\n/**\n * multiplies the number of occurances of a specific value by that number\n */\nconst countSingles = (dice: number[], value: number): number =>\n  value * dice.filter((d) => d === value).length\n\n/**\n * sorts a list of numbers in numerically increasing order\n */\nconst sortNumbers = (dice: number[]): number[] =>\n  [...dice].sort((a, b) => a - b)\n\n/**\n * build a mapping of the number of occurances of each die. For example. a full house of 1s and 6s will return `{1: 2, 6: 3}`\n */\nconst frequencies = (dice: number[]): Record<string, number> =>\n  dice.reduce(\n    (res, d) => ({\n      ...res,\n      [d]: (res[d] ?? 0) + 1,\n    }),\n    {} as Record<string, number>\n  )\n\n/**\n * sums a list of numbers\n */\nconst sum = (dice: number[]): number => dice.reduce((res, d) => d + res, 0)\n\n/**\n * compares two list of numbers for equality\n */\nconst eq = (l: number[], r: number[]): boolean =>\n  JSON.stringify(l) === JSON.stringify(r)\n\nexport const score = (dice: number[], category: Category): number => {\n  switch (category) {\n    case Category.ONES:\n      return countSingles(dice, 1)\n    case Category.TWOS:\n      return countSingles(dice, 2)\n    case Category.THREES:\n      return countSingles(dice, 3)\n    case Category.FOURS:\n      return countSingles(dice, 4)\n    case Category.FIVES:\n      return countSingles(dice, 5)\n    case Category.SIXES:\n      return countSingles(dice, 6)\n    case Category.FULL_HOUSE:\n      return eq(sortNumbers(Object.values(frequencies(dice))), [2, 3])\n        ? sum(dice)\n        : 0\n    case Category.FOUR_OF_A_KIND:\n      return sum(\n        Object.entries(frequencies(dice)).map(([d, count]) =>\n          count >= 4 ? parseInt(d) * 4 : 0\n        )\n      )\n    case Category.LITTLE_STRAIGHT:\n      return eq(sortNumbers(dice), [1, 2, 3, 4, 5]) ? 30 : 0\n    case Category.BIG_STRAIGHT:\n      return eq(sortNumbers(dice), [2, 3, 4, 5, 6]) ? 30 : 0\n    case Category.CHOICE:\n      return sum(dice)\n    case Category.YACHT:\n      return new Set(dice).size === 1 ? 50 : 0\n    default:\n      throw new Error('unhandled case')\n  }\n}\n"
  },
  {
    "path": "exercises/practice/yacht/.meta/tests.toml",
    "content": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description` key/value pair\n# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications\n# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)\n# - Preserve any other key/value pair\n#\n# As user-added comments (using the # character) will be removed when this file\n# is regenerated, comments can be added via a `comment` key.\n\n[3060e4a5-4063-4deb-a380-a630b43a84b6]\ndescription = \"Yacht\"\n\n[15026df2-f567-482f-b4d5-5297d57769d9]\ndescription = \"Not Yacht\"\n\n[36b6af0c-ca06-4666-97de-5d31213957a4]\ndescription = \"Ones\"\n\n[023a07c8-6c6e-44d0-bc17-efc5e1b8205a]\ndescription = \"Ones, out of order\"\n\n[7189afac-cccd-4a74-8182-1cb1f374e496]\ndescription = \"No ones\"\n\n[793c4292-dd14-49c4-9707-6d9c56cee725]\ndescription = \"Twos\"\n\n[dc41bceb-d0c5-4634-a734-c01b4233a0c6]\ndescription = \"Fours\"\n\n[f6125417-5c8a-4bca-bc5b-b4b76d0d28c8]\ndescription = \"Yacht counted as threes\"\n\n[464fc809-96ed-46e4-acb8-d44e302e9726]\ndescription = \"Yacht of 3s counted as fives\"\n\n[d054227f-3a71-4565-a684-5c7e621ec1e9]\ndescription = \"Fives\"\n\n[e8a036e0-9d21-443a-8b5f-e15a9e19a761]\ndescription = \"Sixes\"\n\n[51cb26db-6b24-49af-a9ff-12f53b252eea]\ndescription = \"Full house two small, three big\"\n\n[1822ca9d-f235-4447-b430-2e8cfc448f0c]\ndescription = \"Full house three small, two big\"\n\n[b208a3fc-db2e-4363-a936-9e9a71e69c07]\ndescription = \"Two pair is not a full house\"\n\n[b90209c3-5956-445b-8a0b-0ac8b906b1c2]\ndescription = \"Four of a kind is not a full house\"\n\n[32a3f4ee-9142-4edf-ba70-6c0f96eb4b0c]\ndescription = \"Yacht is not a full house\"\n\n[b286084d-0568-4460-844a-ba79d71d79c6]\ndescription = \"Four of a Kind\"\n\n[f25c0c90-5397-4732-9779-b1e9b5f612ca]\ndescription = \"Yacht can be scored as Four of a Kind\"\n\n[9f8ef4f0-72bb-401a-a871-cbad39c9cb08]\ndescription = \"Full house is not Four of a Kind\"\n\n[b4743c82-1eb8-4a65-98f7-33ad126905cd]\ndescription = \"Little Straight\"\n\n[7ac08422-41bf-459c-8187-a38a12d080bc]\ndescription = \"Little Straight as Big Straight\"\n\n[97bde8f7-9058-43ea-9de7-0bc3ed6d3002]\ndescription = \"Four in order but not a little straight\"\n\n[cef35ff9-9c5e-4fd2-ae95-6e4af5e95a99]\ndescription = \"No pairs but not a little straight\"\n\n[fd785ad2-c060-4e45-81c6-ea2bbb781b9d]\ndescription = \"Minimum is 1, maximum is 5, but not a little straight\"\n\n[35bd74a6-5cf6-431a-97a3-4f713663f467]\ndescription = \"Big Straight\"\n\n[87c67e1e-3e87-4f3a-a9b1-62927822b250]\ndescription = \"Big Straight as little straight\"\n\n[c1fa0a3a-40ba-4153-a42d-32bc34d2521e]\ndescription = \"No pairs but not a big straight\"\n\n[207e7300-5d10-43e5-afdd-213e3ac8827d]\ndescription = \"Choice\"\n\n[b524c0cf-32d2-4b40-8fb3-be3500f3f135]\ndescription = \"Yacht as choice\"\n"
  },
  {
    "path": "exercises/practice/yacht/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/yacht/.vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/yacht/.yarn/releases/yarn-3.6.4.cjs",
    "content": "#!/usr/bin/env node\n/* eslint-disable */\n//prettier-ignore\n(()=>{var Dge=Object.create;var lS=Object.defineProperty;var kge=Object.getOwnPropertyDescriptor;var Rge=Object.getOwnPropertyNames;var Fge=Object.getPrototypeOf,Nge=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 Tge=(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})},Lge=(r,e,t,i)=>{if(e&&typeof e==\"object\"||typeof e==\"function\")for(let n of Rge(e))!Nge.call(r,n)&&n!==t&&lS(r,n,{get:()=>e[n],enumerable:!(i=kge(e,n))||i.enumerable});return r};var Pe=(r,e,t)=>(t=r!=null?Dge(Fge(r)):{},Lge(e||!r||!r.__esModule?lS(t,\"default\",{value:r,enumerable:!0}):t,r));var PK=w((zXe,xK)=>{xK.exports=vK;vK.sync=ife;var QK=J(\"fs\");function rfe(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 SK(r,e,t){return!r.isSymbolicLink()&&!r.isFile()?!1:rfe(e,t)}function vK(r,e,t){QK.stat(r,function(i,n){t(i,i?!1:SK(n,r,e))})}function ife(r,e){return SK(QK.statSync(r),r,e)}});var NK=w((VXe,FK)=>{FK.exports=kK;kK.sync=nfe;var DK=J(\"fs\");function kK(r,e,t){DK.stat(r,function(i,n){t(i,i?!1:RK(n,e))})}function nfe(r,e){return RK(DK.statSync(r),e)}function RK(r,e){return r.isFile()&&sfe(r,e)}function sfe(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 LK=w((ZXe,TK)=>{var XXe=J(\"fs\"),lI;process.platform===\"win32\"||global.TESTING_WINDOWS?lI=PK():lI=NK();TK.exports=SS;SS.sync=ofe;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 ofe(r,e){try{return lI.sync(r,e||{})}catch(t){if(e&&e.ignoreErrors||t.code===\"EACCES\")return!1;throw t}}});var YK=w((_Xe,GK)=>{var Dg=process.platform===\"win32\"||process.env.OSTYPE===\"cygwin\"||process.env.OSTYPE===\"msys\",OK=J(\"path\"),afe=Dg?\";\":\":\",MK=LK(),KK=r=>Object.assign(new Error(`not found: ${r}`),{code:\"ENOENT\"}),UK=(r,e)=>{let t=e.colon||afe,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}},HK=(r,e,t)=>{typeof e==\"function\"&&(t=e,e={}),e||(e={});let{pathEnv:i,pathExt:n,pathExtExe:s}=UK(r,e),o=[],a=c=>new Promise((u,g)=>{if(c===i.length)return e.all&&o.length?u(o):g(KK(r));let f=i[c],h=/^\".*\"$/.test(f)?f.slice(1,-1):f,p=OK.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];MK(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)},Afe=(r,e)=>{e=e||{};let{pathEnv:t,pathExt:i,pathExtExe:n}=UK(r,e),s=[];for(let o=0;o<t.length;o++){let a=t[o],l=/^\".*\"$/.test(a)?a.slice(1,-1):a,c=OK.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(MK.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 KK(r)};GK.exports=HK;HK.sync=Afe});var qK=w(($Xe,vS)=>{\"use strict\";var jK=(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=jK;vS.exports.default=jK});var VK=w((eZe,zK)=>{\"use strict\";var JK=J(\"path\"),lfe=YK(),cfe=qK();function WK(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=lfe.sync(r.command,{path:t[cfe({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 ufe(r){return WK(r)||WK(r,!0)}zK.exports=ufe});var XK=w((tZe,PS)=>{\"use strict\";var xS=/([()\\][%!^\"`<>&|;, *?])/g;function gfe(r){return r=r.replace(xS,\"^$1\"),r}function ffe(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=gfe;PS.exports.argument=ffe});var _K=w((rZe,ZK)=>{\"use strict\";ZK.exports=/^#!(.*)/});var eU=w((iZe,$K)=>{\"use strict\";var hfe=_K();$K.exports=(r=\"\")=>{let e=r.match(hfe);if(!e)return null;let[t,i]=e[0].replace(/#! ?/,\"\").split(\" \"),n=t.split(\"/\").pop();return n===\"env\"?i:i?`${n} ${i}`:n}});var rU=w((nZe,tU)=>{\"use strict\";var DS=J(\"fs\"),pfe=eU();function dfe(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 pfe(t.toString())}tU.exports=dfe});var oU=w((sZe,sU)=>{\"use strict\";var Cfe=J(\"path\"),iU=VK(),nU=XK(),mfe=rU(),Efe=process.platform===\"win32\",Ife=/\\.(?:com|exe)$/i,yfe=/node_modules[\\\\/].bin[\\\\/][^\\\\/]+\\.cmd$/i;function wfe(r){r.file=iU(r);let e=r.file&&mfe(r.file);return e?(r.args.unshift(r.file),r.command=e,iU(r)):r.file}function Bfe(r){if(!Efe)return r;let e=wfe(r),t=!Ife.test(e);if(r.options.forceShell||t){let i=yfe.test(e);r.command=Cfe.normalize(r.command),r.command=nU.command(r.command),r.args=r.args.map(s=>nU.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 bfe(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:Bfe(i)}sU.exports=bfe});var lU=w((oZe,AU)=>{\"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 Qfe(r,e){if(!kS)return;let t=r.emit;r.emit=function(i,n){if(i===\"exit\"){let s=aU(n,e,\"spawn\");if(s)return t.call(r,\"error\",s)}return t.apply(r,arguments)}}function aU(r,e){return kS&&r===1&&!e.file?RS(e.original,\"spawn\"):null}function Sfe(r,e){return kS&&r===1&&!e.file?RS(e.original,\"spawnSync\"):null}AU.exports={hookChildProcess:Qfe,verifyENOENT:aU,verifyENOENTSync:Sfe,notFoundError:RS}});var TS=w((aZe,kg)=>{\"use strict\";var cU=J(\"child_process\"),FS=oU(),NS=lU();function uU(r,e,t){let i=FS(r,e,t),n=cU.spawn(i.command,i.args,i.options);return NS.hookChildProcess(n,i),n}function vfe(r,e,t){let i=FS(r,e,t),n=cU.spawnSync(i.command,i.args,i.options);return n.error=n.error||NS.verifyENOENTSync(n.status,i),n}kg.exports=uU;kg.exports.spawn=uU;kg.exports.sync=vfe;kg.exports._parse=FS;kg.exports._enoent=NS});var fU=w((AZe,gU)=>{\"use strict\";function xfe(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)}xfe(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 Pfe(r,e){e=e!==void 0?e:{};var t={},i={Start:SA},n=SA,s=function(m){return m||[]},o=function(m,Q,N){return[{command:m,type:Q}].concat(N||[])},a=function(m,Q){return[{command:m,type:Q||\";\"}]},l=function(m){return m},c=\";\",u=me(\";\",!1),g=\"&\",f=me(\"&\",!1),h=function(m,Q){return Q?{chain:m,then:Q}:{chain:m}},p=function(m,Q){return{type:m,line:Q}},C=\"&&\",y=me(\"&&\",!1),B=\"||\",v=me(\"||\",!1),D=function(m,Q){return Q?{...m,then:Q}:m},T=function(m,Q){return{type:m,chain:Q}},H=\"|&\",j=me(\"|&\",!1),$=\"|\",V=me(\"|\",!1),W=\"=\",_=me(\"=\",!1),A=function(m,Q){return{name:m,args:[Q]}},Ae=function(m){return{name:m,args:[]}},ge=\"(\",re=me(\"(\",!1),O=\")\",F=me(\")\",!1),ue=function(m,Q){return{type:\"subshell\",subshell:m,args:Q}},pe=\"{\",ke=me(\"{\",!1),Fe=\"}\",Ne=me(\"}\",!1),oe=function(m,Q){return{type:\"group\",group:m,args:Q}},le=function(m,Q){return{type:\"command\",args:Q,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,Q,N){return{type:\"redirection\",subtype:Q,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=\"'\",dA=me(\"'\",!1),cg=function(m){return[{type:\"text\",text:m}]},is='\"\"',CA=me('\"\"',!1),ha=function(){return{type:\"text\",text:\"\"}},wp='\"',mA=me('\"',!1),EA=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}},yo=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}},bp=function(m){return{type:\"variable\",...m,quoted:!1}},vr=function(m){return{type:\"glob\",pattern:m}},se=/^[^']/,wo=Je([\"'\"],!0,!1),Fn=function(m){return m.join(\"\")},fg=/^[^$\"]/,bt=Je([\"$\",'\"'],!0,!1),Ll=`\\\\\n`,Nn=me(`\\\\\n`,!1),ns=function(){return\"\"},ss=\"\\\\\",gt=me(\"\\\\\",!1),Bo=/^[\\\\$\"`]/,At=Je([\"\\\\\",\"$\",'\"',\"`\"],!1,!1),ln=function(m){return m},S=\"\\\\a\",Lt=me(\"\\\\a\",!1),hg=function(){return\"a\"},Ol=\"\\\\b\",Qp=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),IA=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\",yA=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(),wA=\"-\",Gl=me(\"-\",!1),Gs=\"+\",Yl=me(\"+\",!1),KE=\".\",Rp=me(\".\",!1),Eg=function(m,Q,N){return{type:\"number\",value:(m===\"-\"?-1:1)*parseFloat(Q.join(\"\")+\".\"+N.join(\"\"))}},Fp=function(m,Q){return{type:\"number\",value:(m===\"-\"?-1:1)*parseInt(Q.join(\"\"))}},UE=function(m){return{type:\"variable\",...m}},jl=function(m){return{type:\"variable\",name:m}},HE=function(m){return m},Ig=\"*\",BA=me(\"*\",!1),Rr=\"/\",GE=me(\"/\",!1),Ys=function(m,Q,N){return{type:Q===\"*\"?\"multiplication\":\"division\",right:N}},js=function(m,Q){return Q.reduce((N,U)=>({left:N,...U}),m)},yg=function(m,Q,N){return{type:Q===\"+\"?\"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),JQ=\":-\",k1=me(\":-\",!1),R1=function(m,Q){return{name:m,defaultValue:Q}},WQ=\":-}\",F1=me(\":-}\",!1),N1=function(m){return{name:m,defaultValue:[]}},zQ=\":+\",T1=me(\":+\",!1),L1=function(m,Q){return{name:m,alternativeValue:Q}},VQ=\":+}\",O1=me(\":+}\",!1),M1=function(m){return{name:m,alternativeValue:[]}},XQ=function(m){return{name:m}},K1=\"$\",U1=me(\"$\",!1),H1=function(m){return e.isGlobPattern(m)},G1=function(m){return m},ZQ=/^[a-zA-Z0-9_]/,_Q=Je([[\"a\",\"z\"],[\"A\",\"Z\"],[\"0\",\"9\"],\"_\"],!1,!1),$Q=function(){return L()},eS=/^[$@*?#a-zA-Z0-9_\\-]/,tS=Je([\"$\",\"@\",\"*\",\"?\",\"#\",[\"a\",\"z\"],[\"A\",\"Z\"],[\"0\",\"9\"],\"_\",\"-\"],!1,!1),Y1=/^[(){}<>$|&; \\t\"']/,wg=Je([\"(\",\")\",\"{\",\"}\",\"<\",\">\",\"$\",\"|\",\"&\",\";\",\" \",\"\t\",'\"',\"'\"],!1,!1),rS=/^[<>&; \\t\"']/,iS=Je([\"<\",\">\",\"&\",\";\",\" \",\"\t\",'\"',\"'\"],!1,!1),YE=/^[ \\t]/,jE=Je([\" \",\"\t\"],!1,!1),b=0,Me=0,QA=[{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,b)}function Z(){return Et(Me,b)}function te(m,Q){throw Q=Q!==void 0?Q:Et(Me,b),Ri([lt(m)],r.substring(Me,b),Q)}function we(m,Q){throw Q=Q!==void 0?Q:Et(Me,b),On(m,Q)}function me(m,Q){return{type:\"literal\",text:m,ignoreCase:Q}}function Je(m,Q,N){return{type:\"class\",parts:m,inverted:Q,ignoreCase:N}}function nt(){return{type:\"any\"}}function wt(){return{type:\"end\"}}function lt(m){return{type:\"other\",description:m}}function it(m){var Q=QA[m],N;if(Q)return Q;for(N=m-1;!QA[N];)N--;for(Q=QA[N],Q={line:Q.line,column:Q.column};N<m;)r.charCodeAt(N)===10?(Q.line++,Q.column=1):Q.column++,N++;return QA[m]=Q,Q}function Et(m,Q){var N=it(m),U=it(Q);return{start:{offset:m,line:N.line,column:N.column},end:{offset:Q,line:U.line,column:U.column}}}function be(m){b<d||(b>d&&(d=b,E=[]),E.push(m))}function On(m,Q){return new Zl(m,null,null,Q)}function Ri(m,Q,N){return new Zl(Zl.buildMessage(m,Q),m,Q,N)}function SA(){var m,Q;return m=b,Q=Mr(),Q===t&&(Q=null),Q!==t&&(Me=m,Q=s(Q)),m=Q,m}function Mr(){var m,Q,N,U,ce;if(m=b,Q=Kr(),Q!==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,Q=o(Q,U,ce),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)}else b=m,m=t;if(m===t)if(m=b,Q=Kr(),Q!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();N!==t?(U=Ea(),U===t&&(U=null),U!==t?(Me=m,Q=a(Q,U),m=Q):(b=m,m=t)):(b=m,m=t)}else b=m,m=t;return m}function os(){var m,Q,N,U,ce;for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();if(Q!==t)if(N=Mr(),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();U!==t?(Me=m,Q=l(N),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t;return m}function Ea(){var m;return r.charCodeAt(b)===59?(m=c,b++):(m=t,I===0&&be(u)),m===t&&(r.charCodeAt(b)===38?(m=g,b++):(m=t,I===0&&be(f))),m}function Kr(){var m,Q,N;return m=b,Q=j1(),Q!==t?(N=fge(),N===t&&(N=null),N!==t?(Me=m,Q=h(Q,N),m=Q):(b=m,m=t)):(b=m,m=t),m}function fge(){var m,Q,N,U,ce,Se,ht;for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();if(Q!==t)if(N=hge(),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,Q=p(N,ce),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t;return m}function hge(){var m;return r.substr(b,2)===C?(m=C,b+=2):(m=t,I===0&&be(y)),m===t&&(r.substr(b,2)===B?(m=B,b+=2):(m=t,I===0&&be(v))),m}function j1(){var m,Q,N;return m=b,Q=Cge(),Q!==t?(N=pge(),N===t&&(N=null),N!==t?(Me=m,Q=D(Q,N),m=Q):(b=m,m=t)):(b=m,m=t),m}function pge(){var m,Q,N,U,ce,Se,ht;for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();if(Q!==t)if(N=dge(),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t)if(ce=j1(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();Se!==t?(Me=m,Q=T(N,ce),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t;return m}function dge(){var m;return r.substr(b,2)===H?(m=H,b+=2):(m=t,I===0&&be(j)),m===t&&(r.charCodeAt(b)===124?(m=$,b++):(m=t,I===0&&be(V))),m}function qE(){var m,Q,N,U,ce,Se;if(m=b,Q=rK(),Q!==t)if(r.charCodeAt(b)===61?(N=W,b++):(N=t,I===0&&be(_)),N!==t)if(U=W1(),U!==t){for(ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();ce!==t?(Me=m,Q=A(Q,U),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t;else b=m,m=t;if(m===t)if(m=b,Q=rK(),Q!==t)if(r.charCodeAt(b)===61?(N=W,b++):(N=t,I===0&&be(_)),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();U!==t?(Me=m,Q=Ae(Q),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t;return m}function Cge(){var m,Q,N,U,ce,Se,ht,Bt,qr,hi,as;for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();if(Q!==t)if(r.charCodeAt(b)===40?(N=ge,b++):(N=t,I===0&&be(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(b)===41?(ht=O,b++):(ht=t,I===0&&be(F)),ht!==t){for(Bt=[],qr=He();qr!==t;)Bt.push(qr),qr=He();if(Bt!==t){for(qr=[],hi=Np();hi!==t;)qr.push(hi),hi=Np();if(qr!==t){for(hi=[],as=He();as!==t;)hi.push(as),as=He();hi!==t?(Me=m,Q=ue(ce,qr),m=Q):(b=m,m=t)}else b=m,m=t}else b=m,m=t}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t;if(m===t){for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();if(Q!==t)if(r.charCodeAt(b)===123?(N=pe,b++):(N=t,I===0&&be(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(b)===125?(ht=Fe,b++):(ht=t,I===0&&be(Ne)),ht!==t){for(Bt=[],qr=He();qr!==t;)Bt.push(qr),qr=He();if(Bt!==t){for(qr=[],hi=Np();hi!==t;)qr.push(hi),hi=Np();if(qr!==t){for(hi=[],as=He();as!==t;)hi.push(as),as=He();hi!==t?(Me=m,Q=oe(ce,qr),m=Q):(b=m,m=t)}else b=m,m=t}else b=m,m=t}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t;if(m===t){for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();if(Q!==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,Q=le(N,ce),m=Q):(b=m,m=t)}else b=m,m=t}else b=m,m=t}else b=m,m=t}else b=m,m=t;if(m===t){for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();if(Q!==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,Q=Be(N),m=Q):(b=m,m=t)}else b=m,m=t}else b=m,m=t}}}return m}function q1(){var m,Q,N,U,ce;for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();if(Q!==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,Q=fe(N),m=Q):(b=m,m=t)}else b=m,m=t}else b=m,m=t;return m}function J1(){var m,Q,N;for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();if(Q!==t?(N=Np(),N!==t?(Me=m,Q=ae(N),m=Q):(b=m,m=t)):(b=m,m=t),m===t){for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();Q!==t?(N=JE(),N!==t?(Me=m,Q=ae(N),m=Q):(b=m,m=t)):(b=m,m=t)}return m}function Np(){var m,Q,N,U,ce;for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();return Q!==t?(qe.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(ne)),N===t&&(N=null),N!==t?(U=mge(),U!==t?(ce=JE(),ce!==t?(Me=m,Q=Y(N,U,ce),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m}function mge(){var m;return r.substr(b,2)===he?(m=he,b+=2):(m=t,I===0&&be(ie)),m===t&&(r.substr(b,2)===de?(m=de,b+=2):(m=t,I===0&&be(_e)),m===t&&(r.charCodeAt(b)===62?(m=Pt,b++):(m=t,I===0&&be(It)),m===t&&(r.substr(b,3)===Or?(m=Or,b+=3):(m=t,I===0&&be(ii)),m===t&&(r.substr(b,2)===gi?(m=gi,b+=2):(m=t,I===0&&be(hr)),m===t&&(r.charCodeAt(b)===60?(m=fi,b++):(m=t,I===0&&be(ni))))))),m}function JE(){var m,Q,N;for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();return Q!==t?(N=W1(),N!==t?(Me=m,Q=ae(N),m=Q):(b=m,m=t)):(b=m,m=t),m}function W1(){var m,Q,N;if(m=b,Q=[],N=z1(),N!==t)for(;N!==t;)Q.push(N),N=z1();else Q=t;return Q!==t&&(Me=m,Q=Ks(Q)),m=Q,m}function z1(){var m,Q;return m=b,Q=Ege(),Q!==t&&(Me=m,Q=pr(Q)),m=Q,m===t&&(m=b,Q=Ige(),Q!==t&&(Me=m,Q=pr(Q)),m=Q,m===t&&(m=b,Q=yge(),Q!==t&&(Me=m,Q=pr(Q)),m=Q,m===t&&(m=b,Q=wge(),Q!==t&&(Me=m,Q=pr(Q)),m=Q))),m}function Ege(){var m,Q,N,U;return m=b,r.substr(b,2)===Ii?(Q=Ii,b+=2):(Q=t,I===0&&be(rs)),Q!==t?(N=Qge(),N!==t?(r.charCodeAt(b)===39?(U=fa,b++):(U=t,I===0&&be(dA)),U!==t?(Me=m,Q=cg(N),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m}function Ige(){var m,Q,N,U;return m=b,r.charCodeAt(b)===39?(Q=fa,b++):(Q=t,I===0&&be(dA)),Q!==t?(N=Bge(),N!==t?(r.charCodeAt(b)===39?(U=fa,b++):(U=t,I===0&&be(dA)),U!==t?(Me=m,Q=cg(N),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m}function yge(){var m,Q,N,U;if(m=b,r.substr(b,2)===is?(Q=is,b+=2):(Q=t,I===0&&be(CA)),Q!==t&&(Me=m,Q=ha()),m=Q,m===t)if(m=b,r.charCodeAt(b)===34?(Q=wp,b++):(Q=t,I===0&&be(mA)),Q!==t){for(N=[],U=V1();U!==t;)N.push(U),U=V1();N!==t?(r.charCodeAt(b)===34?(U=wp,b++):(U=t,I===0&&be(mA)),U!==t?(Me=m,Q=EA(N),m=Q):(b=m,m=t)):(b=m,m=t)}else b=m,m=t;return m}function wge(){var m,Q,N;if(m=b,Q=[],N=X1(),N!==t)for(;N!==t;)Q.push(N),N=X1();else Q=t;return Q!==t&&(Me=m,Q=EA(Q)),m=Q,m}function V1(){var m,Q;return m=b,Q=eK(),Q!==t&&(Me=m,Q=wr(Q)),m=Q,m===t&&(m=b,Q=tK(),Q!==t&&(Me=m,Q=Tl(Q)),m=Q,m===t&&(m=b,Q=aS(),Q!==t&&(Me=m,Q=ug(Q)),m=Q,m===t&&(m=b,Q=bge(),Q!==t&&(Me=m,Q=yo(Q)),m=Q))),m}function X1(){var m,Q;return m=b,Q=eK(),Q!==t&&(Me=m,Q=gg(Q)),m=Q,m===t&&(m=b,Q=tK(),Q!==t&&(Me=m,Q=Bp(Q)),m=Q,m===t&&(m=b,Q=aS(),Q!==t&&(Me=m,Q=bp(Q)),m=Q,m===t&&(m=b,Q=xge(),Q!==t&&(Me=m,Q=vr(Q)),m=Q,m===t&&(m=b,Q=vge(),Q!==t&&(Me=m,Q=yo(Q)),m=Q)))),m}function Bge(){var m,Q,N;for(m=b,Q=[],se.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(wo));N!==t;)Q.push(N),se.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(wo));return Q!==t&&(Me=m,Q=Fn(Q)),m=Q,m}function bge(){var m,Q,N;if(m=b,Q=[],N=Z1(),N===t&&(fg.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(bt))),N!==t)for(;N!==t;)Q.push(N),N=Z1(),N===t&&(fg.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(bt)));else Q=t;return Q!==t&&(Me=m,Q=Fn(Q)),m=Q,m}function Z1(){var m,Q,N;return m=b,r.substr(b,2)===Ll?(Q=Ll,b+=2):(Q=t,I===0&&be(Nn)),Q!==t&&(Me=m,Q=ns()),m=Q,m===t&&(m=b,r.charCodeAt(b)===92?(Q=ss,b++):(Q=t,I===0&&be(gt)),Q!==t?(Bo.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(At)),N!==t?(Me=m,Q=ln(N),m=Q):(b=m,m=t)):(b=m,m=t)),m}function Qge(){var m,Q,N;for(m=b,Q=[],N=_1(),N===t&&(se.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(wo)));N!==t;)Q.push(N),N=_1(),N===t&&(se.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(wo)));return Q!==t&&(Me=m,Q=Fn(Q)),m=Q,m}function _1(){var m,Q,N;return m=b,r.substr(b,2)===S?(Q=S,b+=2):(Q=t,I===0&&be(Lt)),Q!==t&&(Me=m,Q=hg()),m=Q,m===t&&(m=b,r.substr(b,2)===Ol?(Q=Ol,b+=2):(Q=t,I===0&&be(Qp)),Q!==t&&(Me=m,Q=Sp()),m=Q,m===t&&(m=b,r.charCodeAt(b)===92?(Q=ss,b++):(Q=t,I===0&&be(gt)),Q!==t?(vp.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(xp)),N!==t?(Me=m,Q=Pp(),m=Q):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===G?(Q=G,b+=2):(Q=t,I===0&&be(yt)),Q!==t&&(Me=m,Q=IA()),m=Q,m===t&&(m=b,r.substr(b,2)===zi?(Q=zi,b+=2):(Q=t,I===0&&be(Ml)),Q!==t&&(Me=m,Q=Xe()),m=Q,m===t&&(m=b,r.substr(b,2)===pa?(Q=pa,b+=2):(Q=t,I===0&&be(pg)),Q!==t&&(Me=m,Q=OE()),m=Q,m===t&&(m=b,r.substr(b,2)===Dp?(Q=Dp,b+=2):(Q=t,I===0&&be(ME)),Q!==t&&(Me=m,Q=ar()),m=Q,m===t&&(m=b,r.substr(b,2)===Tn?(Q=Tn,b+=2):(Q=t,I===0&&be(Kl)),Q!==t&&(Me=m,Q=kp()),m=Q,m===t&&(m=b,r.charCodeAt(b)===92?(Q=ss,b++):(Q=t,I===0&&be(gt)),Q!==t?(Us.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(da)),N!==t?(Me=m,Q=ln(N),m=Q):(b=m,m=t)):(b=m,m=t),m===t&&(m=Sge()))))))))),m}function Sge(){var m,Q,N,U,ce,Se,ht,Bt,qr,hi,as,AS;return m=b,r.charCodeAt(b)===92?(Q=ss,b++):(Q=t,I===0&&be(gt)),Q!==t?(N=nS(),N!==t?(Me=m,Q=cn(N),m=Q):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===Le?(Q=Le,b+=2):(Q=t,I===0&&be(dg)),Q!==t?(N=b,U=b,ce=nS(),ce!==t?(Se=Mn(),Se!==t?(ce=[ce,Se],U=ce):(b=U,U=t)):(b=U,U=t),U===t&&(U=nS()),U!==t?N=r.substring(N,b):N=U,N!==t?(Me=m,Q=cn(N),m=Q):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===Ul?(Q=Ul,b+=2):(Q=t,I===0&&be(Hs)),Q!==t?(N=b,U=b,ce=Mn(),ce!==t?(Se=Mn(),Se!==t?(ht=Mn(),ht!==t?(Bt=Mn(),Bt!==t?(ce=[ce,Se,ht,Bt],U=ce):(b=U,U=t)):(b=U,U=t)):(b=U,U=t)):(b=U,U=t),U!==t?N=r.substring(N,b):N=U,N!==t?(Me=m,Q=cn(N),m=Q):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===Hl?(Q=Hl,b+=2):(Q=t,I===0&&be(yA)),Q!==t?(N=b,U=b,ce=Mn(),ce!==t?(Se=Mn(),Se!==t?(ht=Mn(),ht!==t?(Bt=Mn(),Bt!==t?(qr=Mn(),qr!==t?(hi=Mn(),hi!==t?(as=Mn(),as!==t?(AS=Mn(),AS!==t?(ce=[ce,Se,ht,Bt,qr,hi,as,AS],U=ce):(b=U,U=t)):(b=U,U=t)):(b=U,U=t)):(b=U,U=t)):(b=U,U=t)):(b=U,U=t)):(b=U,U=t)):(b=U,U=t),U!==t?N=r.substring(N,b):N=U,N!==t?(Me=m,Q=Cg(N),m=Q):(b=m,m=t)):(b=m,m=t)))),m}function nS(){var m;return mg.test(r.charAt(b))?(m=r.charAt(b),b++):(m=t,I===0&&be(Ca)),m}function Mn(){var m;return ma.test(r.charAt(b))?(m=r.charAt(b),b++):(m=t,I===0&&be(rt)),m}function vge(){var m,Q,N,U,ce;if(m=b,Q=[],N=b,r.charCodeAt(b)===92?(U=ss,b++):(U=t,I===0&&be(gt)),U!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&be(bo)),ce!==t?(Me=N,U=ln(ce),N=U):(b=N,N=t)):(b=N,N=t),N===t&&(N=b,U=b,I++,ce=iK(),I--,ce===t?U=void 0:(b=U,U=t),U!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&be(bo)),ce!==t?(Me=N,U=ln(ce),N=U):(b=N,N=t)):(b=N,N=t)),N!==t)for(;N!==t;)Q.push(N),N=b,r.charCodeAt(b)===92?(U=ss,b++):(U=t,I===0&&be(gt)),U!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&be(bo)),ce!==t?(Me=N,U=ln(ce),N=U):(b=N,N=t)):(b=N,N=t),N===t&&(N=b,U=b,I++,ce=iK(),I--,ce===t?U=void 0:(b=U,U=t),U!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&be(bo)),ce!==t?(Me=N,U=ln(ce),N=U):(b=N,N=t)):(b=N,N=t));else Q=t;return Q!==t&&(Me=m,Q=Fn(Q)),m=Q,m}function sS(){var m,Q,N,U,ce,Se;if(m=b,r.charCodeAt(b)===45?(Q=wA,b++):(Q=t,I===0&&be(Gl)),Q===t&&(r.charCodeAt(b)===43?(Q=Gs,b++):(Q=t,I===0&&be(Yl))),Q===t&&(Q=null),Q!==t){if(N=[],qe.test(r.charAt(b))?(U=r.charAt(b),b++):(U=t,I===0&&be(ne)),U!==t)for(;U!==t;)N.push(U),qe.test(r.charAt(b))?(U=r.charAt(b),b++):(U=t,I===0&&be(ne));else N=t;if(N!==t)if(r.charCodeAt(b)===46?(U=KE,b++):(U=t,I===0&&be(Rp)),U!==t){if(ce=[],qe.test(r.charAt(b))?(Se=r.charAt(b),b++):(Se=t,I===0&&be(ne)),Se!==t)for(;Se!==t;)ce.push(Se),qe.test(r.charAt(b))?(Se=r.charAt(b),b++):(Se=t,I===0&&be(ne));else ce=t;ce!==t?(Me=m,Q=Eg(Q,N,ce),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t}else b=m,m=t;if(m===t){if(m=b,r.charCodeAt(b)===45?(Q=wA,b++):(Q=t,I===0&&be(Gl)),Q===t&&(r.charCodeAt(b)===43?(Q=Gs,b++):(Q=t,I===0&&be(Yl))),Q===t&&(Q=null),Q!==t){if(N=[],qe.test(r.charAt(b))?(U=r.charAt(b),b++):(U=t,I===0&&be(ne)),U!==t)for(;U!==t;)N.push(U),qe.test(r.charAt(b))?(U=r.charAt(b),b++):(U=t,I===0&&be(ne));else N=t;N!==t?(Me=m,Q=Fp(Q,N),m=Q):(b=m,m=t)}else b=m,m=t;if(m===t&&(m=b,Q=aS(),Q!==t&&(Me=m,Q=UE(Q)),m=Q,m===t&&(m=b,Q=ql(),Q!==t&&(Me=m,Q=jl(Q)),m=Q,m===t)))if(m=b,r.charCodeAt(b)===40?(Q=ge,b++):(Q=t,I===0&&be(re)),Q!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();if(N!==t)if(U=$1(),U!==t){for(ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();ce!==t?(r.charCodeAt(b)===41?(Se=O,b++):(Se=t,I===0&&be(F)),Se!==t?(Me=m,Q=HE(U),m=Q):(b=m,m=t)):(b=m,m=t)}else b=m,m=t;else b=m,m=t}else b=m,m=t}return m}function oS(){var m,Q,N,U,ce,Se,ht,Bt;if(m=b,Q=sS(),Q!==t){for(N=[],U=b,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(b)===42?(Se=Ig,b++):(Se=t,I===0&&be(BA)),Se===t&&(r.charCodeAt(b)===47?(Se=Rr,b++):(Se=t,I===0&&be(GE))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=sS(),Bt!==t?(Me=U,ce=Ys(Q,Se,Bt),U=ce):(b=U,U=t)):(b=U,U=t)}else b=U,U=t;else b=U,U=t;for(;U!==t;){for(N.push(U),U=b,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(b)===42?(Se=Ig,b++):(Se=t,I===0&&be(BA)),Se===t&&(r.charCodeAt(b)===47?(Se=Rr,b++):(Se=t,I===0&&be(GE))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=sS(),Bt!==t?(Me=U,ce=Ys(Q,Se,Bt),U=ce):(b=U,U=t)):(b=U,U=t)}else b=U,U=t;else b=U,U=t}N!==t?(Me=m,Q=js(Q,N),m=Q):(b=m,m=t)}else b=m,m=t;return m}function $1(){var m,Q,N,U,ce,Se,ht,Bt;if(m=b,Q=oS(),Q!==t){for(N=[],U=b,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(b)===43?(Se=Gs,b++):(Se=t,I===0&&be(Yl)),Se===t&&(r.charCodeAt(b)===45?(Se=wA,b++):(Se=t,I===0&&be(Gl))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=oS(),Bt!==t?(Me=U,ce=yg(Q,Se,Bt),U=ce):(b=U,U=t)):(b=U,U=t)}else b=U,U=t;else b=U,U=t;for(;U!==t;){for(N.push(U),U=b,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(b)===43?(Se=Gs,b++):(Se=t,I===0&&be(Yl)),Se===t&&(r.charCodeAt(b)===45?(Se=wA,b++):(Se=t,I===0&&be(Gl))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=oS(),Bt!==t?(Me=U,ce=yg(Q,Se,Bt),U=ce):(b=U,U=t)):(b=U,U=t)}else b=U,U=t;else b=U,U=t}N!==t?(Me=m,Q=js(Q,N),m=Q):(b=m,m=t)}else b=m,m=t;return m}function eK(){var m,Q,N,U,ce,Se;if(m=b,r.substr(b,3)===bA?(Q=bA,b+=3):(Q=t,I===0&&be(R)),Q!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();if(N!==t)if(U=$1(),U!==t){for(ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();ce!==t?(r.substr(b,2)===q?(Se=q,b+=2):(Se=t,I===0&&be(Ce)),Se!==t?(Me=m,Q=Ke(U),m=Q):(b=m,m=t)):(b=m,m=t)}else b=m,m=t;else b=m,m=t}else b=m,m=t;return m}function tK(){var m,Q,N,U;return m=b,r.substr(b,2)===Re?(Q=Re,b+=2):(Q=t,I===0&&be(ze)),Q!==t?(N=Mr(),N!==t?(r.charCodeAt(b)===41?(U=O,b++):(U=t,I===0&&be(F)),U!==t?(Me=m,Q=dt(N),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m}function aS(){var m,Q,N,U,ce,Se;return m=b,r.substr(b,2)===Ft?(Q=Ft,b+=2):(Q=t,I===0&&be(Ln)),Q!==t?(N=ql(),N!==t?(r.substr(b,2)===JQ?(U=JQ,b+=2):(U=t,I===0&&be(k1)),U!==t?(ce=q1(),ce!==t?(r.charCodeAt(b)===125?(Se=Fe,b++):(Se=t,I===0&&be(Ne)),Se!==t?(Me=m,Q=R1(N,ce),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===Ft?(Q=Ft,b+=2):(Q=t,I===0&&be(Ln)),Q!==t?(N=ql(),N!==t?(r.substr(b,3)===WQ?(U=WQ,b+=3):(U=t,I===0&&be(F1)),U!==t?(Me=m,Q=N1(N),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===Ft?(Q=Ft,b+=2):(Q=t,I===0&&be(Ln)),Q!==t?(N=ql(),N!==t?(r.substr(b,2)===zQ?(U=zQ,b+=2):(U=t,I===0&&be(T1)),U!==t?(ce=q1(),ce!==t?(r.charCodeAt(b)===125?(Se=Fe,b++):(Se=t,I===0&&be(Ne)),Se!==t?(Me=m,Q=L1(N,ce),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===Ft?(Q=Ft,b+=2):(Q=t,I===0&&be(Ln)),Q!==t?(N=ql(),N!==t?(r.substr(b,3)===VQ?(U=VQ,b+=3):(U=t,I===0&&be(O1)),U!==t?(Me=m,Q=M1(N),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===Ft?(Q=Ft,b+=2):(Q=t,I===0&&be(Ln)),Q!==t?(N=ql(),N!==t?(r.charCodeAt(b)===125?(U=Fe,b++):(U=t,I===0&&be(Ne)),U!==t?(Me=m,Q=XQ(N),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.charCodeAt(b)===36?(Q=K1,b++):(Q=t,I===0&&be(U1)),Q!==t?(N=ql(),N!==t?(Me=m,Q=XQ(N),m=Q):(b=m,m=t)):(b=m,m=t)))))),m}function xge(){var m,Q,N;return m=b,Q=Pge(),Q!==t?(Me=b,N=H1(Q),N?N=void 0:N=t,N!==t?(Me=m,Q=G1(Q),m=Q):(b=m,m=t)):(b=m,m=t),m}function Pge(){var m,Q,N,U,ce;if(m=b,Q=[],N=b,U=b,I++,ce=nK(),I--,ce===t?U=void 0:(b=U,U=t),U!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&be(bo)),ce!==t?(Me=N,U=ln(ce),N=U):(b=N,N=t)):(b=N,N=t),N!==t)for(;N!==t;)Q.push(N),N=b,U=b,I++,ce=nK(),I--,ce===t?U=void 0:(b=U,U=t),U!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&be(bo)),ce!==t?(Me=N,U=ln(ce),N=U):(b=N,N=t)):(b=N,N=t);else Q=t;return Q!==t&&(Me=m,Q=Fn(Q)),m=Q,m}function rK(){var m,Q,N;if(m=b,Q=[],ZQ.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(_Q)),N!==t)for(;N!==t;)Q.push(N),ZQ.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(_Q));else Q=t;return Q!==t&&(Me=m,Q=$Q()),m=Q,m}function ql(){var m,Q,N;if(m=b,Q=[],eS.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(tS)),N!==t)for(;N!==t;)Q.push(N),eS.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(tS));else Q=t;return Q!==t&&(Me=m,Q=$Q()),m=Q,m}function iK(){var m;return Y1.test(r.charAt(b))?(m=r.charAt(b),b++):(m=t,I===0&&be(wg)),m}function nK(){var m;return rS.test(r.charAt(b))?(m=r.charAt(b),b++):(m=t,I===0&&be(iS)),m}function He(){var m,Q;if(m=[],YE.test(r.charAt(b))?(Q=r.charAt(b),b++):(Q=t,I===0&&be(jE)),Q!==t)for(;Q!==t;)m.push(Q),YE.test(r.charAt(b))?(Q=r.charAt(b),b++):(Q=t,I===0&&be(jE));else m=t;return m}if(k=n(),k!==t&&b===r.length)return k;throw k!==t&&b<r.length&&be(wt()),Ri(E,d<r.length?r.charAt(d):null,d<r.length?Et(d,d+1):Et(d,d))}gU.exports={SyntaxError:Zl,parse:Pfe}});var dU=w((wZe,pU)=>{\"use strict\";function Dfe(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)}Dfe($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 kfe(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))}pU.exports={SyntaxError:$l,parse:kfe}});var tc=w((bZe,ec)=>{\"use strict\";function mU(r){return typeof r>\"u\"||r===null}function Rfe(r){return typeof r==\"object\"&&r!==null}function Ffe(r){return Array.isArray(r)?r:mU(r)?[]:[r]}function Nfe(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 Tfe(r,e){var t=\"\",i;for(i=0;i<e;i+=1)t+=r;return t}function Lfe(r){return r===0&&Number.NEGATIVE_INFINITY===1/r}ec.exports.isNothing=mU;ec.exports.isObject=Rfe;ec.exports.toArray=Ffe;ec.exports.repeat=Tfe;ec.exports.isNegativeZero=Lfe;ec.exports.extend=Nfe});var Ng=w((QZe,EU)=>{\"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};EU.exports=Vp});var wU=w((SZe,yU)=>{\"use strict\";var IU=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),IU.repeat(\" \",e)+i+a+s+`\n`+IU.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};yU.exports=HS});var si=w((vZe,bU)=>{\"use strict\";var BU=Ng(),Ofe=[\"kind\",\"resolve\",\"construct\",\"instanceOf\",\"predicate\",\"represent\",\"defaultStyle\",\"styleAliases\"],Mfe=[\"scalar\",\"sequence\",\"mapping\"];function Kfe(r){var e={};return r!==null&&Object.keys(r).forEach(function(t){r[t].forEach(function(i){e[String(i)]=t})}),e}function Ufe(r,e){if(e=e||{},Object.keys(e).forEach(function(t){if(Ofe.indexOf(t)===-1)throw new BU('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=Kfe(e.styleAliases||null),Mfe.indexOf(this.kind)===-1)throw new BU('Unknown kind \"'+this.kind+'\" is specified for \"'+r+'\" YAML type.')}bU.exports=Ufe});var rc=w((xZe,SU)=>{\"use strict\";var QU=tc(),dI=Ng(),Hfe=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 Gfe(){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=Gfe(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=QU.toArray(e),t=QU.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 Hfe}))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})};SU.exports=Tg});var xU=w((PZe,vU)=>{\"use strict\";var Yfe=si();vU.exports=new Yfe(\"tag:yaml.org,2002:str\",{kind:\"scalar\",construct:function(r){return r!==null?r:\"\"}})});var DU=w((DZe,PU)=>{\"use strict\";var jfe=si();PU.exports=new jfe(\"tag:yaml.org,2002:seq\",{kind:\"sequence\",construct:function(r){return r!==null?r:[]}})});var RU=w((kZe,kU)=>{\"use strict\";var qfe=si();kU.exports=new qfe(\"tag:yaml.org,2002:map\",{kind:\"mapping\",construct:function(r){return r!==null?r:{}}})});var CI=w((RZe,FU)=>{\"use strict\";var Jfe=rc();FU.exports=new Jfe({explicit:[xU(),DU(),RU()]})});var TU=w((FZe,NU)=>{\"use strict\";var Wfe=si();function zfe(r){if(r===null)return!0;var e=r.length;return e===1&&r===\"~\"||e===4&&(r===\"null\"||r===\"Null\"||r===\"NULL\")}function Vfe(){return null}function Xfe(r){return r===null}NU.exports=new Wfe(\"tag:yaml.org,2002:null\",{kind:\"scalar\",resolve:zfe,construct:Vfe,predicate:Xfe,represent:{canonical:function(){return\"~\"},lowercase:function(){return\"null\"},uppercase:function(){return\"NULL\"},camelcase:function(){return\"Null\"}},defaultStyle:\"lowercase\"})});var OU=w((NZe,LU)=>{\"use strict\";var Zfe=si();function _fe(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 $fe(r){return r===\"true\"||r===\"True\"||r===\"TRUE\"}function ehe(r){return Object.prototype.toString.call(r)===\"[object Boolean]\"}LU.exports=new Zfe(\"tag:yaml.org,2002:bool\",{kind:\"scalar\",resolve:_fe,construct:$fe,predicate:ehe,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 KU=w((TZe,MU)=>{\"use strict\";var the=tc(),rhe=si();function ihe(r){return 48<=r&&r<=57||65<=r&&r<=70||97<=r&&r<=102}function nhe(r){return 48<=r&&r<=55}function she(r){return 48<=r&&r<=57}function ohe(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(!ihe(r.charCodeAt(t)))return!1;i=!0}return i&&n!==\"_\"}for(;t<e;t++)if(n=r[t],n!==\"_\"){if(!nhe(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(!she(r.charCodeAt(t)))return!1;i=!0}return!i||n===\"_\"?!1:n!==\":\"?!0:/^(:[0-5]?[0-9])+$/.test(r.slice(t))}function ahe(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 Ahe(r){return Object.prototype.toString.call(r)===\"[object Number]\"&&r%1===0&&!the.isNegativeZero(r)}MU.exports=new rhe(\"tag:yaml.org,2002:int\",{kind:\"scalar\",resolve:ohe,construct:ahe,predicate:Ahe,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 GU=w((LZe,HU)=>{\"use strict\";var UU=tc(),lhe=si(),che=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 uhe(r){return!(r===null||!che.test(r)||r[r.length-1]===\"_\")}function ghe(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 fhe=/^[-+]?[0-9]+e/;function hhe(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(UU.isNegativeZero(r))return\"-0.0\";return t=r.toString(10),fhe.test(t)?t.replace(\"e\",\".e\"):t}function phe(r){return Object.prototype.toString.call(r)===\"[object Number]\"&&(r%1!==0||UU.isNegativeZero(r))}HU.exports=new lhe(\"tag:yaml.org,2002:float\",{kind:\"scalar\",resolve:uhe,construct:ghe,predicate:phe,represent:hhe,defaultStyle:\"lowercase\"})});var YS=w((OZe,YU)=>{\"use strict\";var dhe=rc();YU.exports=new dhe({include:[CI()],implicit:[TU(),OU(),KU(),GU()]})});var jS=w((MZe,jU)=>{\"use strict\";var Che=rc();jU.exports=new Che({include:[YS()]})});var zU=w((KZe,WU)=>{\"use strict\";var mhe=si(),qU=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 Ehe(r){return r===null?!1:qU.exec(r)!==null||JU.exec(r)!==null}function Ihe(r){var e,t,i,n,s,o,a,l=0,c=null,u,g,f;if(e=qU.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 yhe(r){return r.toISOString()}WU.exports=new mhe(\"tag:yaml.org,2002:timestamp\",{kind:\"scalar\",resolve:Ehe,construct:Ihe,instanceOf:Date,represent:yhe})});var XU=w((UZe,VU)=>{\"use strict\";var whe=si();function Bhe(r){return r===\"<<\"||r===null}VU.exports=new whe(\"tag:yaml.org,2002:merge\",{kind:\"scalar\",resolve:Bhe})});var $U=w((HZe,_U)=>{\"use strict\";var ic;try{ZU=J,ic=ZU(\"buffer\").Buffer}catch{}var ZU,bhe=si(),qS=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\\r`;function Qhe(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 She(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 vhe(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 xhe(r){return ic&&ic.isBuffer(r)}_U.exports=new bhe(\"tag:yaml.org,2002:binary\",{kind:\"scalar\",resolve:Qhe,construct:She,predicate:xhe,represent:vhe})});var t2=w((YZe,e2)=>{\"use strict\";var Phe=si(),Dhe=Object.prototype.hasOwnProperty,khe=Object.prototype.toString;function Rhe(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,khe.call(n)!==\"[object Object]\")return!1;for(s in n)if(Dhe.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 Fhe(r){return r!==null?r:[]}e2.exports=new Phe(\"tag:yaml.org,2002:omap\",{kind:\"sequence\",resolve:Rhe,construct:Fhe})});var i2=w((jZe,r2)=>{\"use strict\";var Nhe=si(),The=Object.prototype.toString;function Lhe(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],The.call(i)!==\"[object Object]\"||(n=Object.keys(i),n.length!==1))return!1;s[e]=[n[0],i[n[0]]]}return!0}function Ohe(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}r2.exports=new Nhe(\"tag:yaml.org,2002:pairs\",{kind:\"sequence\",resolve:Lhe,construct:Ohe})});var s2=w((qZe,n2)=>{\"use strict\";var Mhe=si(),Khe=Object.prototype.hasOwnProperty;function Uhe(r){if(r===null)return!0;var e,t=r;for(e in t)if(Khe.call(t,e)&&t[e]!==null)return!1;return!0}function Hhe(r){return r!==null?r:{}}n2.exports=new Mhe(\"tag:yaml.org,2002:set\",{kind:\"mapping\",resolve:Uhe,construct:Hhe})});var Lg=w((JZe,o2)=>{\"use strict\";var Ghe=rc();o2.exports=new Ghe({include:[jS()],implicit:[zU(),XU()],explicit:[$U(),t2(),i2(),s2()]})});var A2=w((WZe,a2)=>{\"use strict\";var Yhe=si();function jhe(){return!0}function qhe(){}function Jhe(){return\"\"}function Whe(r){return typeof r>\"u\"}a2.exports=new Yhe(\"tag:yaml.org,2002:js/undefined\",{kind:\"scalar\",resolve:jhe,construct:qhe,predicate:Whe,represent:Jhe})});var c2=w((zZe,l2)=>{\"use strict\";var zhe=si();function Vhe(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 Xhe(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 Zhe(r){var e=\"/\"+r.source+\"/\";return r.global&&(e+=\"g\"),r.multiline&&(e+=\"m\"),r.ignoreCase&&(e+=\"i\"),e}function _he(r){return Object.prototype.toString.call(r)===\"[object RegExp]\"}l2.exports=new zhe(\"tag:yaml.org,2002:js/regexp\",{kind:\"scalar\",resolve:Vhe,construct:Xhe,predicate:_he,represent:Zhe})});var f2=w((VZe,g2)=>{\"use strict\";var mI;try{u2=J,mI=u2(\"esprima\")}catch{typeof window<\"u\"&&(mI=window.esprima)}var u2,$he=si();function epe(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 tpe(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 rpe(r){return r.toString()}function ipe(r){return Object.prototype.toString.call(r)===\"[object Function]\"}g2.exports=new $he(\"tag:yaml.org,2002:js/function\",{kind:\"scalar\",resolve:epe,construct:tpe,predicate:ipe,represent:rpe})});var Xp=w((ZZe,p2)=>{\"use strict\";var h2=rc();p2.exports=h2.DEFAULT=new h2({include:[Lg()],explicit:[A2(),c2(),f2()]})});var N2=w((_Ze,Zp)=>{\"use strict\";var Ba=tc(),w2=Ng(),npe=wU(),B2=Lg(),spe=Xp(),kA=Object.prototype.hasOwnProperty,EI=1,b2=2,Q2=3,II=4,JS=1,ope=2,d2=3,ape=/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/,Ape=/[\\x85\\u2028\\u2029]/,lpe=/[,\\[\\]\\{\\}]/,S2=/^(?:!|!!|![a-z\\-]+!)$/i,v2=/^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;function C2(r){return Object.prototype.toString.call(r)}function xo(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 cpe(r){var e;return 48<=r&&r<=57?r-48:(e=r|32,97<=e&&e<=102?e-97+10:-1)}function upe(r){return r===120?2:r===117?4:r===85?8:0}function gpe(r){return 48<=r&&r<=57?r-48:-1}function m2(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 fpe(r){return r<=65535?String.fromCharCode(r):String.fromCharCode((r-65536>>10)+55296,(r-65536&1023)+56320)}var x2=new Array(256),P2=new Array(256);for(nc=0;nc<256;nc++)x2[nc]=m2(nc)?1:0,P2[nc]=m2(nc);var nc;function hpe(r,e){this.input=r,this.filename=e.filename||null,this.schema=e.schema||spe,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 D2(r,e){return new w2(e,new npe(r.filename,r.input,r.position,r.line,r.position-r.lineStart))}function ft(r,e){throw D2(r,e)}function yI(r,e){r.onWarning&&r.onWarning.call(null,D2(r,e))}var E2={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],S2.test(n)||ft(e,\"ill-formed tag handle (first argument) of the TAG directive\"),kA.call(e.tagMap,n)&&ft(e,'there is a previously declared suffix for \"'+n+'\" tag handle'),v2.test(s)||ft(e,\"ill-formed tag prefix (second argument) of the TAG directive\"),e.tagMap[n]=s}};function DA(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 ape.test(a)&&ft(r,\"the stream contains non-printable characters\");r.result+=a}}function I2(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],kA.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\"&&C2(n[l])===\"[object Object]\"&&(n[l]=\"[object Object]\");if(typeof n==\"object\"&&C2(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)I2(r,e,s[l],t);else I2(r,e,s,t);else!r.json&&!kA.call(t,n)&&kA.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(xo(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 ppe(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(xo(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&&(DA(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 DA(r,s,o,!1),r.result?!0:(r.kind=g,r.result=f,!1)}function dpe(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(DA(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 xo(t)?(DA(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 Cpe(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 DA(r,t,r.position,!0),r.position++,!0;if(a===92){if(DA(r,t,r.position,!0),a=r.input.charCodeAt(++r.position),xo(a))zr(r,!1,e);else if(a<256&&x2[a])r.result+=P2[a],r.position++;else if((o=upe(a))>0){for(n=o,s=0;n>0;n--)a=r.input.charCodeAt(++r.position),(o=cpe(a))>=0?s=(s<<4)+o:ft(r,\"expected hexadecimal character\");r.result+=fpe(s),r.position++}else ft(r,\"unknown escape sequence\");t=i=r.position}else xo(a)?(DA(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 mpe(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 Epe(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?d2:ope:ft(r,\"repeat of a chomping mode identifier\");else if((u=gpe(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(!xo(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),xo(g)){l++;continue}if(r.lineIndent<a){n===d2?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;!xo(g)&&g!==0;)g=r.input.charCodeAt(++r.position);DA(r,t,r.position,!1)}return!0}function y2(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,Q2,!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 Ipe(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,b2,!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 ype(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),S2.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),lpe.test(s)&&ft(r,\"tag suffix cannot contain flow indicator characters\")}return s&&!v2.test(s)&&ft(r,\"tag name cannot contain such characters: \"+s),t?r.tag=s:kA.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 wpe(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 Bpe(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),kA.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||Q2===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(;ype(r)||wpe(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||b2===t?p=e:p=e+1,C=r.position-r.lineStart,l===1?a&&(y2(r,C)||Ipe(r,C,p))||mpe(r,p)?u=!0:(o&&Epe(r,p)||dpe(r,p)||Cpe(r,p)?u=!0:Bpe(r)?(u=!0,(r.tag!==null||r.anchor!==null)&&ft(r,\"alias node should not have any properties\")):ppe(r,p,EI===t)&&(u=!0,r.tag===null&&(r.tag=\"?\")),r.anchor!==null&&(r.anchorMap[r.anchor]=r.result)):l===0&&(u=a&&y2(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 kA.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 bpe(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&&!xo(o));break}if(xo(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),kA.call(E2,i)?E2[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&&Ape.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 k2(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 hpe(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;)bpe(t);return t.documents}function R2(r,e,t){e!==null&&typeof e==\"object\"&&typeof t>\"u\"&&(t=e,e=null);var i=k2(r,t);if(typeof e!=\"function\")return i;for(var n=0,s=i.length;n<s;n+=1)e(i[n])}function F2(r,e){var t=k2(r,e);if(t.length!==0){if(t.length===1)return t[0];throw new w2(\"expected a single document in the stream, but found more\")}}function Qpe(r,e,t){return typeof e==\"object\"&&e!==null&&typeof t>\"u\"&&(t=e,e=null),R2(r,e,Ba.extend({schema:B2},t))}function Spe(r,e){return F2(r,Ba.extend({schema:B2},e))}Zp.exports.loadAll=R2;Zp.exports.load=F2;Zp.exports.safeLoadAll=Qpe;Zp.exports.safeLoad=Spe});var iH=w(($Ze,_S)=>{\"use strict\";var $p=tc(),ed=Ng(),vpe=Xp(),xpe=Lg(),G2=Object.prototype.toString,Y2=Object.prototype.hasOwnProperty,Ppe=9,_p=10,Dpe=13,kpe=32,Rpe=33,Fpe=34,j2=35,Npe=37,Tpe=38,Lpe=39,Ope=42,q2=44,Mpe=45,J2=58,Kpe=61,Upe=62,Hpe=63,Gpe=64,W2=91,z2=93,Ype=96,V2=123,jpe=124,X2=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 qpe=[\"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&&Y2.call(l.styleAliases,a)&&(a=l.styleAliases[a]),t[o]=a;return t}function T2(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 Wpe(r){this.schema=r.schema||vpe,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 L2(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 zpe(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===kpe||r===Ppe}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 Vpe(r){return Ug(r)&&!ZS(r)&&r!==65279&&r!==Dpe&&r!==_p}function O2(r,e){return Ug(r)&&r!==65279&&r!==q2&&r!==W2&&r!==z2&&r!==V2&&r!==X2&&r!==J2&&(r!==j2||e&&Vpe(e))}function Xpe(r){return Ug(r)&&r!==65279&&!ZS(r)&&r!==Mpe&&r!==Hpe&&r!==J2&&r!==q2&&r!==W2&&r!==z2&&r!==V2&&r!==X2&&r!==j2&&r!==Tpe&&r!==Ope&&r!==Rpe&&r!==jpe&&r!==Kpe&&r!==Upe&&r!==Lpe&&r!==Fpe&&r!==Npe&&r!==Gpe&&r!==Ype}function Z2(r){var e=/^\\n* /;return e.test(r)}var _2=1,$2=2,eH=3,tH=4,BI=5;function Zpe(r,e,t,i,n){var s,o,a,l=!1,c=!1,u=i!==-1,g=-1,f=Xpe(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&&O2(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&&O2(o,a)}c=c||u&&s-g-1>i&&r[g+1]!==\" \"}return!l&&!c?f&&!n(r)?_2:$2:t>9&&Z2(r)?BI:c?tH:eH}function _pe(r,e,t,i){r.dump=function(){if(e.length===0)return\"''\";if(!r.noCompatMode&&qpe.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 zpe(r,l)}switch(Zpe(e,o,r.indent,s,a)){case _2:return e;case $2:return\"'\"+e.replace(/'/g,\"''\")+\"'\";case eH:return\"|\"+M2(e,r.indent)+K2(L2(e,n));case tH:return\">\"+M2(e,r.indent)+K2(L2($pe(e,s),n));case BI:return'\"'+ede(e,s)+'\"';default:throw new ed(\"impossible error: invalid scalar style\")}}()}function M2(r,e){var t=Z2(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 K2(r){return r[r.length-1]===`\n`?r.slice(0,-1):r}function $pe(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,U2(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`:\"\")+U2(l,e),n=s}return i}function U2(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 ede(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+=T2((t-55296)*1024+i-56320+65536),s++;continue}n=Ni[t],e+=!n&&Ug(t)?r[s]:n||T2(t)}return e}function tde(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 rde(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 ide(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 nde(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 H2(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,G2.call(a.represent)===\"[object Function]\")i=a.represent(e,l);else if(Y2.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,H2(r,t,!1)||H2(r,t,!0);var o=G2.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?(nde(r,e,r.dump,n),c&&(r.dump=\"&ref_\"+l+r.dump)):(ide(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?(rde(r,u,r.dump,n),c&&(r.dump=\"&ref_\"+l+r.dump)):(tde(r,u,r.dump),c&&(r.dump=\"&ref_\"+l+\" \"+r.dump))}else if(o===\"[object String]\")r.tag!==\"?\"&&_pe(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 sde(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 rH(r,e){e=e||{};var t=new Wpe(e);return t.noRefs||sde(r,t),oc(t,0,r,!0,!0)?t.dump+`\n`:\"\"}function ode(r,e){return rH(r,$p.extend({schema:xpe},e))}_S.exports.dump=rH;_S.exports.safeDump=ode});var sH=w((e_e,Fr)=>{\"use strict\";var bI=N2(),nH=iH();function QI(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=bI.load;Fr.exports.loadAll=bI.loadAll;Fr.exports.safeLoad=bI.safeLoad;Fr.exports.safeLoadAll=bI.safeLoadAll;Fr.exports.dump=nH.dump;Fr.exports.safeDump=nH.safeDump;Fr.exports.YAMLException=Ng();Fr.exports.MINIMAL_SCHEMA=CI();Fr.exports.SAFE_SCHEMA=Lg();Fr.exports.DEFAULT_SCHEMA=Xp();Fr.exports.scan=QI(\"scan\");Fr.exports.parse=QI(\"parse\");Fr.exports.compose=QI(\"compose\");Fr.exports.addConstructor=QI(\"addConstructor\")});var aH=w((t_e,oH)=>{\"use strict\";var ade=sH();oH.exports=ade});var lH=w((r_e,AH)=>{\"use strict\";function Ade(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)}Ade(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 lde(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'\"'},dA=\"\\\\\\\\\",cg=ar(\"\\\\\\\\\",!1),is=function(){return\"\\\\\"},CA=\"\\\\/\",ha=ar(\"\\\\/\",!1),wp=function(){return\"/\"},mA=\"\\\\b\",EA=ar(\"\\\\b\",!1),wr=function(){return\"\\b\"},Tl=\"\\\\f\",ug=ar(\"\\\\f\",!1),yo=function(){return\"\\f\"},gg=\"\\\\n\",Bp=ar(\"\\\\n\",!1),bp=function(){return`\n`},vr=\"\\\\r\",se=ar(\"\\\\r\",!1),wo=function(){return\"\\r\"},Fn=\"\\\\t\",fg=ar(\"\\\\t\",!1),bt=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),Bo=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`,Qp=ar(`\\r\n`,!1),Sp=`\n`,vp=ar(`\n`,!1),xp=\"\\r\",Pp=ar(\"\\r\",!1),G=0,yt=0,IA=[{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=IA[R],Ce;if(q)return q;for(Ce=R-1;!IA[Ce];)Ce--;for(q=IA[Ce],q={line:q.line,column:q.column};Ce<R;)r.charCodeAt(Ce)===10?(q.line++,q.column=1):q.column++,Ce++;return IA[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=yA();Ce!==t;)q.push(Ce),Ce=yA();return q!==t&&(yt=R,q=s(q)),R=q,R}function yA(){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=wA(),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=wA(),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 wA(){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)===dA?(q=dA,G+=2):(q=t,Xe===0&&Le(cg)),q!==t&&(yt=R,q=is()),R=q,R===t&&(R=G,r.substr(G,2)===CA?(q=CA,G+=2):(q=t,Xe===0&&Le(ha)),q!==t&&(yt=R,q=wp()),R=q,R===t&&(R=G,r.substr(G,2)===mA?(q=mA,G+=2):(q=t,Xe===0&&Le(EA)),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=yo()),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=bp()),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=wo()),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=bt()),R=q,R===t&&(R=G,r.substr(G,2)===Ll?(q=Ll,G+=2):(q=t,Xe===0&&Le(Nn)),q!==t?(Ce=BA(),Ce!==t?(Ke=BA(),Ke!==t?(Re=BA(),Re!==t?(ze=BA(),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 BA(){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(Bo)),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(Qp)),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))}AH.exports={SyntaxError:ac,parse:lde}});var pH=w((a_e,ev)=>{\"use strict\";var hde=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},hH=(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=hde(r)),r=r.replace(/^[_.\\- ]+/,\"\").toLowerCase().replace(/[_.\\- ]+(\\w|$)/g,(n,s)=>s.toUpperCase()).replace(/\\d+(\\w|$)/g,n=>n.toUpperCase()),t(r))};ev.exports=hH;ev.exports.default=hH});var dH=w((A_e,pde)=>{pde.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 mH=dH(),Po=process.env;Object.defineProperty(Un,\"_vendors\",{value:mH.map(function(r){return r.constant})});Un.name=null;Un.isPR=null;mH.forEach(function(r){let t=(Array.isArray(r.env)?r.env:[r.env]).every(function(i){return CH(i)});if(Un[r.constant]=t,t)switch(Un.name=r.name,typeof r.pr){case\"string\":Un.isPR=!!Po[r.pr];break;case\"object\":\"env\"in r.pr?Un.isPR=r.pr.env in Po&&Po[r.pr.env]!==r.pr.ne:\"any\"in r.pr?Un.isPR=r.pr.any.some(function(i){return!!Po[i]}):Un.isPR=CH(r.pr);break;default:Un.isPR=null}});Un.isCI=!!(Po.CI||Po.CONTINUOUS_INTEGRATION||Po.BUILD_NUMBER||Po.RUN_ID||Un.name);function CH(r){return typeof r==\"string\"?!!Po[r]:Object.keys(r).every(function(e){return Po[e]===r[e]})}});var hn={};ut(hn,{KeyRelationship:()=>lc,applyCascade:()=>od,base64RegExp:()=>BH,colorStringAlphaRegExp:()=>wH,colorStringRegExp:()=>yH,computeKey:()=>RA,getPrintable:()=>Vr,hasExactLength:()=>xH,hasForbiddenKeys:()=>Wde,hasKeyRelationship:()=>av,hasMaxLength:()=>Dde,hasMinLength:()=>Pde,hasMutuallyExclusiveKeys:()=>zde,hasRequiredKeys:()=>Jde,hasUniqueItems:()=>kde,isArray:()=>yde,isAtLeast:()=>Nde,isAtMost:()=>Tde,isBase64:()=>jde,isBoolean:()=>mde,isDate:()=>Ide,isDict:()=>Bde,isEnum:()=>Zi,isHexColor:()=>Yde,isISO8601:()=>Gde,isInExclusiveRange:()=>Ode,isInInclusiveRange:()=>Lde,isInstanceOf:()=>Qde,isInteger:()=>Mde,isJSON:()=>qde,isLiteral:()=>dde,isLowerCase:()=>Kde,isNegative:()=>Rde,isNullable:()=>xde,isNumber:()=>Ede,isObject:()=>bde,isOneOf:()=>Sde,isOptional:()=>vde,isPositive:()=>Fde,isString:()=>sd,isTuple:()=>wde,isUUID4:()=>Hde,isUnknown:()=>vH,isUpperCase:()=>Ude,iso8601RegExp:()=>ov,makeCoercionFn:()=>cc,makeSetter:()=>SH,makeTrait:()=>QH,makeValidator:()=>Qt,matchesRegExp:()=>ad,plural:()=>kI,pushError:()=>pt,simpleKeyRegExp:()=>IH,uuid4RegExp:()=>bH});function Qt({test:r}){return QH(r)()}function Vr(r){return r===null?\"null\":r===void 0?\"undefined\":r===\"\"?\"an empty string\":JSON.stringify(r)}function RA(r,e){var t,i,n;return typeof e==\"number\"?`${(t=r==null?void 0:r.p)!==null&&t!==void 0?t:\".\"}[${e}]`:IH.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 SH(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 dde(r){return Qt({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 Qt({test:(i,n)=>t.has(i)?!0:pt(n,`Expected a valid enumeration value (got ${Vr(i)})`)})}var IH,yH,wH,BH,bH,ov,QH,vH,sd,Cde,mde,Ede,Ide,yde,wde,Bde,bde,Qde,Sde,od,vde,xde,Pde,Dde,xH,kde,Rde,Fde,Nde,Tde,Lde,Ode,Mde,ad,Kde,Ude,Hde,Gde,Yde,jde,qde,Jde,Wde,zde,lc,Vde,av,ls=Tge(()=>{IH=/^[a-zA-Z_][a-zA-Z0-9_]*$/,yH=/^#[0-9a-f]{6}$/i,wH=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,BH=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,bH=/^[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)?)$/,QH=r=>()=>r;vH=()=>Qt({test:(r,e)=>!0});sd=()=>Qt({test:(r,e)=>typeof r!=\"string\"?pt(e,`Expected a string (got ${Vr(r)})`):!0});Cde=new Map([[\"true\",!0],[\"True\",!0],[\"1\",!0],[1,!0],[\"false\",!1],[\"False\",!1],[\"0\",!1],[0,!1]]),mde=()=>Qt({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=Cde.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}}),Ede=()=>Qt({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}}),Ide=()=>Qt({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}}),yde=(r,{delimiter:e}={})=>Qt({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:RA(i,o),coercion:cc(t,o)}))&&s,!(!s&&(i==null?void 0:i.errors)==null));++o);return s}}),wde=(r,{delimiter:e}={})=>{let t=xH(r.length);return Qt({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:RA(n,a),coercion:cc(i,a)}))&&o,!(!o&&(n==null?void 0:n.errors)==null));++a);return o}})},Bde=(r,{keys:e=null}={})=>Qt({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:RA(i,l)}),\"Unsafe property name\");continue}if(e!==null&&!e(l,i)){s=!1;continue}if(!r(c,Object.assign(Object.assign({},i),{p:RA(i,l),coercion:cc(t,l)}))){s=!1;continue}}return s}}),bde=(r,{extra:e=null}={})=>{let t=Object.keys(r);return Qt({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:RA(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:RA(n,l),coercion:cc(i,l)}))&&a:e===null?a=pt(Object.assign(Object.assign({},n),{p:RA(n,l)}),`Extraneous property (got ${Vr(u)})`):Object.defineProperty(o,l,{enumerable:!0,get:()=>u,set:SH(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}})},Qde=r=>Qt({test:(e,t)=>e instanceof r?!0:pt(t,`Expected an instance of ${r.name} (got ${Vr(e)})`)}),Sde=(r,{exclusive:e=!1}={})=>Qt({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)=>Qt({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()}}}),vde=r=>Qt({test:(e,t)=>typeof e>\"u\"?!0:r(e,t)}),xde=r=>Qt({test:(e,t)=>e===null?!0:r(e,t)}),Pde=r=>Qt({test:(e,t)=>e.length>=r?!0:pt(t,`Expected to have a length of at least ${r} elements (got ${e.length})`)}),Dde=r=>Qt({test:(e,t)=>e.length<=r?!0:pt(t,`Expected to have a length of at most ${r} elements (got ${e.length})`)}),xH=r=>Qt({test:(e,t)=>e.length!==r?pt(t,`Expected to have a length of exactly ${r} elements (got ${e.length})`):!0}),kde=({map:r}={})=>Qt({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}}),Rde=()=>Qt({test:(r,e)=>r<=0?!0:pt(e,`Expected to be negative (got ${r})`)}),Fde=()=>Qt({test:(r,e)=>r>=0?!0:pt(e,`Expected to be positive (got ${r})`)}),Nde=r=>Qt({test:(e,t)=>e>=r?!0:pt(t,`Expected to be at least ${r} (got ${e})`)}),Tde=r=>Qt({test:(e,t)=>e<=r?!0:pt(t,`Expected to be at most ${r} (got ${e})`)}),Lde=(r,e)=>Qt({test:(t,i)=>t>=r&&t<=e?!0:pt(i,`Expected to be in the [${r}; ${e}] range (got ${t})`)}),Ode=(r,e)=>Qt({test:(t,i)=>t>=r&&t<e?!0:pt(i,`Expected to be in the [${r}; ${e}[ range (got ${t})`)}),Mde=({unsafe:r=!1}={})=>Qt({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=>Qt({test:(e,t)=>r.test(e)?!0:pt(t,`Expected to match the pattern ${r.toString()} (got ${Vr(e)})`)}),Kde=()=>Qt({test:(r,e)=>r!==r.toLowerCase()?pt(e,`Expected to be all-lowercase (got ${r})`):!0}),Ude=()=>Qt({test:(r,e)=>r!==r.toUpperCase()?pt(e,`Expected to be all-uppercase (got ${r})`):!0}),Hde=()=>Qt({test:(r,e)=>bH.test(r)?!0:pt(e,`Expected to be a valid UUID v4 (got ${Vr(r)})`)}),Gde=()=>Qt({test:(r,e)=>ov.test(r)?!1:pt(e,`Expected to be a valid ISO 8601 date string (got ${Vr(r)})`)}),Yde=({alpha:r=!1})=>Qt({test:(e,t)=>(r?yH.test(e):wH.test(e))?!0:pt(t,`Expected to be a valid hexadecimal color string (got ${Vr(e)})`)}),jde=()=>Qt({test:(r,e)=>BH.test(r)?!0:pt(e,`Expected to be a valid base 64 string (got ${Vr(r)})`)}),qde=(r=vH())=>Qt({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 Qt({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}})},Wde=r=>{let e=new Set(r);return Qt({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}})},zde=r=>{let e=new Set(r);return Qt({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={}));Vde={[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=Vde[e];return Qt({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 qH=w((A$e,jH)=>{\"use strict\";jH.exports=(r,...e)=>new Promise(t=>{t(r(...e))})});var Jg=w((l$e,pv)=>{\"use strict\";var gCe=qH(),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=gCe(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((u$e,WH)=>{var fCe=\"2.0.0\",hCe=Number.MAX_SAFE_INTEGER||9007199254740991,pCe=16;WH.exports={SEMVER_SPEC_VERSION:fCe,MAX_LENGTH:256,MAX_SAFE_INTEGER:hCe,MAX_SAFE_COMPONENT_LENGTH:pCe}});var fd=w((g$e,zH)=>{var dCe=typeof process==\"object\"&&process.env&&process.env.NODE_DEBUG&&/\\bsemver\\b/i.test(process.env.NODE_DEBUG)?(...r)=>console.error(\"SEMVER\",...r):()=>{};zH.exports=dCe});var uc=w((NA,VH)=>{var{MAX_SAFE_COMPONENT_LENGTH:dv}=gd(),CCe=fd();NA=VH.exports={};var mCe=NA.re=[],et=NA.src=[],tt=NA.t={},ECe=0,St=(r,e,t)=>{let i=ECe++;CCe(i,e),tt[r]=i,et[i]=e,mCe[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);NA.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);NA.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);NA.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((f$e,XH)=>{var ICe=[\"includePrerelease\",\"loose\",\"rtl\"],yCe=r=>r?typeof r!=\"object\"?{loose:!0}:ICe.filter(e=>r[e]).reduce((e,t)=>(e[t]=!0,e),{}):{};XH.exports=yCe});var OI=w((h$e,$H)=>{var ZH=/^[0-9]+$/,_H=(r,e)=>{let t=ZH.test(r),i=ZH.test(e);return t&&i&&(r=+r,e=+e),r===e?0:t&&!i?-1:i&&!t?1:r<e?-1:1},wCe=(r,e)=>_H(e,r);$H.exports={compareIdentifiers:_H,rcompareIdentifiers:wCe}});var Li=w((p$e,iG)=>{var MI=fd(),{MAX_LENGTH:eG,MAX_SAFE_INTEGER:KI}=gd(),{re:tG,t:rG}=uc(),BCe=hd(),{compareIdentifiers:pd}=OI(),Yn=class{constructor(e,t){if(t=BCe(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>eG)throw new TypeError(`version is longer than ${eG} characters`);MI(\"SemVer\",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let i=e.trim().match(t.loose?tG[rG.LOOSE]:tG[rG.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}};iG.exports=Yn});var gc=w((d$e,aG)=>{var{MAX_LENGTH:bCe}=gd(),{re:nG,t:sG}=uc(),oG=Li(),QCe=hd(),SCe=(r,e)=>{if(e=QCe(e),r instanceof oG)return r;if(typeof r!=\"string\"||r.length>bCe||!(e.loose?nG[sG.LOOSE]:nG[sG.FULL]).test(r))return null;try{return new oG(r,e)}catch{return null}};aG.exports=SCe});var lG=w((C$e,AG)=>{var vCe=gc(),xCe=(r,e)=>{let t=vCe(r,e);return t?t.version:null};AG.exports=xCe});var uG=w((m$e,cG)=>{var PCe=gc(),DCe=(r,e)=>{let t=PCe(r.trim().replace(/^[=v]+/,\"\"),e);return t?t.version:null};cG.exports=DCe});var fG=w((E$e,gG)=>{var kCe=Li(),RCe=(r,e,t,i)=>{typeof t==\"string\"&&(i=t,t=void 0);try{return new kCe(r,t).inc(e,i).version}catch{return null}};gG.exports=RCe});var cs=w((I$e,pG)=>{var hG=Li(),FCe=(r,e,t)=>new hG(r,t).compare(new hG(e,t));pG.exports=FCe});var UI=w((y$e,dG)=>{var NCe=cs(),TCe=(r,e,t)=>NCe(r,e,t)===0;dG.exports=TCe});var EG=w((w$e,mG)=>{var CG=gc(),LCe=UI(),OCe=(r,e)=>{if(LCe(r,e))return null;{let t=CG(r),i=CG(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}};mG.exports=OCe});var yG=w((B$e,IG)=>{var MCe=Li(),KCe=(r,e)=>new MCe(r,e).major;IG.exports=KCe});var BG=w((b$e,wG)=>{var UCe=Li(),HCe=(r,e)=>new UCe(r,e).minor;wG.exports=HCe});var QG=w((Q$e,bG)=>{var GCe=Li(),YCe=(r,e)=>new GCe(r,e).patch;bG.exports=YCe});var vG=w((S$e,SG)=>{var jCe=gc(),qCe=(r,e)=>{let t=jCe(r,e);return t&&t.prerelease.length?t.prerelease:null};SG.exports=qCe});var PG=w((v$e,xG)=>{var JCe=cs(),WCe=(r,e,t)=>JCe(e,r,t);xG.exports=WCe});var kG=w((x$e,DG)=>{var zCe=cs(),VCe=(r,e)=>zCe(r,e,!0);DG.exports=VCe});var HI=w((P$e,FG)=>{var RG=Li(),XCe=(r,e,t)=>{let i=new RG(r,t),n=new RG(e,t);return i.compare(n)||i.compareBuild(n)};FG.exports=XCe});var TG=w((D$e,NG)=>{var ZCe=HI(),_Ce=(r,e)=>r.sort((t,i)=>ZCe(t,i,e));NG.exports=_Ce});var OG=w((k$e,LG)=>{var $Ce=HI(),eme=(r,e)=>r.sort((t,i)=>$Ce(i,t,e));LG.exports=eme});var dd=w((R$e,MG)=>{var tme=cs(),rme=(r,e,t)=>tme(r,e,t)>0;MG.exports=rme});var GI=w((F$e,KG)=>{var ime=cs(),nme=(r,e,t)=>ime(r,e,t)<0;KG.exports=nme});var Cv=w((N$e,UG)=>{var sme=cs(),ome=(r,e,t)=>sme(r,e,t)!==0;UG.exports=ome});var YI=w((T$e,HG)=>{var ame=cs(),Ame=(r,e,t)=>ame(r,e,t)>=0;HG.exports=Ame});var jI=w((L$e,GG)=>{var lme=cs(),cme=(r,e,t)=>lme(r,e,t)<=0;GG.exports=cme});var mv=w((O$e,YG)=>{var ume=UI(),gme=Cv(),fme=dd(),hme=YI(),pme=GI(),dme=jI(),Cme=(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 ume(r,t,i);case\"!=\":return gme(r,t,i);case\">\":return fme(r,t,i);case\">=\":return hme(r,t,i);case\"<\":return pme(r,t,i);case\"<=\":return dme(r,t,i);default:throw new TypeError(`Invalid operator: ${e}`)}};YG.exports=Cme});var qG=w((M$e,jG)=>{var mme=Li(),Eme=gc(),{re:qI,t:JI}=uc(),Ime=(r,e)=>{if(r instanceof mme)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:Eme(`${t[2]}.${t[3]||\"0\"}.${t[4]||\"0\"}`,e)};jG.exports=Ime});var WG=w((K$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((U$e,zG)=>{\"use strict\";zG.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++)wme(this,arguments[r]);return this.length};Ht.prototype.unshift=function(){for(var r=0,e=arguments.length;r<e;r++)Bme(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=yme(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 yme(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 wme(r,e){r.tail=new fc(e,r.tail,null,r),r.head||(r.head=r.tail),r.length++}function Bme(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{WG()(Ht)}catch{}});var $G=w((H$e,_G)=>{\"use strict\";var bme=WI(),hc=Symbol(\"max\"),va=Symbol(\"length\"),Wg=Symbol(\"lengthCalculator\"),md=Symbol(\"allowStale\"),pc=Symbol(\"maxAge\"),Sa=Symbol(\"dispose\"),VG=Symbol(\"noDisposeOnSet\"),di=Symbol(\"lruList\"),Zs=Symbol(\"cache\"),ZG=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[VG]=e.noDisposeOnSet||!1,this[ZG]=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;XG(this,e,i,t),i=n}}forEach(e,t){t=t||this;for(let i=this[di].head;i!==null;){let n=i.next;XG(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 bme,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[VG]||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[ZG]&&(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}},XG=(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)};_G.exports=yv});var us=w((G$e,iY)=>{var dc=class{constructor(e,t){if(t=Sme(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=>!tY(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&&kme(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=eY.get(i);if(n)return n;let s=this.options.loose,o=s?Oi[bi.HYPHENRANGELOOSE]:Oi[bi.HYPHENRANGE];e=e.replace(o,Hme(this.options.includePrerelease)),Hr(\"hyphen replace\",e),e=e.replace(Oi[bi.COMPARATORTRIM],xme),Hr(\"comparator trim\",e,Oi[bi.COMPARATORTRIM]),e=e.replace(Oi[bi.TILDETRIM],Pme),e=e.replace(Oi[bi.CARETTRIM],Dme),e=e.split(/\\s+/).join(\" \");let a=s?Oi[bi.COMPARATORLOOSE]:Oi[bi.COMPARATOR],l=e.split(\" \").map(f=>Rme(f,this.options)).join(\" \").split(/\\s+/).map(f=>Ume(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(tY(f))return[f];u.set(f.value,f)}u.size>1&&u.has(\"\")&&u.delete(\"\");let g=[...u.values()];return eY.set(i,g),g}intersects(e,t){if(!(e instanceof dc))throw new TypeError(\"a Range is required\");return this.set.some(i=>rY(i,t)&&e.set.some(n=>rY(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 vme(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(Gme(this.set[t],e,this.options))return!0;return!1}};iY.exports=dc;var Qme=$G(),eY=new Qme({max:1e3}),Sme=hd(),Bv=Ed(),Hr=fd(),vme=Li(),{re:Oi,t:bi,comparatorTrimReplace:xme,tildeTrimReplace:Pme,caretTrimReplace:Dme}=uc(),tY=r=>r.value===\"<0.0.0-0\",kme=r=>r.value===\"\",rY=(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},Rme=(r,e)=>(Hr(\"comp\",r,e),r=Tme(r,e),Hr(\"caret\",r),r=Fme(r,e),Hr(\"tildes\",r),r=Ome(r,e),Hr(\"xrange\",r),r=Kme(r,e),Hr(\"stars\",r),r),$i=r=>!r||r.toLowerCase()===\"x\"||r===\"*\",Fme=(r,e)=>r.trim().split(/\\s+/).map(t=>Nme(t,e)).join(\" \"),Nme=(r,e)=>{let t=e.loose?Oi[bi.TILDELOOSE]:Oi[bi.TILDE];return r.replace(t,(i,n,s,o,a)=>{Hr(\"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?(Hr(\"replaceTilde pr\",a),l=`>=${n}.${s}.${o}-${a} <${n}.${+s+1}.0-0`):l=`>=${n}.${s}.${o} <${n}.${+s+1}.0-0`,Hr(\"tilde return\",l),l})},Tme=(r,e)=>r.trim().split(/\\s+/).map(t=>Lme(t,e)).join(\" \"),Lme=(r,e)=>{Hr(\"caret\",r,e);let t=e.loose?Oi[bi.CARETLOOSE]:Oi[bi.CARET],i=e.includePrerelease?\"-0\":\"\";return r.replace(t,(n,s,o,a,l)=>{Hr(\"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?(Hr(\"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`):(Hr(\"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`),Hr(\"caret return\",c),c})},Ome=(r,e)=>(Hr(\"replaceXRanges\",r,e),r.split(/\\s+/).map(t=>Mme(t,e)).join(\" \")),Mme=(r,e)=>{r=r.trim();let t=e.loose?Oi[bi.XRANGELOOSE]:Oi[bi.XRANGE];return r.replace(t,(i,n,s,o,a,l)=>{Hr(\"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`),Hr(\"xRange return\",i),i})},Kme=(r,e)=>(Hr(\"replaceStars\",r,e),r.trim().replace(Oi[bi.STAR],\"\")),Ume=(r,e)=>(Hr(\"replaceGTE0\",r,e),r.trim().replace(Oi[e.includePrerelease?bi.GTE0PRE:bi.GTE0],\"\")),Hme=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()),Gme=(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(Hr(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((Y$e,AY)=>{var Id=Symbol(\"SemVer ANY\"),Vg=class{static get ANY(){return Id}constructor(e,t){if(t=Yme(t),e instanceof Vg){if(e.loose===!!t.loose)return e;e=e.value}Qv(\"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,Qv(\"comp\",this)}parse(e){let t=this.options.loose?nY[sY.COMPARATORLOOSE]:nY[sY.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 oY(i[2],this.options.loose):this.semver=Id}toString(){return this.value}test(e){if(Qv(\"Comparator.test\",e,this.options.loose),this.semver===Id||e===Id)return!0;if(typeof e==\"string\")try{e=new oY(e,this.options)}catch{return!1}return bv(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 aY(e.value,t).test(this.value);if(e.operator===\"\")return e.value===\"\"?!0:new aY(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=bv(this.semver,\"<\",e.semver,t)&&(this.operator===\">=\"||this.operator===\">\")&&(e.operator===\"<=\"||e.operator===\"<\"),l=bv(this.semver,\">\",e.semver,t)&&(this.operator===\"<=\"||this.operator===\"<\")&&(e.operator===\">=\"||e.operator===\">\");return i||n||s&&o||a||l}};AY.exports=Vg;var Yme=hd(),{re:nY,t:sY}=uc(),bv=mv(),Qv=fd(),oY=Li(),aY=us()});var yd=w((j$e,lY)=>{var jme=us(),qme=(r,e,t)=>{try{e=new jme(e,t)}catch{return!1}return e.test(r)};lY.exports=qme});var uY=w((q$e,cY)=>{var Jme=us(),Wme=(r,e)=>new Jme(r,e).set.map(t=>t.map(i=>i.value).join(\" \").trim().split(\" \"));cY.exports=Wme});var fY=w((J$e,gY)=>{var zme=Li(),Vme=us(),Xme=(r,e,t)=>{let i=null,n=null,s=null;try{s=new Vme(e,t)}catch{return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===-1)&&(i=o,n=new zme(i,t))}),i};gY.exports=Xme});var pY=w((W$e,hY)=>{var Zme=Li(),_me=us(),$me=(r,e,t)=>{let i=null,n=null,s=null;try{s=new _me(e,t)}catch{return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===1)&&(i=o,n=new Zme(i,t))}),i};hY.exports=$me});var mY=w((z$e,CY)=>{var Sv=Li(),eEe=us(),dY=dd(),tEe=(r,e)=>{r=new eEe(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||dY(a,s))&&(s=a);break;case\"<\":case\"<=\":break;default:throw new Error(`Unexpected operation: ${o.operator}`)}}),s&&(!t||dY(t,s))&&(t=s)}return t&&r.test(t)?t:null};CY.exports=tEe});var IY=w((V$e,EY)=>{var rEe=us(),iEe=(r,e)=>{try{return new rEe(r,e).range||\"*\"}catch{return null}};EY.exports=iEe});var VI=w((X$e,bY)=>{var nEe=Li(),BY=Ed(),{ANY:sEe}=BY,oEe=us(),aEe=yd(),yY=dd(),wY=GI(),AEe=jI(),lEe=YI(),cEe=(r,e,t,i)=>{r=new nEe(r,i),e=new oEe(e,i);let n,s,o,a,l;switch(t){case\">\":n=yY,s=AEe,o=wY,a=\">\",l=\">=\";break;case\"<\":n=wY,s=lEe,o=yY,a=\"<\",l=\"<=\";break;default:throw new TypeError('Must provide a hilo val of \"<\" or \">\"')}if(aEe(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===sEe&&(h=new BY(\">=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};bY.exports=cEe});var SY=w((Z$e,QY)=>{var uEe=VI(),gEe=(r,e,t)=>uEe(r,e,\">\",t);QY.exports=gEe});var xY=w((_$e,vY)=>{var fEe=VI(),hEe=(r,e,t)=>fEe(r,e,\"<\",t);vY.exports=hEe});var kY=w(($$e,DY)=>{var PY=us(),pEe=(r,e,t)=>(r=new PY(r,t),e=new PY(e,t),r.intersects(e));DY.exports=pEe});var FY=w((eet,RY)=>{var dEe=yd(),CEe=cs();RY.exports=(r,e,t)=>{let i=[],n=null,s=null,o=r.sort((u,g)=>CEe(u,g,t));for(let u of o)dEe(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 MY=w((tet,OY)=>{var NY=us(),XI=Ed(),{ANY:vv}=XI,wd=yd(),xv=cs(),mEe=(r,e,t={})=>{if(r===e)return!0;r=new NY(r,t),e=new NY(e,t);let i=!1;e:for(let n of r.set){for(let s of e.set){let o=EEe(n,s,t);if(i=i||o!==null,o)continue e}if(i)return!1}return!0},EEe=(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=TY(n,h,t):h.operator===\"<\"||h.operator===\"<=\"?s=LY(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=TY(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=LY(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)},TY=(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},LY=(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};OY.exports=mEe});var Xr=w((ret,KY)=>{var Pv=uc();KY.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:lG(),clean:uG(),inc:fG(),diff:EG(),major:yG(),minor:BG(),patch:QG(),prerelease:vG(),compare:cs(),rcompare:PG(),compareLoose:kG(),compareBuild:HI(),sort:TG(),rsort:OG(),gt:dd(),lt:GI(),eq:UI(),neq:Cv(),gte:YI(),lte:jI(),cmp:mv(),coerce:qG(),Comparator:Ed(),Range:us(),satisfies:yd(),toComparators:uY(),maxSatisfying:fY(),minSatisfying:pY(),minVersion:mY(),validRange:IY(),outside:VI(),gtr:SY(),ltr:xY(),intersects:kY(),simplifyRange:FY(),subset:MY()}});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((UY,_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:UY,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 IEe=$I(),ey={},yEe=new IEe.RegExpParser;function wEe(r){var e=r.toString();if(ey.hasOwnProperty(e))return ey[e];var t=yEe.pattern(e);return ey[e]=t,t}Xg.getRegExpAst=wEe;function BEe(){ey={}}Xg.clearRegExpParserCache=BEe});var qY=w(Cn=>{\"use strict\";var bEe=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 GY=$I(),gs=Gt(),YY=ty(),xa=Rv(),jY=\"Complement Sets are not supported for first char optimization\";Cn.failedOptimizationPrefixMsg=`Unable to use \"first char\" lexer optimizations:\n`;function QEe(r,e){e===void 0&&(e=!1);try{var t=(0,YY.getRegExpAst)(r),i=iy(t.value,{},t.flags.ignoreCase);return i}catch(s){if(s.message===jY)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: \"+GY.VERSION+`\n`)+\"\tPlease open an issue at: https://github.com/bd82/regexp-to-ast/issues\"+n)}}return[]}Cn.getOptimizedStartCodesIndices=QEe;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(jY);(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&&SEe(r,e)}function SEe(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 HY(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 vEe=function(r){bEe(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?HY(t,this.targetCharCodes)===void 0&&(this.found=!0):HY(t,this.targetCharCodes)!==void 0&&(this.found=!0)},e}(GY.BaseRegExpVisitor);function xEe(r,e){if(e instanceof RegExp){var t=(0,YY.getRegExpAst)(e),i=new vEe(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=xEe});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 WY=$I(),ir=Bd(),xe=Gt(),Zg=qY(),zY=ty(),ko=\"PATTERN\";Ve.DEFAULT_MODE=\"defaultMode\";Ve.MODES=\"modes\";Ve.SUPPORT_STICKY=typeof new RegExp(\"(?:)\").sticky==\"boolean\";function PEe(){Ve.SUPPORT_STICKY=!1}Ve.disableSticky=PEe;function DEe(){Ve.SUPPORT_STICKY=!0}Ve.enableSticky=DEe;function kEe(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(){HEe()});var i;t(\"Reject Lexer.NA\",function(){i=(0,xe.reject)(r,function(v){return v[ko]===ir.Lexer.NA})});var n=!1,s;t(\"Transform Patterns\",function(){n=!1,s=(0,xe.map)(i,function(v){var D=v[ko];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=Aj(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(oj(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,sj),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=kEe;function REe(r,e){var t=[],i=VY(r);t=t.concat(i.errors);var n=XY(i.valid),s=n.valid;return t=t.concat(n.errors),t=t.concat(FEe(s)),t=t.concat(rj(s)),t=t.concat(ij(s,e)),t=t.concat(nj(s)),t}Ve.validatePatterns=REe;function FEe(r){var e=[],t=(0,xe.filter)(r,function(i){return(0,xe.isRegExp)(i[ko])});return e=e.concat(ZY(t)),e=e.concat($Y(t)),e=e.concat(ej(t)),e=e.concat(tj(t)),e=e.concat(_Y(t)),e}function VY(r){var e=(0,xe.filter)(r,function(n){return!(0,xe.has)(n,ko)}),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=VY;function XY(r){var e=(0,xe.filter)(r,function(n){var s=n[ko];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=XY;var NEe=/[^\\\\][\\$]/;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.visitEndAnchor=function(o){this.found=!0},s}(WY.BaseRegExpVisitor),t=(0,xe.filter)(r,function(n){var s=n[ko];try{var o=(0,zY.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch{return NEe.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=ZY;function _Y(r){var e=(0,xe.filter)(r,function(i){var n=i[ko];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=_Y;var TEe=/[^\\\\[][\\^]|^\\^/;function $Y(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}(WY.BaseRegExpVisitor),t=(0,xe.filter)(r,function(n){var s=n[ko];try{var o=(0,zY.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch{return TEe.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=$Y;function ej(r){var e=(0,xe.filter)(r,function(i){var n=i[ko];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=ej;function tj(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=tj;function rj(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=rj;function ij(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=ij;function nj(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)&&OEe(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&&LEe(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=nj;function LEe(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 OEe(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 MEe(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=MEe;function KEe(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[ko]===ir.Lexer.NA}),a=Aj(t);return e&&(0,xe.forEach)(o,function(l){var c=oj(l,a);if(c!==!1){var u=aj(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=KEe;function UEe(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=UEe;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 sj(r){return(0,xe.isString)(r)&&r.length===1?r.charCodeAt(0):!1}Ve.isShortPattern=sj;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 oj(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 aj(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=aj;function Aj(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 HEe(){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 GEe(r,e){var t=r.tokenTypeIdx;return t===e.tokenTypeIdx?!0:e.isParent===!0&&e.categoryMatchesMap[t]===!0}Nt.tokenStructuredMatcher=GEe;function YEe(r,e){return r.tokenTypeIdx===e.tokenTypeIdx}Nt.tokenStructuredMatcherNoCategories=YEe;Nt.tokenShortNameIdx=1;Nt.tokenIdxToClass={};function jEe(r){var e=lj(r);cj(e),gj(e),uj(e),(0,Zr.forEach)(e,function(t){t.isParent=t.categoryMatches.length>0})}Nt.augmentTokenTypes=jEe;function lj(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=lj;function cj(r){(0,Zr.forEach)(r,function(e){fj(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=[]),hj(e)||(e.categoryMatches=[]),pj(e)||(e.categoryMatchesMap={})})}Nt.assignTokenDefaultProps=cj;function uj(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=uj;function gj(r){(0,Zr.forEach)(r,function(e){Kv([],e)})}Nt.assignCategoriesMapProp=gj;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 fj(r){return(0,Zr.has)(r,\"tokenTypeIdx\")}Nt.hasShortKeyProperty=fj;function Mv(r){return(0,Zr.has)(r,\"CATEGORIES\")}Nt.hasCategoriesProperty=Mv;function hj(r){return(0,Zr.has)(r,\"categoryMatches\")}Nt.hasExtendingTokensTypesProperty=hj;function pj(r){return(0,Zr.has)(r,\"categoryMatchesMap\")}Nt.hasExtendingTokensTypesMapProperty=pj;function qEe(r){return(0,Zr.has)(r,\"tokenTypeIdx\")}Nt.isTokenType=qEe});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(),WEe=Uv(),zEe=ty(),VEe;(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\"})(VEe=Cc.LexerDefinitionErrorType||(Cc.LexerDefinitionErrorType={}));var bd={deferDefinitionErrorsHandling:!1,positionTracking:\"full\",lineTerminatorsPattern:/\\n|\\r\\n?/g,lineTerminatorCharacters:[`\n`,\"\\r\"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:WEe.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1};Object.freeze(bd);var XEe=function(){function r(e,t){var i=this;if(t===void 0&&(t=bd),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)(bd,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===bd.lineTerminatorsPattern)i.config.lineTerminatorsPattern=_s.LineTerminatorOptimizedTester;else if(i.config.lineTerminatorCharacters===bd.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,zEe.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=XEe});var TA=w(Qi=>{\"use strict\";Object.defineProperty(Qi,\"__esModule\",{value:!0});Qi.tokenMatcher=Qi.createTokenInstance=Qi.EOF=Qi.createToken=Qi.hasTokenLabel=Qi.tokenName=Qi.tokenLabel=void 0;var $s=Gt(),ZEe=Bd(),Hv=_g();function _Ee(r){return bj(r)?r.LABEL:r.name}Qi.tokenLabel=_Ee;function $Ee(r){return r.name}Qi.tokenName=$Ee;function bj(r){return(0,$s.isString)(r.LABEL)&&r.LABEL!==\"\"}Qi.hasTokenLabel=bj;var eIe=\"parent\",dj=\"categories\",Cj=\"label\",mj=\"group\",Ej=\"push_mode\",Ij=\"pop_mode\",yj=\"longer_alt\",wj=\"line_breaks\",Bj=\"start_chars_hint\";function Qj(r){return tIe(r)}Qi.createToken=Qj;function tIe(r){var e=r.pattern,t={};if(t.name=r.name,(0,$s.isUndefined)(e)||(t.PATTERN=e),(0,$s.has)(r,eIe))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,dj)&&(t.CATEGORIES=r[dj]),(0,Hv.augmentTokenTypes)([t]),(0,$s.has)(r,Cj)&&(t.LABEL=r[Cj]),(0,$s.has)(r,mj)&&(t.GROUP=r[mj]),(0,$s.has)(r,Ij)&&(t.POP_MODE=r[Ij]),(0,$s.has)(r,Ej)&&(t.PUSH_MODE=r[Ej]),(0,$s.has)(r,yj)&&(t.LONGER_ALT=r[yj]),(0,$s.has)(r,wj)&&(t.LINE_BREAKS=r[wj]),(0,$s.has)(r,Bj)&&(t.START_CHARS_HINT=r[Bj]),t}Qi.EOF=Qj({name:\"EOF\",pattern:ZEe.Lexer.NA});(0,Hv.augmentTokenTypes)([Qi.EOF]);function rIe(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}}Qi.createTokenInstance=rIe;function iIe(r,e){return(0,Hv.tokenStructuredMatcher)(r,e)}Qi.tokenMatcher=iIe});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(),nIe=TA(),Ro=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=Ro;var Sj=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}(Ro);zt.NonTerminal=Sj;var vj=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}(Ro);zt.Rule=vj;var xj=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}(Ro);zt.Alternative=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}(Ro);zt.Option=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}(Ro);zt.RepetitionMandatory=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}(Ro);zt.RepetitionMandatoryWithSeparator=kj;var Rj=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}(Ro);zt.Repetition=Rj;var Fj=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}(Ro);zt.RepetitionWithSeparator=Fj;var Nj=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}(Ro);zt.Alternation=Nj;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 sIe(r){return(0,Ar.map)(r,Qd)}zt.serializeGrammar=sIe;function Qd(r){function e(s){return(0,Ar.map)(s,Qd)}if(r instanceof Sj){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 xj)return{type:\"Alternative\",definition:e(r.definition)};if(r instanceof Pj)return{type:\"Option\",idx:r.idx,definition:e(r.definition)};if(r instanceof Dj)return{type:\"RepetitionMandatory\",idx:r.idx,definition:e(r.definition)};if(r instanceof kj)return{type:\"RepetitionMandatoryWithSeparator\",idx:r.idx,separator:Qd(new oy({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof Fj)return{type:\"RepetitionWithSeparator\",idx:r.idx,separator:Qd(new oy({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof Rj)return{type:\"Repetition\",idx:r.idx,definition:e(r.definition)};if(r instanceof Nj)return{type:\"Alternation\",idx:r.idx,definition:e(r.definition)};if(r instanceof oy){var i={type:\"Terminal\",name:r.terminalType.name,label:(0,nIe.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 vj)return{type:\"Rule\",name:r.name,orgText:r.orgText,definition:e(r.definition)};throw Error(\"non exhaustive match\")}}}zt.serializeProduction=Qd});var Ay=w(ay=>{\"use strict\";Object.defineProperty(ay,\"__esModule\",{value:!0});ay.RestWalker=void 0;var Gv=Gt(),En=mn(),oIe=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=Tj(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=Tj(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=oIe;function Tj(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 Fo=mn(),aIe=function(){function r(){}return r.prototype.visit=function(e){var t=e;switch(t.constructor){case Fo.NonTerminal:return this.visitNonTerminal(t);case Fo.Alternative:return this.visitAlternative(t);case Fo.Option:return this.visitOption(t);case Fo.RepetitionMandatory:return this.visitRepetitionMandatory(t);case Fo.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(t);case Fo.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(t);case Fo.Repetition:return this.visitRepetition(t);case Fo.Alternation:return this.visitAlternation(t);case Fo.Terminal:return this.visitTerminal(t);case Fo.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=aIe});var vd=w(Mi=>{\"use strict\";var AIe=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(),br=mn(),lIe=$g();function cIe(r){return r instanceof br.Alternative||r instanceof br.Option||r instanceof br.Repetition||r instanceof br.RepetitionMandatory||r instanceof br.RepetitionMandatoryWithSeparator||r instanceof br.RepetitionWithSeparator||r instanceof br.Terminal||r instanceof br.Rule}Mi.isSequenceProd=cIe;function Yv(r,e){e===void 0&&(e=[]);var t=r instanceof br.Option||r instanceof br.Repetition||r instanceof br.RepetitionWithSeparator;return t?!0:r instanceof br.Alternation?(0,Sd.some)(r.definition,function(i){return Yv(i,e)}):r instanceof br.NonTerminal&&(0,Sd.contains)(e,r)?!1:r instanceof br.AbstractProduction?(r instanceof br.NonTerminal&&e.push(r),(0,Sd.every)(r.definition,function(i){return Yv(i,e)})):!1}Mi.isOptionalProd=Yv;function uIe(r){return r instanceof br.Alternation}Mi.isBranchingProd=uIe;function gIe(r){if(r instanceof br.NonTerminal)return\"SUBRULE\";if(r instanceof br.Option)return\"OPTION\";if(r instanceof br.Alternation)return\"OR\";if(r instanceof br.RepetitionMandatory)return\"AT_LEAST_ONE\";if(r instanceof br.RepetitionMandatoryWithSeparator)return\"AT_LEAST_ONE_SEP\";if(r instanceof br.RepetitionWithSeparator)return\"MANY_SEP\";if(r instanceof br.Repetition)return\"MANY\";if(r instanceof br.Terminal)return\"CONSUME\";throw Error(\"non exhaustive match\")}Mi.getProductionDslName=gIe;var Lj=function(r){AIe(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}(lIe.GAstVisitor);Mi.DslMethodsCollectorVisitor=Lj;var cy=new Lj;function fIe(r){cy.reset(),r.accept(cy);var e=cy.dslMethods;return cy.reset(),e}Mi.collectMethods=fIe});var qv=w(No=>{\"use strict\";Object.defineProperty(No,\"__esModule\",{value:!0});No.firstForTerminal=No.firstForBranching=No.firstForSequence=No.first=void 0;var uy=Gt(),Oj=mn(),jv=vd();function gy(r){if(r instanceof Oj.NonTerminal)return gy(r.referencedRule);if(r instanceof Oj.Terminal)return Uj(r);if((0,jv.isSequenceProd)(r))return Mj(r);if((0,jv.isBranchingProd)(r))return Kj(r);throw Error(\"non exhaustive match\")}No.first=gy;function Mj(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)}No.firstForSequence=Mj;function Kj(r){var e=(0,uy.map)(r.definition,function(t){return gy(t)});return(0,uy.uniq)((0,uy.flatten)(e))}No.firstForBranching=Kj;function Uj(r){return[r.terminalType]}No.firstForTerminal=Uj});var Jv=w(fy=>{\"use strict\";Object.defineProperty(fy,\"__esModule\",{value:!0});fy.IN=void 0;fy.IN=\"_~IN~_\"});var qj=w(fs=>{\"use strict\";var hIe=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 pIe=Ay(),dIe=qv(),Hj=Gt(),Gj=Jv(),CIe=mn(),Yj=function(r){hIe(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=jj(t.referencedRule,t.idx)+this.topProd.name,o=i.concat(n),a=new CIe.Alternative({definition:o}),l=(0,dIe.first)(a);this.follows[s]=l},e}(pIe.RestWalker);fs.ResyncFollowsWalker=Yj;function mIe(r){var e={};return(0,Hj.forEach)(r,function(t){var i=new Yj(t).startWalking();(0,Hj.assign)(e,i)}),e}fs.computeAllProdsFollows=mIe;function jj(r,e){return r.name+e+Gj.IN}fs.buildBetweenProdsFollowPrefix=jj;function EIe(r){var e=r.terminalType.name;return e+r.idx+Gj.IN}fs.buildInProdFollowPrefix=EIe});var xd=w(Da=>{\"use strict\";Object.defineProperty(Da,\"__esModule\",{value:!0});Da.defaultGrammarValidatorErrorProvider=Da.defaultGrammarResolverErrorProvider=Da.defaultParserErrorProvider=void 0;var ef=TA(),IIe=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=IIe.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 Vj=w(LA=>{\"use strict\";var yIe=LA&&LA.__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(LA,\"__esModule\",{value:!0});LA.GastRefResolverVisitor=LA.resolveGrammar=void 0;var wIe=jn(),Wj=Gt(),BIe=$g();function bIe(r,e){var t=new zj(r,e);return t.resolveRefs(),t.errors}LA.resolveGrammar=bIe;var zj=function(r){yIe(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,Wj.forEach)((0,Wj.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:wIe.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:t.nonTerminalName})}},e}(BIe.GAstVisitor);LA.GastRefResolverVisitor=zj});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 Xj=Ay(),Kt=Gt(),QIe=qv(),kt=mn(),Zj=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}(Xj.RestWalker);Nr.AbstractNextPossibleTokensWalker=Zj;var SIe=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,QIe.first)(o),this.found=!0}},e}(Zj);Nr.NextAfterTokenWalker=SIe;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}(Xj.RestWalker);Nr.AbstractNextTerminalAfterProductionWalker=Pd;var vIe=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=vIe;var xIe=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=xIe;var PIe=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=PIe;var DIe=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=DIe;function _j(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=_j(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=_j;function kIe(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(RIe(B,p,C,y));else throw Error(\"non exhaustive match\")}}return u}Nr.nextPossibleTokensAfter=kIe;function RIe(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 tq=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(),$j=Dd(),FIe=Ay(),hy=_g(),OA=mn(),NIe=$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 TIe(r){if(r instanceof OA.Option)return oi.OPTION;if(r instanceof OA.Repetition)return oi.REPETITION;if(r instanceof OA.RepetitionMandatory)return oi.REPETITION_MANDATORY;if(r instanceof OA.RepetitionMandatoryWithSeparator)return oi.REPETITION_MANDATORY_WITH_SEPARATOR;if(r instanceof OA.RepetitionWithSeparator)return oi.REPETITION_WITH_SEPARATOR;if(r instanceof OA.Alternation)return oi.ALTERNATION;throw Error(\"non exhaustive match\")}Zt.getProdType=TIe;function LIe(r,e,t,i,n,s){var o=iq(r,e,t),a=Xv(o)?hy.tokenStructuredMatcherNoCategories:hy.tokenStructuredMatcher;return s(o,i,a,n)}Zt.buildLookaheadFuncForOr=LIe;function OIe(r,e,t,i,n,s){var o=nq(r,e,n,t),a=Xv(o)?hy.tokenStructuredMatcherNoCategories:hy.tokenStructuredMatcher;return s(o[0],a,i)}Zt.buildLookaheadFuncForOptionalProd=OIe;function MIe(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=MIe;function KIe(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=KIe;var UIe=function(r){tq(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}(FIe.RestWalker),rq=function(r){tq(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}(NIe.GAstVisitor);function eq(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 HIe(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,$j.possiblePathsFrom)([u],1)}),i=eq(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=eq(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=HIe(n,C,u);if(y||(0,sr.isEmpty)(p)||h.length===e){var B=i[u];if(sq(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,$j.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 iq(r,e,t,i){var n=new rq(r,oi.ALTERNATION,i);return e.accept(n),Vv(n.result,t)}Zt.getLookaheadPathsForOr=iq;function nq(r,e,t,i){var n=new rq(r,t);e.accept(n);var s=n.result,o=new UIe(e,r,t),a=o.startWalking(),l=new OA.Alternative({definition:s}),c=new OA.Alternative({definition:a});return Vv([l,c],i)}Zt.getLookaheadPathsForOptionalProd=nq;function sq(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=sq;function GIe(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=GIe;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(),Qr=Gt(),To=jn(),_v=vd(),tf=kd(),YIe=Dd(),to=mn(),$v=$g();function jIe(r,e,t,i,n){var s=er.map(r,function(h){return qIe(h,i)}),o=er.map(r,function(h){return ex(h,h,i)}),a=[],l=[],c=[];(0,Qr.every)(o,Qr.isEmpty)&&(a=(0,Qr.map)(r,function(h){return cq(h,i)}),l=(0,Qr.map)(r,function(h){return uq(h,e,i)}),c=hq(r,e,i));var u=zIe(r,t,i),g=(0,Qr.map)(r,function(h){return fq(h,i)}),f=(0,Qr.map)(r,function(h){return lq(h,r,n,i)});return er.flatten(s.concat(c,o,a,l,u,g,f))}Vt.validateGrammar=jIe;function qIe(r,e){var t=new Aq;r.accept(t);var i=t.allProductions,n=er.groupBy(i,oq),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:To.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:r.name,dslName:u,occurrence:l.idx},f=aq(l);return f&&(g.parameter=f),g});return o}function oq(r){return(0,_v.getProductionDslName)(r)+\"_#_\"+r.idx+\"_#_\"+aq(r)}Vt.identifyProductionForDuplicates=oq;function aq(r){return r instanceof to.Terminal?r.terminalType.name:r instanceof to.NonTerminal?r.nonTerminalName:\"\"}var Aq=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=Aq;function lq(r,e,t,i){var n=[],s=(0,Qr.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:To.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:r.name})}return n}Vt.validateRuleDoesNotAlreadyExist=lq;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:To.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:To.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 cq(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,YIe.nextPossibleTokensAfter)([c],[],null,1);return er.isEmpty(g)?{message:e.buildEmptyAlternationError({topLevelRule:r,alternation:o,emptyChoiceIdx:u}),type:To.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=cq;function uq(r,e,t){var i=new tx;r.accept(i);var n=i.alternations;n=(0,Qr.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=WIe(u,a,r,t),f=pq(u,a,r,t);return o.concat(g,f)},[]);return s}Vt.validateAmbiguousAlternationAlternatives=uq;var gq=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=gq;function fq(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:To.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:r.name,occurrence:o.idx}),s},[]);return n}Vt.validateTooManyAlts=fq;function hq(r,e,t){var i=[];return(0,Qr.forEach)(r,function(n){var s=new gq;n.accept(s);var o=s.allProductions;(0,Qr.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,Qr.isEmpty)((0,Qr.flatten)(f))){var h=t.buildEmptyRepetitionError({topLevelRule:n,repetition:a});i.push({message:h,type:To.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,ruleName:n.name})}})}),i}Vt.validateSomeNonEmptyLookaheadPath=hq;function WIe(r,e,t,i){var n=[],s=(0,Qr.reduce)(r,function(a,l,c){return e.definition[c].ignoreAmbiguities===!0||(0,Qr.forEach)(l,function(u){var g=[c];(0,Qr.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,Qr.map)(a.alts,function(u){return u+1}),c=i.buildAlternationAmbiguityError({topLevelRule:t,alternation:e,ambiguityIndices:l,prefixPath:a.path});return{message:c,type:To.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:t.name,occurrence:e.idx,alternatives:[a.alts]}});return o}function pq(r,e,t,i){var n=[],s=(0,Qr.reduce)(r,function(o,a,l){var c=(0,Qr.map)(a,function(u){return{idx:l,path:u}});return o.concat(c)},[]);return(0,Qr.forEach)(s,function(o){var a=e.definition[o.idx];if(a.ignoreAmbiguities!==!0){var l=o.idx,c=o.path,u=(0,Qr.findAll)(s,function(f){return e.definition[f.idx].ignoreAmbiguities!==!0&&f.idx<l&&(0,tf.isStrictPrefixOfPath)(f.path,c)}),g=(0,Qr.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:To.ParserDefinitionErrorType.AMBIGUOUS_PREFIX_ALTS,ruleName:t.name,occurrence:p,alternatives:h}});n=n.concat(g)}}),n}Vt.checkPrefixAlternativesAmbiguities=pq;function zIe(r,e,t){var i=[],n=(0,Qr.map)(e,function(s){return s.name});return(0,Qr.forEach)(r,function(s){var o=s.name;if((0,Qr.contains)(n,o)){var a=t.buildNamespaceConflictError(s);i.push({message:a,type:To.ParserDefinitionErrorType.CONFLICT_TOKENS_RULES_NAMESPACE,ruleName:o})}}),i}});var Cq=w(rf=>{\"use strict\";Object.defineProperty(rf,\"__esModule\",{value:!0});rf.validateGrammar=rf.resolveGrammar=void 0;var ix=Gt(),VIe=Vj(),XIe=rx(),dq=xd();function ZIe(r){r=(0,ix.defaults)(r,{errMsgProvider:dq.defaultGrammarResolverErrorProvider});var e={};return(0,ix.forEach)(r.rules,function(t){e[t.name]=t}),(0,VIe.resolveGrammar)(e,r.errMsgProvider)}rf.resolveGrammar=ZIe;function _Ie(r){return r=(0,ix.defaults)(r,{errMsgProvider:dq.defaultGrammarValidatorErrorProvider}),(0,XIe.validateGrammar)(r.rules,r.maxLookahead,r.tokenTypes,r.errMsgProvider,r.grammarName)}rf.validateGrammar=_Ie});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 $Ie=Gt(),mq=\"MismatchedTokenException\",Eq=\"NoViableAltException\",Iq=\"EarlyExitException\",yq=\"NotAllInputParsedException\",wq=[mq,Eq,Iq,yq];Object.freeze(wq);function eye(r){return(0,$Ie.contains)(wq,r.name)}In.isRecognitionException=eye;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),tye=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.MismatchedTokenException=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=Eq,s}return e}(py);In.NoViableAltException=rye;var iye=function(r){Fd(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.name=yq,n}return e}(py);In.NotAllInputParsedException=iye;var nye=function(r){Fd(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=Iq,s}return e}(py);In.EarlyExitException=nye});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=TA(),hs=Gt(),sye=nf(),oye=Jv(),aye=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 Aye=function(){function r(){}return r.prototype.initRecoverable=function(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=(0,hs.has)(e,\"recoveryEnabled\")?e.recoveryEnabled:aye.DEFAULT_PARSER_CONFIG.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=Bq)},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 sye.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+oye.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=Aye;function Bq(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=Bq});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 lye(r,e,t){return t|e|r}Jt.getKeyForAutomaticLookahead=lye;var xet=32-Jt.BITS_FOR_ALT_IDX});var Qq=w(my=>{\"use strict\";Object.defineProperty(my,\"__esModule\",{value:!0});my.LooksAhead=void 0;var ka=kd(),ro=Gt(),bq=jn(),Ra=Cy(),Ec=vd(),cye=function(){function r(){}return r.prototype.initLooksAhead=function(e){this.dynamicTokensEnabled=(0,ro.has)(e,\"dynamicTokensEnabled\")?e.dynamicTokensEnabled:bq.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=(0,ro.has)(e,\"maxLookahead\")?e.maxLookahead:bq.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=cye});var Sq=w(Lo=>{\"use strict\";Object.defineProperty(Lo,\"__esModule\",{value:!0});Lo.addNoneTerminalToCst=Lo.addTerminalToCst=Lo.setNodeLocationFull=Lo.setNodeLocationOnlyOffset=void 0;function uye(r,e){isNaN(r.startOffset)===!0?(r.startOffset=e.startOffset,r.endOffset=e.endOffset):r.endOffset<e.endOffset&&(r.endOffset=e.endOffset)}Lo.setNodeLocationOnlyOffset=uye;function gye(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)}Lo.setNodeLocationFull=gye;function fye(r,e,t){r.children[t]===void 0?r.children[t]=[e]:r.children[t].push(e)}Lo.addTerminalToCst=fye;function hye(r,e,t){r.children[e]===void 0?r.children[e]=[t]:r.children[e].push(t)}Lo.addNoneTerminalToCst=hye});var ox=w(MA=>{\"use strict\";Object.defineProperty(MA,\"__esModule\",{value:!0});MA.defineNameProp=MA.functionName=MA.classNameFromInstance=void 0;var pye=Gt();function dye(r){return xq(r.constructor)}MA.classNameFromInstance=dye;var vq=\"name\";function xq(r){var e=r.name;return e||\"anonymous\"}MA.functionName=xq;function Cye(r,e){var t=Object.getOwnPropertyDescriptor(r,vq);return(0,pye.isUndefined)(t)||t.configurable?(Object.defineProperty(r,vq,{enumerable:!1,configurable:!0,writable:!1,value:e}),!0):!1}MA.defineNameProp=Cye});var Fq=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 Pq(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=Pq;function mye(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=Dq(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=mye;function Eye(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]=Pq}),i.prototype=n,i.prototype.constructor=i,i}Si.createBaseVisitorConstructorWithDefaults=Eye;var ax;(function(r){r[r.REDUNDANT_METHOD=0]=\"REDUNDANT_METHOD\",r[r.MISSING_METHOD=1]=\"MISSING_METHOD\"})(ax=Si.CstVisitorDefinitionError||(Si.CstVisitorDefinitionError={}));function Dq(r,e){var t=kq(r,e),i=Rq(r,e);return t.concat(i)}Si.validateVisitor=Dq;function kq(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=kq;var Iye=[\"constructor\",\"visit\",\"validateVisitor\"];function Rq(r,e){var t=[];for(var i in r)(0,ps.isFunction)(r[i])&&!(0,ps.contains)(Iye,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=Rq});var Tq=w(Ey=>{\"use strict\";Object.defineProperty(Ey,\"__esModule\",{value:!0});Ey.TreeBuilder=void 0;var sf=Sq(),_r=Gt(),Nq=Fq(),yye=jn(),wye=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:yye.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,Nq.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,Nq.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=wye});var Oq=w(Iy=>{\"use strict\";Object.defineProperty(Iy,\"__esModule\",{value:!0});Iy.LexerAdapter=void 0;var Lq=jn(),Bye=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)):Lq.END_OF_FILE},r.prototype.LA=function(e){var t=this.currIdx+e;return t<0||this.tokVectorLength<=t?Lq.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=Bye});var Kq=w(yy=>{\"use strict\";Object.defineProperty(yy,\"__esModule\",{value:!0});yy.RecognizerApi=void 0;var Mq=Gt(),bye=nf(),Ax=jn(),Qye=xd(),Sye=rx(),vye=mn(),xye=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,Mq.contains)(this.definedRulesNames,e)){var n=Qye.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,Sye.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,bye.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,vye.serializeGrammar)((0,Mq.values)(this.gastProductionsCache))},r}();yy.RecognizerApi=xye});var Yq=w(By=>{\"use strict\";Object.defineProperty(By,\"__esModule\",{value:!0});By.RecognizerEngine=void 0;var Pr=Gt(),qn=Cy(),wy=nf(),Uq=kd(),of=Dd(),Hq=jn(),Pye=sx(),Gq=TA(),Td=_g(),Dye=ox(),kye=function(){function r(){}return r.prototype.initRecognizerEngine=function(e,t){if(this.className=(0,Dye.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=Gq.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:Hq.DEFAULT_RULE_CONFIG.resyncEnabled,s=(0,Pr.has)(i,\"recoveryValueFunc\")?i.recoveryValueFunc:Hq.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,Uq.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,Uq.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===Pye.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),Gq.EOF)},r.prototype.reset=function(){this.resetLexerState(),this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]},r}();By.RecognizerEngine=kye});var qq=w(by=>{\"use strict\";Object.defineProperty(by,\"__esModule\",{value:!0});by.ErrorHandler=void 0;var lx=nf(),cx=Gt(),jq=kd(),Rye=jn(),Fye=function(){function r(){}return r.prototype.initErrorHandler=function(e){this._errors=[],this.errorMessageProvider=(0,cx.has)(e,\"errorMessageProvider\")?e.errorMessageProvider:Rye.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,jq.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,jq.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}();by.ErrorHandler=Fye});var zq=w(Qy=>{\"use strict\";Object.defineProperty(Qy,\"__esModule\",{value:!0});Qy.ContentAssist=void 0;var Jq=Dd(),Wq=Gt(),Nye=function(){function r(){}return r.prototype.initContentAssist=function(){},r.prototype.computeContentAssist=function(e,t){var i=this.gastProductionsCache[e];if((0,Wq.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,Wq.first)(e.ruleStack),i=this.getGAstProductions(),n=i[t],s=new Jq.NextAfterTokenWalker(n,e).startWalking();return s},r}();Qy.ContentAssist=Nye});var rJ=w(xy=>{\"use strict\";Object.defineProperty(xy,\"__esModule\",{value:!0});xy.GastRecorder=void 0;var yn=Gt(),Oo=mn(),Tye=Bd(),_q=_g(),$q=TA(),Lye=jn(),Oye=Cy(),vy={description:\"This Object indicates the Parser is during Recording Phase\"};Object.freeze(vy);var Vq=!0,Xq=Math.pow(2,Oye.BITS_FOR_OCCURRENCE_IDX)-1,eJ=(0,$q.createToken)({name:\"RECORDING_PHASE_TOKEN\",pattern:Tye.Lexer.NA});(0,_q.augmentTokenTypes)([eJ]);var tJ=(0,$q.createTokenInstance)(eJ,`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(tJ);var Mye={name:`This CSTNode indicates the Parser is in Recording Phase\n\tSee: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},Kye=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 Lye.END_OF_FILE},r.prototype.topLevelRuleRecord=function(e,t){try{var i=new Oo.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,Oo.Option,e,t)},r.prototype.atLeastOneInternalRecord=function(e,t){Ld.call(this,Oo.RepetitionMandatory,t,e)},r.prototype.atLeastOneSepFirstInternalRecord=function(e,t){Ld.call(this,Oo.RepetitionMandatoryWithSeparator,t,e,Vq)},r.prototype.manyInternalRecord=function(e,t){Ld.call(this,Oo.Repetition,t,e)},r.prototype.manySepFirstInternalRecord=function(e,t){Ld.call(this,Oo.RepetitionWithSeparator,t,e,Vq)},r.prototype.orInternalRecord=function(e,t){return Uye.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\"+Zq(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 Oo.NonTerminal({idx:t,nonTerminalName:o,label:i==null?void 0:i.LABEL,referencedRule:void 0});return s.definition.push(a),this.outputCst?Mye:vy},r.prototype.consumeInternalRecord=function(e,t,i){if(Sy(t),!(0,_q.hasShortKeyProperty)(e)){var n=new Error(\"<CONSUME\"+Zq(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 Oo.Terminal({idx:t,terminalType:e,label:i==null?void 0:i.LABEL});return s.definition.push(o),tJ},r}();xy.GastRecorder=Kye;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 Uye(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 Oo.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 Oo.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 Zq(r){return r===0?\"\":\"\"+r}function Sy(r){if(r<0||r>Xq){var e=new Error(\"Invalid DSL Method idx value: <\"+r+`>\n\t`+(\"Idx value must be a none negative value smaller than \"+(Xq+1)));throw e.KNOWN_RECORDER_ERROR=!0,e}}});var nJ=w(Py=>{\"use strict\";Object.defineProperty(Py,\"__esModule\",{value:!0});Py.PerformanceTracer=void 0;var iJ=Gt(),Hye=jn(),Gye=function(){function r(){}return r.prototype.initPerformanceTracer=function(e){if((0,iJ.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=Hye.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,iJ.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=Gye});var sJ=w(Dy=>{\"use strict\";Object.defineProperty(Dy,\"__esModule\",{value:!0});Dy.applyMixins=void 0;function Yye(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=Yye});var jn=w(dr=>{\"use strict\";var AJ=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(),jye=qj(),oJ=TA(),lJ=xd(),aJ=Cq(),qye=sx(),Jye=Qq(),Wye=Tq(),zye=Oq(),Vye=Kq(),Xye=Yq(),Zye=qq(),_ye=zq(),$ye=rJ(),ewe=nJ(),twe=sJ();dr.END_OF_FILE=(0,oJ.createTokenInstance)(oJ.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:lJ.defaultParserErrorProvider,nodeLocationTracking:\"none\",traceInitPerf:!1,skipValidations:!1});dr.DEFAULT_RULE_CONFIG=Object.freeze({recoveryValueFunc:function(){},resyncEnabled:!0});var rwe;(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\"})(rwe=dr.ParserDefinitionErrorType||(dr.ParserDefinitionErrorType={}));function iwe(r){return r===void 0&&(r=void 0),function(){return r}}dr.EMPTY_ALT=iwe;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,aJ.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,aJ.validateGrammar)({rules:(0,en.values)(e.gastProductionsCache),maxLookahead:e.maxLookahead,tokenTypes:(0,en.values)(e.tokensMap),errMsgProvider:lJ.defaultGrammarValidatorErrorProvider,grammarName:i});e.definitionErrors=e.definitionErrors.concat(s)}}),(0,en.isEmpty)(e.definitionErrors)&&(e.recoveryEnabled&&e.TRACE_INIT(\"computeAllProdsFollows\",function(){var s=(0,jye.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,twe.applyMixins)(ky,[qye.Recoverable,Jye.LooksAhead,Wye.TreeBuilder,zye.LexerAdapter,Xye.RecognizerEngine,Vye.RecognizerApi,Zye.ErrorHandler,_ye.ContentAssist,$ye.GastRecorder,ewe.PerformanceTracer]);var nwe=function(r){AJ(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=nwe;var swe=function(r){AJ(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=swe});var uJ=w(Ry=>{\"use strict\";Object.defineProperty(Ry,\"__esModule\",{value:!0});Ry.createSyntaxDiagramsCode=void 0;var cJ=Dv();function owe(r,e){var t=e===void 0?{}:e,i=t.resourceBase,n=i===void 0?\"https://unpkg.com/chevrotain@\"+cJ.VERSION+\"/diagrams/\":i,s=t.css,o=s===void 0?\"https://unpkg.com/chevrotain@\"+cJ.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=owe});var hJ=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 awe=Dv();Object.defineProperty(We,\"VERSION\",{enumerable:!0,get:function(){return awe.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 gJ=Bd();Object.defineProperty(We,\"Lexer\",{enumerable:!0,get:function(){return gJ.Lexer}});Object.defineProperty(We,\"LexerDefinitionErrorType\",{enumerable:!0,get:function(){return gJ.LexerDefinitionErrorType}});var af=TA();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 Awe=xd();Object.defineProperty(We,\"defaultParserErrorProvider\",{enumerable:!0,get:function(){return Awe.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 lwe=Uv();Object.defineProperty(We,\"defaultLexerErrorProvider\",{enumerable:!0,get:function(){return lwe.defaultLexerErrorProvider}});var Mo=mn();Object.defineProperty(We,\"Alternation\",{enumerable:!0,get:function(){return Mo.Alternation}});Object.defineProperty(We,\"Alternative\",{enumerable:!0,get:function(){return Mo.Alternative}});Object.defineProperty(We,\"NonTerminal\",{enumerable:!0,get:function(){return Mo.NonTerminal}});Object.defineProperty(We,\"Option\",{enumerable:!0,get:function(){return Mo.Option}});Object.defineProperty(We,\"Repetition\",{enumerable:!0,get:function(){return Mo.Repetition}});Object.defineProperty(We,\"RepetitionMandatory\",{enumerable:!0,get:function(){return Mo.RepetitionMandatory}});Object.defineProperty(We,\"RepetitionMandatoryWithSeparator\",{enumerable:!0,get:function(){return Mo.RepetitionMandatoryWithSeparator}});Object.defineProperty(We,\"RepetitionWithSeparator\",{enumerable:!0,get:function(){return Mo.RepetitionWithSeparator}});Object.defineProperty(We,\"Rule\",{enumerable:!0,get:function(){return Mo.Rule}});Object.defineProperty(We,\"Terminal\",{enumerable:!0,get:function(){return Mo.Terminal}});var fJ=mn();Object.defineProperty(We,\"serializeGrammar\",{enumerable:!0,get:function(){return fJ.serializeGrammar}});Object.defineProperty(We,\"serializeProduction\",{enumerable:!0,get:function(){return fJ.serializeProduction}});var cwe=$g();Object.defineProperty(We,\"GAstVisitor\",{enumerable:!0,get:function(){return cwe.GAstVisitor}});function uwe(){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=uwe;var gwe=uJ();Object.defineProperty(We,\"createSyntaxDiagramsCode\",{enumerable:!0,get:function(){return gwe.createSyntaxDiagramsCode}});var fwe=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=fwe});var CJ=w((Jet,dJ)=>{var Ny=hJ(),Fa=Ny.createToken,pJ=Ny.tokenMatcher,ux=Ny.Lexer,hwe=Ny.EmbeddedActionsParser;dJ.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 hwe{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);pJ(v,t)?y=T=>B(T)||D(T):pJ(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 mJ=w(Ty=>{var pwe=CJ();Ty.makeParser=(r=/[a-z]+/)=>{let{TinylogicLexer:e,TinylogicParser:t}=pwe(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 IJ=w((zet,EJ)=>{\"use strict\";EJ.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((Vet,wJ)=>{var Md=IJ(),yJ={};for(let r of Object.keys(Md))yJ[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\"]}};wJ.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 dwe(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=yJ[r];if(e)return e;let t=1/0,i;for(let n of Object.keys(Md)){let s=Md[n],o=dwe(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 bJ=w((Xet,BJ)=>{var Ly=gx();function Cwe(){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 mwe(r){let e=Cwe(),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 Ewe(r,e){return function(t){return e(r(t))}}function Iwe(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=Ewe(Ly[e[n].parent][n],i),n=e[n].parent;return i.conversion=t,i}BJ.exports=function(r){let e=mwe(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]=Iwe(o,e))}return t}});var SJ=w((Zet,QJ)=>{var fx=gx(),ywe=bJ(),Af={},wwe=Object.keys(fx);function Bwe(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 bwe(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}wwe.forEach(r=>{Af[r]={},Object.defineProperty(Af[r],\"channels\",{value:fx[r].channels}),Object.defineProperty(Af[r],\"labels\",{value:fx[r].labels});let e=ywe(r);Object.keys(e).forEach(i=>{let n=e[i];Af[r][i]=bwe(n),Af[r][i].raw=Bwe(n)})});QJ.exports=Af});var RJ=w((_et,kJ)=>{\"use strict\";var vJ=(r,e)=>(...t)=>`\\x1B[${r(...t)+e}m`,xJ=(r,e)=>(...t)=>{let i=r(...t);return`\\x1B[${38+e};5;${i}m`},PJ=(r,e)=>(...t)=>{let i=r(...t);return`\\x1B[${38+e};2;${i[0]};${i[1]};${i[2]}m`},Oy=r=>r,DJ=(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=SJ());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 Qwe(){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(vJ,\"ansi16\",Oy,!1)),lf(e.color,\"ansi256\",()=>cf(xJ,\"ansi256\",Oy,!1)),lf(e.color,\"ansi16m\",()=>cf(PJ,\"rgb\",DJ,!1)),lf(e.bgColor,\"ansi\",()=>cf(vJ,\"ansi16\",Oy,!0)),lf(e.bgColor,\"ansi256\",()=>cf(xJ,\"ansi256\",Oy,!0)),lf(e.bgColor,\"ansi16m\",()=>cf(PJ,\"rgb\",DJ,!0)),e}Object.defineProperty(kJ,\"exports\",{enumerable:!0,get:Qwe})});var NJ=w(($et,FJ)=>{\"use strict\";FJ.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 OJ=w((ett,LJ)=>{\"use strict\";var Swe=J(\"os\"),TJ=J(\"tty\"),ds=NJ(),{env:ai}=process,KA;ds(\"no-color\")||ds(\"no-colors\")||ds(\"color=false\")||ds(\"color=never\")?KA=0:(ds(\"color\")||ds(\"colors\")||ds(\"color=true\")||ds(\"color=always\"))&&(KA=1);\"FORCE_COLOR\"in ai&&(ai.FORCE_COLOR===\"true\"?KA=1:ai.FORCE_COLOR===\"false\"?KA=0:KA=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(KA===0)return 0;if(ds(\"color=16m\")||ds(\"color=full\")||ds(\"color=truecolor\"))return 3;if(ds(\"color=256\"))return 2;if(r&&!e&&KA===void 0)return 0;let t=KA||0;if(ai.TERM===\"dumb\")return t;if(process.platform===\"win32\"){let i=Swe.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 vwe(r){let e=dx(r,r&&r.isTTY);return px(e)}LJ.exports={supportsColor:vwe,stdout:px(dx(!0,TJ.isatty(1))),stderr:px(dx(!0,TJ.isatty(2)))}});var KJ=w((ttt,MJ)=>{\"use strict\";var xwe=(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},Pwe=(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};MJ.exports={stringReplaceAll:xwe,stringEncaseCRLFWithFirstIndex:Pwe}});var jJ=w((rtt,YJ)=>{\"use strict\";var Dwe=/(?:\\\\(u(?:[a-f\\d]{4}|\\{[a-f\\d]{1,6}\\})|x[a-f\\d]{2}|.))|(?:\\{(~)?(\\w+(?:\\([^)]*\\))?(?:\\.\\w+(?:\\([^)]*\\))?)*)(?:[ \\t]|(?=\\r?\\n)))|(\\})|((?:.|[\\r\\n\\f])+?)/gi,UJ=/(?:^|\\.)(\\w+)(?:\\(([^)]*)\\))?/g,kwe=/^(['\"])((?:\\\\.|(?!\\1)[^\\\\])*)\\1$/,Rwe=/\\\\(u(?:[a-f\\d]{4}|\\{[a-f\\d]{1,6}\\})|x[a-f\\d]{2}|.)|([^\\\\])/gi,Fwe=new Map([[\"n\",`\n`],[\"r\",\"\\r\"],[\"t\",\"\t\"],[\"b\",\"\\b\"],[\"f\",\"\\f\"],[\"v\",\"\\v\"],[\"0\",\"\\0\"],[\"\\\\\",\"\\\\\"],[\"e\",\"\\x1B\"],[\"a\",\"\\x07\"]]);function GJ(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)):Fwe.get(r)||r}function Nwe(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(kwe))t.push(n[2].replace(Rwe,(a,l,c)=>l?GJ(l):c));else throw new Error(`Invalid Chalk template style argument: ${s} (in style '${r}')`)}return t}function Twe(r){UJ.lastIndex=0;let e=[],t;for(;(t=UJ.exec(r))!==null;){let i=t[1];if(t[2]){let n=Nwe(i,t[2]);e.push([i].concat(n))}else e.push([i])}return e}function HJ(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}YJ.exports=(r,e)=>{let t=[],i=[],n=[];if(e.replace(Dwe,(s,o,a,l,c,u)=>{if(o)n.push(GJ(o));else if(l){let g=n.join(\"\");n=[],i.push(t.length===0?g:HJ(r,t)(g)),t.push({inverse:a,styles:Twe(l)})}else if(c){if(t.length===0)throw new Error(\"Found extraneous } in Chalk template literal\");i.push(HJ(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((itt,zJ)=>{\"use strict\";var Kd=RJ(),{stdout:mx,stderr:Ex}=OJ(),{stringReplaceAll:Lwe,stringEncaseCRLFWithFirstIndex:Owe}=KJ(),qJ=[\"ansi\",\"ansi\",\"ansi256\",\"ansi16m\"],uf=Object.create(null),Mwe=(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 Mwe(e,r),e.template=(...t)=>Hwe(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 WJ=[\"rgb\",\"hex\",\"keyword\",\"hsl\",\"hsv\",\"hwb\",\"ansi\",\"ansi256\"];for(let r of WJ)uf[r]={get(){let{level:e}=this;return function(...t){let i=yx(Kd.color[qJ[e]][r](...t),Kd.color.close,this._styler);return Ky(this,i,this._isEmpty)}}};for(let r of WJ){let e=\"bg\"+r[0].toUpperCase()+r.slice(1);uf[e]={get(){let{level:t}=this;return function(...i){let n=yx(Kd.bgColor[qJ[t]][r](...i),Kd.bgColor.close,this._styler);return Ky(this,n,this._isEmpty)}}}}var Kwe=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)=>Uwe(i,n.length===1?\"\"+n[0]:n.join(\" \"));return i.__proto__=Kwe,i._generator=r,i._styler=e,i._isEmpty=t,i},Uwe=(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=Lwe(e,t.close,t.open),t=t.parent;let s=e.indexOf(`\n`);return s!==-1&&(e=Owe(e,n,i,s)),i+e+n},Cx,Hwe=(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=jJ()),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\"};zJ.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((stt,XJ)=>{\"use strict\";var VJ=Uy();XJ.exports=(r,e={})=>{let t=(i,n={})=>{let s=e.escapeInvalid&&VJ.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a=\"\";if(i.value)return(s||o)&&VJ.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 _J=w((ott,ZJ)=>{\"use strict\";ZJ.exports=function(r){return typeof r==\"number\"?r-r===0:typeof r==\"string\"&&r.trim()!==\"\"?Number.isFinite?Number.isFinite(+r):isFinite(+r):!1}});var a3=w((att,o3)=>{\"use strict\";var $J=_J(),Ic=(r,e,t)=>{if($J(r)===!1)throw new TypeError(\"toRegexRange: expected the first argument to be a number\");if(e===void 0||r===e)return String(r);if($J(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=s3(r)||s3(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=e3(C,Math.abs(c),f,i),c=f.a=0}return u>=0&&(h=e3(c,u,f,i)),f.negatives=p,f.positives=h,f.result=Gwe(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 Gwe(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 Ywe(r,e){let t=1,i=1,n=r3(r,t),s=new Set([e]);for(;r<=n&&n<=e;)s.add(n),t+=1,n=r3(r,t);for(n=i3(e+1,i)-1;r<n&&n<=e;)s.add(n),i+=1,n=i3(e+1,i)-1;return s=[...s],s.sort(Jwe),s}function jwe(r,e,t){if(r===e)return{pattern:r,count:[],digits:0};let i=qwe(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+=Wwe(l,c,t):o++}return o&&(s+=t.shorthand===!0?\"\\\\d\":\"[0-9]\"),{pattern:s,count:[o],digits:n}}function e3(r,e,t,i){let n=Ywe(r,e),s=[],o=r,a;for(let l=0;l<n.length;l++){let c=n[l],u=jwe(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+n3(a.count),o=c+1;continue}t.isPadded&&(g=zwe(c,t,i)),u.string=g+u.pattern+n3(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&&!t3(e,\"string\",a)&&s.push(t+a),i&&t3(e,\"string\",a)&&s.push(t+a)}return s}function qwe(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 t3(r,e,t){return r.some(i=>i[e]===t)}function r3(r,e){return Number(String(r).slice(0,-e)+\"9\".repeat(e))}function i3(r,e){return r-r%Math.pow(10,e)}function n3(r){let[e=0,t=\"\"]=r;return t||e>1?`{${e+(t?\",\"+t:\"\")}}`:\"\"}function Wwe(r,e,t){return`[${r}${e-r===1?\"\":\"-\"}${e}]`}function s3(r){return/^-?(0+)\\d/.test(r)}function zwe(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={};o3.exports=Ic});var Sx=w((Att,p3)=>{\"use strict\";var Vwe=J(\"util\"),c3=a3(),A3=r=>r!==null&&typeof r==\"object\"&&!Array.isArray(r),Xwe=r=>e=>r===!0?Number(e):String(e),bx=r=>typeof r==\"number\"||typeof r==\"string\"&&r!==\"\",Hd=r=>Number.isInteger(+r),Qx=r=>{let e=`${r}`,t=-1;if(e[0]===\"-\"&&(e=e.slice(1)),e===\"0\")return!1;for(;e[++t]===\"0\";);return t>0},Zwe=(r,e,t)=>typeof r==\"string\"||typeof e==\"string\"?!0:t.stringify===!0,_we=(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},l3=(r,e)=>{let t=r[0]===\"-\"?\"-\":\"\";for(t&&(r=r.slice(1),e--);r.length<e;)r=\"0\"+r;return t?\"-\"+r:r},$we=(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},u3=(r,e,t,i)=>{if(t)return c3(r,e,{wrap:!1,...i});let n=String.fromCharCode(r);if(r===e)return n;let s=String.fromCharCode(e);return`[${n}-${s}]`},g3=(r,e,t)=>{if(Array.isArray(r)){let i=t.wrap===!0,n=t.capture?\"\":\"?:\";return i?`(${n}${r.join(\"|\")})`:r.join(\"|\")}return c3(r,e,t)},f3=(...r)=>new RangeError(\"Invalid range arguments: \"+Vwe.inspect(...r)),h3=(r,e,t)=>{if(t.strictRanges===!0)throw f3([r,e]);return[]},eBe=(r,e)=>{if(e.strictRanges===!0)throw new TypeError(`Expected step \"${r}\" to be a number`);return[]},tBe=(r,e,t=1,i={})=>{let n=Number(r),s=Number(e);if(!Number.isInteger(n)||!Number.isInteger(s)){if(i.strictRanges===!0)throw f3([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=Qx(a)||Qx(l)||Qx(c),g=u?Math.max(a.length,l.length,c.length):0,f=u===!1&&Zwe(r,e,i)===!1,h=i.transform||Xwe(f);if(i.toRegex&&t===1)return u3(l3(r,g),l3(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(_we(h(n,B),g,f)),n=o?n-t:n+t,B++;return i.toRegex===!0?t>1?$we(p,i):g3(y,null,{wrap:!1,...i}):y},rBe=(r,e,t=1,i={})=>{if(!Hd(r)&&r.length>1||!Hd(e)&&e.length>1)return h3(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 u3(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?g3(u,null,{wrap:!1,options:i}):u},Gy=(r,e,t,i={})=>{if(e==null&&bx(r))return[r];if(!bx(r)||!bx(e))return h3(r,e,i);if(typeof t==\"function\")return Gy(r,e,1,{transform:t});if(A3(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)?tBe(r,e,t,n):rBe(r,e,Math.max(Math.abs(t),1),n):t!=null&&!A3(t)?eBe(t,n):Gy(r,e,1,t)};p3.exports=Gy});var m3=w((ltt,C3)=>{\"use strict\";var iBe=Sx(),d3=Uy(),nBe=(r,e={})=>{let t=(i,n={})=>{let s=d3.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=d3.reduce(i.nodes),g=iBe(...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)};C3.exports=nBe});var y3=w((ctt,I3)=>{\"use strict\";var sBe=Sx(),E3=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)},oBe=(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(),E3(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=sBe(...g,e);f.length===0&&(f=E3(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))};I3.exports=oBe});var B3=w((utt,w3)=>{\"use strict\";w3.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 x3=w((gtt,v3)=>{\"use strict\";var aBe=Hy(),{MAX_LENGTH:b3,CHAR_BACKSLASH:vx,CHAR_BACKTICK:ABe,CHAR_COMMA:lBe,CHAR_DOT:cBe,CHAR_LEFT_PARENTHESES:uBe,CHAR_RIGHT_PARENTHESES:gBe,CHAR_LEFT_CURLY_BRACE:fBe,CHAR_RIGHT_CURLY_BRACE:hBe,CHAR_LEFT_SQUARE_BRACKET:Q3,CHAR_RIGHT_SQUARE_BRACKET:S3,CHAR_DOUBLE_QUOTE:pBe,CHAR_SINGLE_QUOTE:dBe,CHAR_NO_BREAK_SPACE:CBe,CHAR_ZERO_WIDTH_NOBREAK_SPACE:mBe}=B3(),EBe=(r,e={})=>{if(typeof r!=\"string\")throw new TypeError(\"Expected a string\");let t=e||{},i=typeof t.maxLength==\"number\"?Math.min(b3,t.maxLength):b3;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===mBe||f===CBe)){if(f===vx){C({type:\"text\",value:(e.keepEscaping?f:\"\")+p()});continue}if(f===S3){C({type:\"text\",value:\"\\\\\"+f});continue}if(f===Q3){l++;let y=!0,B;for(;u<c&&(B=p());){if(f+=B,B===Q3){l++;continue}if(B===vx){f+=p();continue}if(B===S3&&(l--,l===0))break}C({type:\"text\",value:f});continue}if(f===uBe){o=C({type:\"paren\",nodes:[]}),s.push(o),C({type:\"text\",value:f});continue}if(f===gBe){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===pBe||f===dBe||f===ABe){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===fBe){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===hBe){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===lBe&&g>0){if(o.ranges>0){o.ranges=0;let y=o.nodes.shift();o.nodes=[y,{type:\"text\",value:aBe(o)}]}C({type:\"comma\",value:f}),o.commas++;continue}if(f===cBe&&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};v3.exports=EBe});var k3=w((ftt,D3)=>{\"use strict\";var P3=Hy(),IBe=m3(),yBe=y3(),wBe=x3(),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={})=>wBe(r,e);Jn.stringify=(r,e={})=>P3(typeof r==\"string\"?Jn.parse(r,e):r,e);Jn.compile=(r,e={})=>(typeof r==\"string\"&&(r=Jn.parse(r,e)),IBe(r,e));Jn.expand=(r,e={})=>{typeof r==\"string\"&&(r=Jn.parse(r,e));let t=yBe(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);D3.exports=Jn});var Gd=w((htt,L3)=>{\"use strict\";var BBe=J(\"path\"),Ko=\"\\\\\\\\/\",R3=`[^${Ko}]`,Na=\"\\\\.\",bBe=\"\\\\+\",QBe=\"\\\\?\",Yy=\"\\\\/\",SBe=\"(?=.)\",F3=\"[^/]\",xx=`(?:${Yy}|$)`,N3=`(?:^|${Yy})`,Px=`${Na}{1,2}${xx}`,vBe=`(?!${Na})`,xBe=`(?!${N3}${Px})`,PBe=`(?!${Na}{0,1}${xx})`,DBe=`(?!${Px})`,kBe=`[^.${Yy}]`,RBe=`${F3}*?`,T3={DOT_LITERAL:Na,PLUS_LITERAL:bBe,QMARK_LITERAL:QBe,SLASH_LITERAL:Yy,ONE_CHAR:SBe,QMARK:F3,END_ANCHOR:xx,DOTS_SLASH:Px,NO_DOT:vBe,NO_DOTS:xBe,NO_DOT_SLASH:PBe,NO_DOTS_SLASH:DBe,QMARK_NO_DOT:kBe,STAR:RBe,START_ANCHOR:N3},FBe={...T3,SLASH_LITERAL:`[${Ko}]`,QMARK:R3,STAR:`${R3}*?`,DOTS_SLASH:`${Na}{1,2}(?:[${Ko}]|$)`,NO_DOT:`(?!${Na})`,NO_DOTS:`(?!(?:^|[${Ko}])${Na}{1,2}(?:[${Ko}]|$))`,NO_DOT_SLASH:`(?!${Na}{0,1}(?:[${Ko}]|$))`,NO_DOTS_SLASH:`(?!${Na}{1,2}(?:[${Ko}]|$))`,QMARK_NO_DOT:`[^.${Ko}]`,START_ANCHOR:`(?:^|[${Ko}])`,END_ANCHOR:`(?:[${Ko}]|$)`},NBe={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\"};L3.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:NBe,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:BBe.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?FBe:T3}}});var Yd=w(wn=>{\"use strict\";var TBe=J(\"path\"),LBe=process.platform===\"win32\",{REGEX_BACKSLASH:OBe,REGEX_REMOVE_BACKSLASH:MBe,REGEX_SPECIAL_CHARS:KBe,REGEX_SPECIAL_CHARS_GLOBAL:UBe}=Gd();wn.isObject=r=>r!==null&&typeof r==\"object\"&&!Array.isArray(r);wn.hasRegexChars=r=>KBe.test(r);wn.isRegexChar=r=>r.length===1&&wn.hasRegexChars(r);wn.escapeRegex=r=>r.replace(UBe,\"\\\\$1\");wn.toPosixSlashes=r=>r.replace(OBe,\"/\");wn.removeBackslashes=r=>r.replace(MBe,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:LBe===!0||TBe.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 j3=w((dtt,Y3)=>{\"use strict\";var O3=Yd(),{CHAR_ASTERISK:Dx,CHAR_AT:HBe,CHAR_BACKWARD_SLASH:jd,CHAR_COMMA:GBe,CHAR_DOT:kx,CHAR_EXCLAMATION_MARK:Rx,CHAR_FORWARD_SLASH:G3,CHAR_LEFT_CURLY_BRACE:Fx,CHAR_LEFT_PARENTHESES:Nx,CHAR_LEFT_SQUARE_BRACKET:YBe,CHAR_PLUS:jBe,CHAR_QUESTION_MARK:M3,CHAR_RIGHT_CURLY_BRACE:qBe,CHAR_RIGHT_PARENTHESES:K3,CHAR_RIGHT_SQUARE_BRACKET:JBe}=Gd(),U3=r=>r===G3||r===jd,H3=r=>{r.isPrefix!==!0&&(r.depth=r.isGlobstar?1/0:1)},WBe=(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===GBe){if(f=W.isBrace=!0,p=W.isGlob=!0,H=!0,n===!0)continue;break}if(V===qBe&&(j--,j===0)){B=!1,f=W.isBrace=!0,H=!0;break}}if(n===!0)continue;break}if(V===G3){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===jBe||V===HBe||V===Dx||V===M3||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===K3){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===M3){if(p=W.isGlob=!0,H=!0,n===!0)continue;break}if(V===YBe){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===K3){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&&U3(ge.charCodeAt(ge.length-1))&&(ge=ge.slice(0,-1)),t.unescape===!0&&(O&&(O=O3.removeBackslashes(O)),ge&&v===!0&&(ge=O3.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,U3(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,H3(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,H3(o[o.length-1]),F.maxDepth+=o[o.length-1].depth)}F.slashes=s,F.parts=a}return F};Y3.exports=WBe});var W3=w((Ctt,J3)=>{\"use strict\";var jy=Gd(),Wn=Yd(),{MAX_LENGTH:qy,POSIX_REGEX_SOURCE:zBe,REGEX_NON_SPECIAL_CHARS:VBe,REGEX_SPECIAL_CHARS_BACKREF:XBe,REPLACEMENTS:q3}=jy,ZBe=(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=q3[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(XBe,(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=zBe[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=ZBe(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=VBe.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=q3[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 V3=w((mtt,z3)=>{\"use strict\";var _Be=J(\"path\"),$Be=j3(),Lx=W3(),Ox=Yd(),e0e=Gd(),t0e=r=>r&&typeof r==\"object\"&&!Array.isArray(r),Gr=(r,e,t=!1)=>{if(Array.isArray(r)){let u=r.map(f=>Gr(f,e,t));return f=>{for(let h of u){let p=h(f);if(p)return p}return!1}}let i=t0e(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?Gr.compileRe(r,e):Gr.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=Gr(n.ignore,u,t)}let c=(u,g=!1)=>{let{isMatch:f,match:h,output:p}=Gr.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};Gr.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=Gr.matchBase(r,e,t,n):a=e.exec(l)),{isMatch:Boolean(a),match:a,output:l}};Gr.matchBase=(r,e,t,i=Ox.isWindows(t))=>(e instanceof RegExp?e:Gr.makeRe(e,t)).test(_Be.basename(r));Gr.isMatch=(r,e,t)=>Gr(e,t)(r);Gr.parse=(r,e)=>Array.isArray(r)?r.map(t=>Gr.parse(t,e)):Lx(r,{...e,fastpaths:!1});Gr.scan=(r,e)=>$Be(r,e);Gr.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=Gr.toRegex(a,e);return i===!0&&(l.state=r),l};Gr.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)),Gr.compileRe(n,e,t,i)};Gr.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/$^/}};Gr.constants=e0e;z3.exports=Gr});var Mx=w((Ett,X3)=>{\"use strict\";X3.exports=V3()});var Bn=w((Itt,eW)=>{\"use strict\";var _3=J(\"util\"),$3=k3(),Uo=Mx(),Kx=Yd(),Z3=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=Uo(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)=>Uo(r,e);Sr.isMatch=(r,e,t)=>Uo(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: \"${_3.inspect(r)}\"`);if(Array.isArray(e))return e.some(i=>Sr.contains(r,i,t));if(typeof e==\"string\"){if(Z3(r)||Z3(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=Uo(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=Uo(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: \"${_3.inspect(r)}\"`);return[].concat(e).every(i=>Uo(i,t)(r))};Sr.capture=(r,e,t)=>{let i=Kx.isWindows(t),s=Uo.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)=>Uo.makeRe(...r);Sr.scan=(...r)=>Uo.scan(...r);Sr.parse=(r,e)=>{let t=[];for(let i of[].concat(r||[]))for(let n of $3(String(i),e))t.push(Uo.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]:$3(r,e)};Sr.braceExpand=(r,e)=>{if(typeof r!=\"string\")throw new TypeError(\"Expected a string\");return Sr.braces(r,{...e,expand:!0})};eW.exports=Sr});var rW=w((ytt,tW)=>{\"use strict\";tW.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 nW=w((wtt,iW)=>{\"use strict\";var r0e=rW();iW.exports=r=>typeof r==\"string\"?r.replace(r0e(),\"\"):r});var mW=w((Ftt,CW)=>{\"use strict\";CW.exports=(...r)=>[...new Set([].concat(...r))]});var sP=w((Ntt,yW)=>{\"use strict\";var p0e=J(\"stream\"),EW=p0e.PassThrough,d0e=Array.prototype.slice;yW.exports=C0e;function C0e(){let r=[],e=!1,t=d0e.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=EW(i);function o(){for(let c=0,u=arguments.length;c<u;c++)r.push(IW(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 IW(r,e){if(Array.isArray(r))for(let t=0,i=r.length;t<i;t++)r[t]=IW(r[t],e);else{if(!r._readableState&&r.pipe&&(r=r.pipe(EW(e))),!r._readableState||!r.pause||!r.pipe)throw new Error(\"Only readable stream can be merged.\");r.pause()}return r}});var wW=w(Zy=>{\"use strict\";Object.defineProperty(Zy,\"__esModule\",{value:!0});function m0e(r){return r.reduce((e,t)=>[].concat(e,t),[])}Zy.flatten=m0e;function E0e(r,e){let t=[[]],i=0;for(let n of r)e(n)?(i++,t[i]=[]):t[i].push(n);return t}Zy.splitWhen=E0e});var BW=w(oP=>{\"use strict\";Object.defineProperty(oP,\"__esModule\",{value:!0});function I0e(r){return r.code===\"ENOENT\"}oP.isEnoentCodeError=I0e});var bW=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 y0e(r,e){return new aP(r,e)}AP.createDirentFromStats=y0e});var QW=w(yf=>{\"use strict\";Object.defineProperty(yf,\"__esModule\",{value:!0});var w0e=J(\"path\"),B0e=2,b0e=/(\\\\?)([()*?[\\]{|}]|^!|[!+@](?=\\())/g;function Q0e(r){return r.replace(/\\\\/g,\"/\")}yf.unixify=Q0e;function S0e(r,e){return w0e.resolve(r,e)}yf.makeAbsolute=S0e;function v0e(r){return r.replace(b0e,\"\\\\$2\")}yf.escape=v0e;function x0e(r){if(r.charAt(0)===\".\"){let e=r.charAt(1);if(e===\"/\"||e===\"\\\\\")return r.slice(B0e)}return r}yf.removeLeadingDotSegment=x0e});var vW=w((Ktt,SW)=>{SW.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 DW=w((Utt,PW)=>{var P0e=vW(),xW={\"{\":\"}\",\"(\":\")\",\"[\":\"]\"},D0e=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=xW[a];if(l){var c=r.indexOf(l,e);c!==-1&&(e=c+1)}if(r[e]===\"!\")return!0}else e++}return!1},k0e=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=xW[t];if(i){var n=r.indexOf(i,e);n!==-1&&(e=n+1)}if(r[e]===\"!\")return!0}else e++}return!1};PW.exports=function(e,t){if(typeof e!=\"string\"||e===\"\")return!1;if(P0e(e))return!0;var i=D0e;return t&&t.strict===!1&&(i=k0e),i(e)}});var RW=w((Htt,kW)=>{\"use strict\";var R0e=DW(),F0e=J(\"path\").posix.dirname,N0e=J(\"os\").platform()===\"win32\",lP=\"/\",T0e=/\\\\/g,L0e=/[\\{\\[].*[\\}\\]]$/,O0e=/(^|[^\\\\])([\\{\\[]|\\([^\\)]+$)/,M0e=/\\\\([\\!\\*\\?\\|\\[\\]\\(\\)\\{\\}])/g;kW.exports=function(e,t){var i=Object.assign({flipBackslashes:!0},t);i.flipBackslashes&&N0e&&e.indexOf(lP)<0&&(e=e.replace(T0e,lP)),L0e.test(e)&&(e+=lP),e+=\"a\";do e=F0e(e);while(R0e(e)||O0e.test(e));return e.replace(M0e,\"$1\")}});var HW=w($r=>{\"use strict\";Object.defineProperty($r,\"__esModule\",{value:!0});var K0e=J(\"path\"),U0e=RW(),FW=Bn(),H0e=Mx(),NW=\"**\",G0e=\"\\\\\",Y0e=/[*?]|^!/,j0e=/\\[.*]/,q0e=/(?:^|[^!*+?@])\\(.*\\|.*\\)/,J0e=/[!*+?@]\\(.*\\)/,W0e=/{.*(?:,|\\.\\.).*}/;function TW(r,e={}){return!LW(r,e)}$r.isStaticPattern=TW;function LW(r,e={}){return!!(e.caseSensitiveMatch===!1||r.includes(G0e)||Y0e.test(r)||j0e.test(r)||q0e.test(r)||e.extglob!==!1&&J0e.test(r)||e.braceExpansion!==!1&&W0e.test(r))}$r.isDynamicPattern=LW;function z0e(r){return _y(r)?r.slice(1):r}$r.convertToPositivePattern=z0e;function V0e(r){return\"!\"+r}$r.convertToNegativePattern=V0e;function _y(r){return r.startsWith(\"!\")&&r[1]!==\"(\"}$r.isNegativePattern=_y;function OW(r){return!_y(r)}$r.isPositivePattern=OW;function X0e(r){return r.filter(_y)}$r.getNegativePatterns=X0e;function Z0e(r){return r.filter(OW)}$r.getPositivePatterns=Z0e;function _0e(r){return U0e(r,{flipBackslashes:!1})}$r.getBaseDirectory=_0e;function $0e(r){return r.includes(NW)}$r.hasGlobStar=$0e;function MW(r){return r.endsWith(\"/\"+NW)}$r.endsWithSlashGlobStar=MW;function ebe(r){let e=K0e.basename(r);return MW(r)||TW(e)}$r.isAffectDepthOfReadingPattern=ebe;function tbe(r){return r.reduce((e,t)=>e.concat(KW(t)),[])}$r.expandPatternsWithBraceExpansion=tbe;function KW(r){return FW.braces(r,{expand:!0,nodupes:!0})}$r.expandBraceExpansion=KW;function rbe(r,e){let t=H0e.scan(r,Object.assign(Object.assign({},e),{parts:!0}));return t.parts.length===0?[r]:t.parts}$r.getPatternParts=rbe;function UW(r,e){return FW.makeRe(r,e)}$r.makeRe=UW;function ibe(r,e){return r.map(t=>UW(t,e))}$r.convertPatternsToRe=ibe;function nbe(r,e){return e.some(t=>t.test(r))}$r.matchAny=nbe});var YW=w(cP=>{\"use strict\";Object.defineProperty(cP,\"__esModule\",{value:!0});var sbe=sP();function obe(r){let e=sbe(r);return r.forEach(t=>{t.once(\"error\",i=>e.emit(\"error\",i))}),e.once(\"close\",()=>GW(r)),e.once(\"end\",()=>GW(r)),e}cP.merge=obe;function GW(r){r.forEach(e=>e.emit(\"close\"))}});var jW=w($y=>{\"use strict\";Object.defineProperty($y,\"__esModule\",{value:!0});function abe(r){return typeof r==\"string\"}$y.isString=abe;function Abe(r){return r===\"\"}$y.isEmpty=Abe});var Oa=w(La=>{\"use strict\";Object.defineProperty(La,\"__esModule\",{value:!0});var lbe=wW();La.array=lbe;var cbe=BW();La.errno=cbe;var ube=bW();La.fs=ube;var gbe=QW();La.path=gbe;var fbe=HW();La.pattern=fbe;var hbe=YW();La.stream=hbe;var pbe=jW();La.string=pbe});var VW=w(Ma=>{\"use strict\";Object.defineProperty(Ma,\"__esModule\",{value:!0});var bc=Oa();function dbe(r,e){let t=qW(r),i=JW(r,e.ignore),n=t.filter(l=>bc.pattern.isStaticPattern(l,e)),s=t.filter(l=>bc.pattern.isDynamicPattern(l,e)),o=uP(n,i,!1),a=uP(s,i,!0);return o.concat(a)}Ma.generate=dbe;function uP(r,e,t){let i=WW(r);return\".\"in i?[gP(\".\",r,e,t)]:zW(i,e,t)}Ma.convertPatternsToTasks=uP;function qW(r){return bc.pattern.getPositivePatterns(r)}Ma.getPositivePatterns=qW;function JW(r,e){return bc.pattern.getNegativePatterns(r).concat(e).map(bc.pattern.convertToPositivePattern)}Ma.getNegativePatternsAsPositive=JW;function WW(r){let e={};return r.reduce((t,i)=>{let n=bc.pattern.getBaseDirectory(i);return n in t?t[n].push(i):t[n]=[i],t},e)}Ma.groupPatternsByBaseDirectory=WW;function zW(r,e,t){return Object.keys(r).map(i=>gP(i,r[i],e,t))}Ma.convertPatternGroupsToTasks=zW;function gP(r,e,t,i){return{dynamic:i,positive:e,negative:t,base:r,patterns:[].concat(e,t.map(bc.pattern.convertToNegativePattern))}}Ma.convertPatternGroupToTask=gP});var ZW=w(ew=>{\"use strict\";Object.defineProperty(ew,\"__esModule\",{value:!0});ew.read=void 0;function Cbe(r,e,t){e.fs.lstat(r,(i,n)=>{if(i!==null){XW(t,i);return}if(!n.isSymbolicLink()||!e.followSymbolicLink){fP(t,n);return}e.fs.stat(r,(s,o)=>{if(s!==null){if(e.throwErrorOnBrokenSymbolicLink){XW(t,s);return}fP(t,n);return}e.markSymbolicLink&&(o.isSymbolicLink=()=>!0),fP(t,o)})})}ew.read=Cbe;function XW(r,e){r(e)}function fP(r,e){r(null,e)}});var _W=w(tw=>{\"use strict\";Object.defineProperty(tw,\"__esModule\",{value:!0});tw.read=void 0;function mbe(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=mbe});var $W=w(UA=>{\"use strict\";Object.defineProperty(UA,\"__esModule\",{value:!0});UA.createFileSystemAdapter=UA.FILE_SYSTEM_ADAPTER=void 0;var rw=J(\"fs\");UA.FILE_SYSTEM_ADAPTER={lstat:rw.lstat,stat:rw.stat,lstatSync:rw.lstatSync,statSync:rw.statSync};function Ebe(r){return r===void 0?UA.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},UA.FILE_SYSTEM_ADAPTER),r)}UA.createFileSystemAdapter=Ebe});var e4=w(pP=>{\"use strict\";Object.defineProperty(pP,\"__esModule\",{value:!0});var Ibe=$W(),hP=class{constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=Ibe.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 Qc=w(HA=>{\"use strict\";Object.defineProperty(HA,\"__esModule\",{value:!0});HA.statSync=HA.stat=HA.Settings=void 0;var t4=ZW(),ybe=_W(),dP=e4();HA.Settings=dP.default;function wbe(r,e,t){if(typeof e==\"function\"){t4.read(r,CP(),e);return}t4.read(r,CP(e),t)}HA.stat=wbe;function Bbe(r,e){let t=CP(e);return ybe.read(r,t)}HA.statSync=Bbe;function CP(r={}){return r instanceof dP.default?r:new dP.default(r)}});var i4=w((_tt,r4)=>{r4.exports=bbe;function bbe(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 n4=Number.parseInt(iw[0],10),Qbe=Number.parseInt(iw[1],10),s4=10,Sbe=10,vbe=n4>s4,xbe=n4===s4&&Qbe>=Sbe;nw.IS_SUPPORT_READDIR_WITH_FILE_TYPES=vbe||xbe});var o4=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 Pbe(r,e){return new EP(r,e)}sw.createDirentFromStats=Pbe});var IP=w(ow=>{\"use strict\";Object.defineProperty(ow,\"__esModule\",{value:!0});ow.fs=void 0;var Dbe=o4();ow.fs=Dbe});var yP=w(aw=>{\"use strict\";Object.defineProperty(aw,\"__esModule\",{value:!0});aw.joinPathSegments=void 0;function kbe(r,e,t){return r.endsWith(t)?r+e:r+t+e}aw.joinPathSegments=kbe});var g4=w(GA=>{\"use strict\";Object.defineProperty(GA,\"__esModule\",{value:!0});GA.readdir=GA.readdirWithFileTypes=GA.read=void 0;var Rbe=Qc(),a4=i4(),Fbe=mP(),A4=IP(),l4=yP();function Nbe(r,e,t){if(!e.stats&&Fbe.IS_SUPPORT_READDIR_WITH_FILE_TYPES){c4(r,e,t);return}u4(r,e,t)}GA.read=Nbe;function c4(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:l4.joinPathSegments(r,a.name,e.pathSegmentSeparator)}));if(!e.followSymbolicLinks){wP(t,s);return}let o=s.map(a=>Tbe(a,e));a4(o,(a,l)=>{if(a!==null){Aw(t,a);return}wP(t,l)})})}GA.readdirWithFileTypes=c4;function Tbe(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=A4.fs.createDirentFromStats(r.name,n),t(null,r)})}}function u4(r,e,t){e.fs.readdir(r,(i,n)=>{if(i!==null){Aw(t,i);return}let s=n.map(o=>{let a=l4.joinPathSegments(r,o,e.pathSegmentSeparator);return l=>{Rbe.stat(a,e.fsStatSettings,(c,u)=>{if(c!==null){l(c);return}let g={name:o,path:a,dirent:A4.fs.createDirentFromStats(o,u)};e.stats&&(g.stats=u),l(null,g)})}});a4(s,(o,a)=>{if(o!==null){Aw(t,o);return}wP(t,a)})})}GA.readdir=u4;function Aw(r,e){r(e)}function wP(r,e){r(null,e)}});var C4=w(YA=>{\"use strict\";Object.defineProperty(YA,\"__esModule\",{value:!0});YA.readdir=YA.readdirWithFileTypes=YA.read=void 0;var Lbe=Qc(),Obe=mP(),f4=IP(),h4=yP();function Mbe(r,e){return!e.stats&&Obe.IS_SUPPORT_READDIR_WITH_FILE_TYPES?p4(r,e):d4(r,e)}YA.read=Mbe;function p4(r,e){return e.fs.readdirSync(r,{withFileTypes:!0}).map(i=>{let n={dirent:i,name:i.name,path:h4.joinPathSegments(r,i.name,e.pathSegmentSeparator)};if(n.dirent.isSymbolicLink()&&e.followSymbolicLinks)try{let s=e.fs.statSync(n.path);n.dirent=f4.fs.createDirentFromStats(n.name,s)}catch(s){if(e.throwErrorOnBrokenSymbolicLink)throw s}return n})}YA.readdirWithFileTypes=p4;function d4(r,e){return e.fs.readdirSync(r).map(i=>{let n=h4.joinPathSegments(r,i,e.pathSegmentSeparator),s=Lbe.statSync(n,e.fsStatSettings),o={name:i,path:n,dirent:f4.fs.createDirentFromStats(i,s)};return e.stats&&(o.stats=s),o})}YA.readdir=d4});var m4=w(jA=>{\"use strict\";Object.defineProperty(jA,\"__esModule\",{value:!0});jA.createFileSystemAdapter=jA.FILE_SYSTEM_ADAPTER=void 0;var wf=J(\"fs\");jA.FILE_SYSTEM_ADAPTER={lstat:wf.lstat,stat:wf.stat,lstatSync:wf.lstatSync,statSync:wf.statSync,readdir:wf.readdir,readdirSync:wf.readdirSync};function Kbe(r){return r===void 0?jA.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},jA.FILE_SYSTEM_ADAPTER),r)}jA.createFileSystemAdapter=Kbe});var E4=w(bP=>{\"use strict\";Object.defineProperty(bP,\"__esModule\",{value:!0});var Ube=J(\"path\"),Hbe=Qc(),Gbe=m4(),BP=class{constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=Gbe.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,Ube.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new Hbe.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(e,t){return e!=null?e:t}};bP.default=BP});var lw=w(qA=>{\"use strict\";Object.defineProperty(qA,\"__esModule\",{value:!0});qA.Settings=qA.scandirSync=qA.scandir=void 0;var I4=g4(),Ybe=C4(),QP=E4();qA.Settings=QP.default;function jbe(r,e,t){if(typeof e==\"function\"){I4.read(r,SP(),e);return}I4.read(r,SP(e),t)}qA.scandir=jbe;function qbe(r,e){let t=SP(e);return Ybe.read(r,t)}qA.scandirSync=qbe;function SP(r={}){return r instanceof QP.default?r:new QP.default(r)}});var w4=w((Art,y4)=>{\"use strict\";function Jbe(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}}y4.exports=Jbe});var b4=w((lrt,vP)=>{\"use strict\";var Wbe=w4();function B4(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=Wbe(zbe),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 zbe(){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 Vbe(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=B4(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=B4;vP.exports.promise=Vbe});var cw=w(Yo=>{\"use strict\";Object.defineProperty(Yo,\"__esModule\",{value:!0});Yo.joinPathSegments=Yo.replacePathSegmentSeparator=Yo.isAppliedFilter=Yo.isFatalError=void 0;function Xbe(r,e){return r.errorFilter===null?!0:!r.errorFilter(e)}Yo.isFatalError=Xbe;function Zbe(r,e){return r===null||r(e)}Yo.isAppliedFilter=Zbe;function _be(r,e){return r.split(/[/\\\\]/).join(e)}Yo.replacePathSegmentSeparator=_be;function $be(r,e,t){return r===\"\"?e:r.endsWith(t)?r+e:r+t+e}Yo.joinPathSegments=$be});var DP=w(PP=>{\"use strict\";Object.defineProperty(PP,\"__esModule\",{value:!0});var eQe=cw(),xP=class{constructor(e,t){this._root=e,this._settings=t,this._root=eQe.replacePathSegmentSeparator(e,t.pathSegmentSeparator)}};PP.default=xP});var FP=w(RP=>{\"use strict\";Object.defineProperty(RP,\"__esModule\",{value:!0});var tQe=J(\"events\"),rQe=lw(),iQe=b4(),uw=cw(),nQe=DP(),kP=class extends nQe.default{constructor(e,t){super(e,t),this._settings=t,this._scandir=rQe.scandir,this._emitter=new tQe.EventEmitter,this._queue=iQe(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 Q4=w(TP=>{\"use strict\";Object.defineProperty(TP,\"__esModule\",{value:!0});var sQe=FP(),NP=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new sQe.default(this._root,this._settings),this._storage=new Set}read(e){this._reader.onError(t=>{oQe(e,t)}),this._reader.onEntry(t=>{this._storage.add(t)}),this._reader.onEnd(()=>{aQe(e,[...this._storage])}),this._reader.read()}};TP.default=NP;function oQe(r,e){r(e)}function aQe(r,e){r(null,e)}});var S4=w(OP=>{\"use strict\";Object.defineProperty(OP,\"__esModule\",{value:!0});var AQe=J(\"stream\"),lQe=FP(),LP=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new lQe.default(this._root,this._settings),this._stream=new AQe.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 v4=w(KP=>{\"use strict\";Object.defineProperty(KP,\"__esModule\",{value:!0});var cQe=lw(),gw=cw(),uQe=DP(),MP=class extends uQe.default{constructor(){super(...arguments),this._scandir=cQe.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 x4=w(HP=>{\"use strict\";Object.defineProperty(HP,\"__esModule\",{value:!0});var gQe=v4(),UP=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new gQe.default(this._root,this._settings)}read(){return this._reader.read()}};HP.default=UP});var P4=w(YP=>{\"use strict\";Object.defineProperty(YP,\"__esModule\",{value:!0});var fQe=J(\"path\"),hQe=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,fQe.sep),this.fsScandirSettings=new hQe.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(jo=>{\"use strict\";Object.defineProperty(jo,\"__esModule\",{value:!0});jo.Settings=jo.walkStream=jo.walkSync=jo.walk=void 0;var D4=Q4(),pQe=S4(),dQe=x4(),jP=P4();jo.Settings=jP.default;function CQe(r,e,t){if(typeof e==\"function\"){new D4.default(r,fw()).read(e);return}new D4.default(r,fw(e)).read(t)}jo.walk=CQe;function mQe(r,e){let t=fw(e);return new dQe.default(r,t).read()}jo.walkSync=mQe;function EQe(r,e){let t=fw(e);return new pQe.default(r,t).read()}jo.walkStream=EQe;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 IQe=J(\"path\"),yQe=Qc(),k4=Oa(),JP=class{constructor(e){this._settings=e,this._fsStatSettings=new yQe.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(e){return IQe.resolve(this._settings.cwd,e)}_makeEntry(e,t){let i={name:t,path:t,dirent:k4.fs.createDirentFromStats(t,e)};return this._settings.stats&&(i.stats=e),i}_isFatalError(e){return!k4.errno.isEnoentCodeError(e)&&!this._settings.suppressErrors}};WP.default=JP});var ZP=w(XP=>{\"use strict\";Object.defineProperty(XP,\"__esModule\",{value:!0});var wQe=J(\"stream\"),BQe=Qc(),bQe=qP(),QQe=zP(),VP=class extends QQe.default{constructor(){super(...arguments),this._walkStream=bQe.walkStream,this._stat=BQe.stat}dynamic(e,t){return this._walkStream(e,t)}static(e,t){let i=e.map(this._getFullEntryPath,this),n=new wQe.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 R4=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 F4=w(tD=>{\"use strict\";Object.defineProperty(tD,\"__esModule\",{value:!0});var SQe=R4(),eD=class extends SQe.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 N4=w(iD=>{\"use strict\";Object.defineProperty(iD,\"__esModule\",{value:!0});var hw=Oa(),vQe=F4(),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 vQe.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 T4=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 L4=w(aD=>{\"use strict\";Object.defineProperty(aD,\"__esModule\",{value:!0});var xQe=Oa(),oD=class{constructor(e){this._settings=e}getFilter(){return e=>this._isNonFatalError(e)}_isNonFatalError(e){return xQe.errno.isEnoentCodeError(e)||this._settings.suppressErrors}};aD.default=oD});var M4=w(lD=>{\"use strict\";Object.defineProperty(lD,\"__esModule\",{value:!0});var O4=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=O4.path.makeAbsolute(this._settings.cwd,t),t=O4.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 PQe=J(\"path\"),DQe=N4(),kQe=T4(),RQe=L4(),FQe=M4(),cD=class{constructor(e){this._settings=e,this.errorFilter=new RQe.default(this._settings),this.entryFilter=new kQe.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new DQe.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new FQe.default(this._settings)}_getRootDirectory(e){return PQe.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 K4=w(fD=>{\"use strict\";Object.defineProperty(fD,\"__esModule\",{value:!0});var NQe=ZP(),TQe=pw(),gD=class extends TQe.default{constructor(){super(...arguments),this._reader=new NQe.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 U4=w(pD=>{\"use strict\";Object.defineProperty(pD,\"__esModule\",{value:!0});var LQe=J(\"stream\"),OQe=ZP(),MQe=pw(),hD=class extends MQe.default{constructor(){super(...arguments),this._reader=new OQe.default(this._settings)}read(e){let t=this._getRootDirectory(e),i=this._getReaderOptions(e),n=this.api(t,e,i),s=new LQe.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 H4=w(CD=>{\"use strict\";Object.defineProperty(CD,\"__esModule\",{value:!0});var KQe=Qc(),UQe=qP(),HQe=zP(),dD=class extends HQe.default{constructor(){super(...arguments),this._walkSync=UQe.walkSync,this._statSync=KQe.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 G4=w(ED=>{\"use strict\";Object.defineProperty(ED,\"__esModule\",{value:!0});var GQe=H4(),YQe=pw(),mD=class extends YQe.default{constructor(){super(...arguments),this._reader=new GQe.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 Y4=w(_d=>{\"use strict\";Object.defineProperty(_d,\"__esModule\",{value:!0});var bf=J(\"fs\"),jQe=J(\"os\"),qQe=jQe.cpus().length;_d.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:bf.lstat,lstatSync:bf.lstatSync,stat:bf.stat,statSync:bf.statSync,readdir:bf.readdir,readdirSync:bf.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,qQe),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((Frt,q4)=>{\"use strict\";var j4=VW(),JQe=K4(),WQe=U4(),zQe=G4(),yD=Y4(),Sc=Oa();async function wD(r,e){Qf(r);let t=BD(r,JQe.default,e),i=await Promise.all(t);return Sc.array.flatten(i)}(function(r){function e(o,a){Qf(o);let l=BD(o,zQe.default,a);return Sc.array.flatten(l)}r.sync=e;function t(o,a){Qf(o);let l=BD(o,WQe.default,a);return Sc.stream.merge(l)}r.stream=t;function i(o,a){Qf(o);let l=[].concat(o),c=new yD.default(a);return j4.generate(l,c)}r.generateTasks=i;function n(o,a){Qf(o);let l=new yD.default(a);return Sc.pattern.isDynamicPattern(o,l)}r.isDynamicPattern=n;function s(o){return Qf(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=j4.generate(i,n),o=new e(n);return s.map(o.read,o)}function Qf(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\")}q4.exports=wD});var W4=w(vc=>{\"use strict\";var{promisify:VQe}=J(\"util\"),J4=J(\"fs\");async function bD(r,e,t){if(typeof t!=\"string\")throw new TypeError(`Expected a string, got ${typeof t}`);try{return(await VQe(J4[r])(t))[e]()}catch(i){if(i.code===\"ENOENT\")return!1;throw i}}function QD(r,e,t){if(typeof t!=\"string\")throw new TypeError(`Expected a string, got ${typeof t}`);try{return J4[r](t)[e]()}catch(i){if(i.code===\"ENOENT\")return!1;throw i}}vc.isFile=bD.bind(null,\"stat\",\"isFile\");vc.isDirectory=bD.bind(null,\"stat\",\"isDirectory\");vc.isSymlink=bD.bind(null,\"lstat\",\"isSymbolicLink\");vc.isFileSync=QD.bind(null,\"statSync\",\"isFile\");vc.isDirectorySync=QD.bind(null,\"statSync\",\"isDirectory\");vc.isSymlinkSync=QD.bind(null,\"lstatSync\",\"isSymbolicLink\")});var _4=w((Trt,SD)=>{\"use strict\";var xc=J(\"path\"),z4=W4(),V4=r=>r.length>1?`{${r.join(\",\")}}`:r[0],X4=(r,e)=>{let t=r[0]===\"!\"?r.slice(1):r;return xc.isAbsolute(t)?t:xc.join(e,t)},XQe=(r,e)=>xc.extname(r)?`**/${r}`:`**/${r}.${V4(e)}`,Z4=(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,XQe(t,e.extensions))):e.files?e.files.map(t=>xc.posix.join(r,`**/${t}`)):e.extensions?[xc.posix.join(r,`**/*.${V4(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 z4.isDirectory(X4(i,e.cwd))?Z4(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=>z4.isDirectorySync(X4(i,e.cwd))?Z4(i,e):i);return[].concat.apply([],t)}});var o8=w((Lrt,s8)=>{function $4(r){return Array.isArray(r)?r:[r]}var i8=\"\",e8=\" \",vD=\"\\\\\",ZQe=/^\\s+$/,_Qe=/^\\\\!/,$Qe=/^\\\\#/,eSe=/\\r?\\n/g,tSe=/^\\.*\\/|^\\.+$/,xD=\"/\",t8=typeof Symbol<\"u\"?Symbol.for(\"node-ignore\"):\"node-ignore\",rSe=(r,e,t)=>Object.defineProperty(r,e,{value:t}),iSe=/([0-z])-([0-z])/g,nSe=r=>r.replace(iSe,(e,t,i)=>t.charCodeAt(0)<=i.charCodeAt(0)?e:i8),sSe=r=>{let{length:e}=r;return r.slice(0,e-e%2)},oSe=[[/\\\\?\\s+$/,r=>r.indexOf(\"\\\\\")===0?e8:i8],[/\\\\\\s/g,()=>e8],[/[\\\\$.|*+(){^]/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}${sSe(i)}${n}`:n===\"]\"&&i.length%2===0?`[${nSe(t)}${i}]`:\"[]\"],[/(?:[^*])$/,r=>/\\/$/.test(r)?`${r}$`:`${r}(?=$|\\\\/$)`],[/(\\^|\\\\\\/)?\\\\\\*$/,(r,e)=>`${e?`${e}[^/]+`:\"[^/]*\"}(?=$|\\\\/$)`]],r8=Object.create(null),aSe=(r,e)=>{let t=r8[r];return t||(t=oSe.reduce((i,n)=>i.replace(n[0],n[1].bind(r)),r),r8[r]=t),e?new RegExp(t,\"i\"):new RegExp(t)},kD=r=>typeof r==\"string\",ASe=r=>r&&kD(r)&&!ZQe.test(r)&&r.indexOf(\"#\")!==0,lSe=r=>r.split(eSe),PD=class{constructor(e,t,i,n){this.origin=e,this.pattern=t,this.negative=i,this.regex=n}},cSe=(r,e)=>{let t=r,i=!1;r.indexOf(\"!\")===0&&(i=!0,r=r.substr(1)),r=r.replace(_Qe,\"!\").replace($Qe,\"#\");let n=aSe(r,e);return new PD(t,r,i,n)},uSe=(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),n8=r=>tSe.test(r);Ka.isNotRelative=n8;Ka.convert=r=>r;var DD=class{constructor({ignorecase:e=!0}={}){rSe(this,t8,!0),this._rules=[],this._ignorecase=e,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}_addPattern(e){if(e&&e[t8]){this._rules=this._rules.concat(e._rules),this._added=!0;return}if(ASe(e)){let t=cSe(e,this._ignorecase);this._added=!0,this._rules.push(t)}}add(e){return this._added=!1,$4(kD(e)?lSe(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,uSe),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 $4(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}},Cw=r=>new DD(r),gSe=()=>!1,fSe=r=>Ka(r&&Ka.convert(r),r,gSe);Cw.isPathValid=fSe;Cw.default=Cw;s8.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)||n8(t)}});var A8=w((Ort,a8)=>{\"use strict\";a8.exports=r=>{let e=/^\\\\\\\\\\?\\\\/.test(r),t=/[^\\u0000-\\u0080]+/.test(r);return e||t?r:r.replace(/\\\\/g,\"/\")}});var p8=w((Mrt,RD)=>{\"use strict\";var{promisify:hSe}=J(\"util\"),l8=J(\"fs\"),Ua=J(\"path\"),c8=dw(),pSe=o8(),$d=A8(),u8=[\"**/node_modules/**\",\"**/flow-typed/**\",\"**/coverage/**\",\"**/.git\"],dSe=hSe(l8.readFile),CSe=r=>e=>e.startsWith(\"!\")?\"!\"+Ua.posix.join(r,e.slice(1)):Ua.posix.join(r,e),mSe=(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(CSe(t))},g8=r=>{let e=pSe();for(let t of r)e.add(mSe(t.content,{cwd:t.cwd,fileName:t.filePath}));return e},ESe=(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)},f8=(r,e)=>t=>r.ignores($d(Ua.relative(e,ESe(e,t.path||t)))),ISe=async(r,e)=>{let t=Ua.join(e,r),i=await dSe(t,\"utf8\");return{cwd:e,filePath:t,content:i}},ySe=(r,e)=>{let t=Ua.join(e,r),i=l8.readFileSync(t,\"utf8\");return{cwd:e,filePath:t,content:i}},h8=({ignore:r=[],cwd:e=$d(process.cwd())}={})=>({ignore:r,cwd:e});RD.exports=async r=>{r=h8(r);let e=await c8(\"**/.gitignore\",{ignore:u8.concat(r.ignore),cwd:r.cwd}),t=await Promise.all(e.map(n=>ISe(n,r.cwd))),i=g8(t);return f8(i,r.cwd)};RD.exports.sync=r=>{r=h8(r);let t=c8.sync(\"**/.gitignore\",{ignore:u8.concat(r.ignore),cwd:r.cwd}).map(n=>ySe(n,r.cwd)),i=g8(t);return f8(i,r.cwd)}});var C8=w((Krt,d8)=>{\"use strict\";var{Transform:wSe}=J(\"stream\"),mw=class extends wSe{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()}};d8.exports={FilterStream:FD,UniqueStream:ND}});var MD=w((Urt,Pc)=>{\"use strict\";var E8=J(\"fs\"),Ew=mW(),BSe=sP(),Iw=dw(),yw=_4(),TD=p8(),{FilterStream:bSe,UniqueStream:QSe}=C8(),I8=()=>!1,m8=r=>r[0]===\"!\",SSe=r=>{if(!r.every(e=>typeof e==\"string\"))throw new TypeError(\"Patterns must be a string or an array of strings\")},vSe=(r={})=>{if(!r.cwd)return;let e;try{e=E8.statSync(r.cwd)}catch{return}if(!e.isDirectory())throw new Error(\"The `cwd` option must be a path to a directory\")},xSe=r=>r.stats instanceof E8.Stats?r.path:r,ww=(r,e)=>{r=Ew([].concat(r)),SSe(r),vSe(e);let t=[];e={ignore:[],expandDirectories:!0,...e};for(let[i,n]of r.entries()){if(m8(n))continue;let s=r.slice(i).filter(a=>m8(a)).map(a=>a.slice(1)),o={...e,ignore:e.ignore.concat(s)};t.push({pattern:n,options:o})}return t},PSe=(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?PSe(r,e):[r.pattern],y8=r=>r&&r.gitignore?TD.sync({cwd:r.cwd,ignore:r.ignore}):I8,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}):I8,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(xSe(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=y8(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=y8(e),s=new bSe(a=>!n(a)),o=new QSe;return BSe(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((iit,L8)=>{function GSe(r){var e=typeof r;return r!=null&&(e==\"object\"||e==\"function\")}L8.exports=GSe});var WD=w((nit,O8)=>{var YSe=typeof global==\"object\"&&global&&global.Object===Object&&global;O8.exports=YSe});var ys=w((sit,M8)=>{var jSe=WD(),qSe=typeof self==\"object\"&&self&&self.Object===Object&&self,JSe=jSe||qSe||Function(\"return this\")();M8.exports=JSe});var U8=w((oit,K8)=>{var WSe=ys(),zSe=function(){return WSe.Date.now()};K8.exports=zSe});var G8=w((ait,H8)=>{var VSe=/\\s/;function XSe(r){for(var e=r.length;e--&&VSe.test(r.charAt(e)););return e}H8.exports=XSe});var j8=w((Ait,Y8)=>{var ZSe=G8(),_Se=/^\\s+/;function $Se(r){return r&&r.slice(0,ZSe(r)+1).replace(_Se,\"\")}Y8.exports=$Se});var Rc=w((lit,q8)=>{var eve=ys(),tve=eve.Symbol;q8.exports=tve});var V8=w((cit,z8)=>{var J8=Rc(),W8=Object.prototype,rve=W8.hasOwnProperty,ive=W8.toString,uC=J8?J8.toStringTag:void 0;function nve(r){var e=rve.call(r,uC),t=r[uC];try{r[uC]=void 0;var i=!0}catch{}var n=ive.call(r);return i&&(e?r[uC]=t:delete r[uC]),n}z8.exports=nve});var Z8=w((uit,X8)=>{var sve=Object.prototype,ove=sve.toString;function ave(r){return ove.call(r)}X8.exports=ave});var Fc=w((git,ez)=>{var _8=Rc(),Ave=V8(),lve=Z8(),cve=\"[object Null]\",uve=\"[object Undefined]\",$8=_8?_8.toStringTag:void 0;function gve(r){return r==null?r===void 0?uve:cve:$8&&$8 in Object(r)?Ave(r):lve(r)}ez.exports=gve});var Wo=w((fit,tz)=>{function fve(r){return r!=null&&typeof r==\"object\"}tz.exports=fve});var gC=w((hit,rz)=>{var hve=Fc(),pve=Wo(),dve=\"[object Symbol]\";function Cve(r){return typeof r==\"symbol\"||pve(r)&&hve(r)==dve}rz.exports=Cve});var oz=w((pit,sz)=>{var mve=j8(),iz=vn(),Eve=gC(),nz=0/0,Ive=/^[-+]0x[0-9a-f]+$/i,yve=/^0b[01]+$/i,wve=/^0o[0-7]+$/i,Bve=parseInt;function bve(r){if(typeof r==\"number\")return r;if(Eve(r))return nz;if(iz(r)){var e=typeof r.valueOf==\"function\"?r.valueOf():r;r=iz(e)?e+\"\":e}if(typeof r!=\"string\")return r===0?r:+r;r=mve(r);var t=yve.test(r);return t||wve.test(r)?Bve(r.slice(2),t?2:8):Ive.test(r)?nz:+r}sz.exports=bve});var lz=w((dit,Az)=>{var Qve=vn(),zD=U8(),az=oz(),Sve=\"Expected a function\",vve=Math.max,xve=Math.min;function Pve(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(Sve);e=az(e)||0,Qve(t)&&(u=!!t.leading,g=\"maxWait\"in t,s=g?vve(az(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?xve(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}Az.exports=Pve});var uz=w((Cit,cz)=>{var Dve=lz(),kve=vn(),Rve=\"Expected a function\";function Fve(r,e,t){var i=!0,n=!0;if(typeof r!=\"function\")throw new TypeError(Rve);return kve(t)&&(i=\"leading\"in t?!!t.leading:i,n=\"trailing\"in t?!!t.trailing:n),Dve(r,e,{leading:i,maxWait:e,trailing:n})}cz.exports=Fve});var Ya=w((Ga,jw)=>{\"use strict\";Object.defineProperty(Ga,\"__esModule\",{value:!0});var Iz=[\"Int8Array\",\"Uint8Array\",\"Uint8ClampedArray\",\"Int16Array\",\"Uint16Array\",\"Int32Array\",\"Uint32Array\",\"Float32Array\",\"Float64Array\",\"BigInt64Array\",\"BigUint64Array\"];function Jve(r){return Iz.includes(r)}var Wve=[\"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\",...Iz];function zve(r){return Wve.includes(r)}var Vve=[\"null\",\"undefined\",\"string\",\"number\",\"bigint\",\"boolean\",\"symbol\"];function Xve(r){return Vve.includes(r)}function Lf(r){return e=>typeof e===r}var{toString:yz}=Object.prototype,CC=r=>{let e=yz.call(r).slice(8,-1);if(/HTML\\w+Element/.test(e)&&X.domElement(r))return\"HTMLElement\";if(zve(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 Zve=Lf(\"number\");X.number=r=>Zve(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 _ve=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)||_ve(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)||Xve(typeof r);X.integer=r=>Number.isInteger(r);X.safeInteger=r=>Number.isSafeInteger(r);X.plainObject=r=>{if(yz.call(r)!==\"[object Object]\")return!1;let e=Object.getPrototypeOf(r);return e===null||e===Object.getPrototypeOf({})};X.typedArray=r=>Jve(CC(r));var $ve=r=>X.safeInteger(r)&&r>=0;X.arrayLike=r=>!X.nullOrUndefined(r)&&!X.function_(r)&&$ve(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 exe=1,txe=[\"innerHTML\",\"ownerDocument\",\"style\",\"attributes\",\"nodeValue\"];X.domElement=r=>X.object(r)&&r.nodeType===exe&&X.string(r.nodeName)&&!X.plainObject(r)&&txe.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 wz=r=>e=>X.integer(e)&&Math.abs(e%2)===r;X.evenInteger=wz(0);X.oddInteger=wz(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 rxe=r=>X.string(r)&&!/\\S/.test(r);X.emptyStringOrWhitespace=r=>X.emptyString(r)||rxe(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 Bz=(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=>Bz(Array.prototype.some,i,e));X.all=(r,...e)=>Bz(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 bz=w((rnt,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 Qz=w((mk,Ek)=>{\"use strict\";Object.defineProperty(mk,\"__esModule\",{value:!0});var ixe=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 ixe.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 Sz=w((yk,wk)=>{\"use strict\";Object.defineProperty(yk,\"__esModule\",{value:!0});var nxe=Qz(),sxe=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||sxe>=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),nxe.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 Fz=w((int,Qk)=>{\"use strict\";var{V4MAPPED:oxe,ADDRCONFIG:axe,ALL:Rz,promises:{Resolver:vz},lookup:Axe}=J(\"dns\"),{promisify:Bk}=J(\"util\"),lxe=J(\"os\"),Mf=Symbol(\"cacheableLookupCreateConnection\"),bk=Symbol(\"cacheableLookupInstance\"),xz=Symbol(\"expires\"),cxe=typeof Rz==\"number\",Pz=r=>{if(!(r&&typeof r.createConnection==\"function\"))throw new Error(\"Expected an Agent instance as the first argument\")},uxe=r=>{for(let e of r)e.family!==6&&(e.address=`::ffff:${e.address}`,e.family=6)},Dz=()=>{let r=!1,e=!1;for(let t of Object.values(lxe.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}},gxe=r=>Symbol.iterator in r,kz={ttl:!0},fxe={all:!0},Jw=class{constructor({cache:e=new Map,maxTtl:t=1/0,fallbackDuration:i=3600,errorTtl:n=.15,resolver:s=new vz,lookup:o=Axe}={}){if(this.maxTtl=t,this.errorTtl=n,this._cache=e,this._resolver=s,this._dnsLookup=Bk(o),this._resolver instanceof vz?(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=Dz(),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&oxe&&(cxe&&t.hints&Rz||n.length===0)?uxe(i):i=n}else t.family===4&&(i=i.filter(n=>n.family===4));if(t.hints&axe){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,kz),this._resolve6(e,kz)].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[xz]=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}}gxe(this._cache)&&this._tick(i)}}async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._dnsLookup(e,fxe);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[xz];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(Pz(e),Mf in e)throw new Error(\"CacheableLookup has been already installed\");e[Mf]=e.createConnection,e[bk]=this,e.createConnection=(t,i)=>(\"lookup\"in t||(t.lookup=this.lookup),e[Mf](t,i))}uninstall(e){if(Pz(e),e[Mf]){if(e[bk]!==this)throw new Error(\"The agent is not owned by this CacheableLookup instance\");e.createConnection=e[Mf],delete e[Mf],delete e[bk]}}updateInterfaceInfo(){let{_iface:e}=this;this._iface=Dz(),(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()}};Qk.exports=Jw;Qk.exports.default=Jw});var Lz=w((nnt,Sk)=>{\"use strict\";var hxe=typeof URL>\"u\"?J(\"url\").URL:URL,pxe=\"text/plain\",dxe=\"us-ascii\",Nz=(r,e)=>e.some(t=>t instanceof RegExp?t.test(r):t===r),Cxe=(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===dxe)?\"\":`${g}${f?`=${f}`:\"\"}`}).filter(Boolean)];return o&&c.push(\"base64\"),(c.length!==0||a&&a!==pxe)&&c.unshift(a),`data:${c.join(\";\")},${o?n.trim():n}${s?`#${s}`:\"\"}`},Tz=(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 Cxe(r,e);let t=r.startsWith(\"//\");!t&&/^\\.*\\//.test(r)||(r=r.replace(/^(?!(?:\\w+:)?\\/\\/)|^\\/\\//,e.defaultProtocol));let n=new hxe(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];Nz(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()])Nz(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=Tz;Sk.exports.default=Tz});var Kz=w((snt,Mz)=>{Mz.exports=Oz;function Oz(r,e){if(r&&e)return Oz(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((ont,vk)=>{var Uz=Kz();vk.exports=Uz(Ww);vk.exports.strict=Uz(Hz);Ww.proto=Ww(function(){Object.defineProperty(Function.prototype,\"once\",{value:function(){return Ww(this)},configurable:!0}),Object.defineProperty(Function.prototype,\"onceStrict\",{value:function(){return Hz(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 Hz(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((ant,Yz)=>{var mxe=xk(),Exe=function(){},Ixe=function(r){return r.setHeader&&typeof r.abort==\"function\"},yxe=function(r){return r.stdio&&Array.isArray(r.stdio)&&r.stdio.length===3},Gz=function(r,e,t){if(typeof e==\"function\")return Gz(r,null,e);e||(e={}),t=mxe(t||Exe);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 Ixe(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)),yxe(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)}};Yz.exports=Gz});var Jz=w((Ant,qz)=>{var wxe=xk(),Bxe=Pk(),Dk=J(\"fs\"),mC=function(){},bxe=/^v?\\.0/.test(process.version),zw=function(r){return typeof r==\"function\"},Qxe=function(r){return!bxe||!Dk?!1:(r instanceof(Dk.ReadStream||mC)||r instanceof(Dk.WriteStream||mC))&&zw(r.close)},Sxe=function(r){return r.setHeader&&zw(r.abort)},vxe=function(r,e,t,i){i=wxe(i);var n=!1;r.on(\"close\",function(){n=!0}),Bxe(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,Qxe(r))return r.close(mC);if(Sxe(r))return r.abort();if(zw(r.destroy))return r.destroy();i(o||new Error(\"stream was destroyed\"))}}},jz=function(r){r()},xxe=function(r,e){return r.pipe(e)},Pxe=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 vxe(n,o,a,function(l){t||(t=l),l&&i.forEach(jz),!o&&(i.forEach(jz),e(t))})});return r.reduce(xxe)};qz.exports=Pxe});var zz=w((lnt,Wz)=>{\"use strict\";var{PassThrough:Dxe}=J(\"stream\");Wz.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 Dxe({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 Vz=w((cnt,Kf)=>{\"use strict\";var kxe=Jz(),Rxe=zz(),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=kxe(r,Rxe(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 Zz=w((gnt,Xz)=>{\"use strict\";var Fxe=new Set([200,203,204,206,300,301,404,405,410,414,501]),Nxe=new Set([200,203,204,300,301,302,303,307,308,404,405,410,414,501]),Txe=new Set([500,502,503,504]),Lxe={date:!0,connection:!0,\"keep-alive\":!0,\"proxy-authenticate\":!0,\"proxy-authorization\":!0,te:!0,trailer:!0,\"transfer-encoding\":!0,upgrade:!0},Oxe={\"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 Mxe(r){return r?Txe.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 Kxe(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(\", \")}Xz.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\":Kxe(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())&&Nxe.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||Fxe.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)Lxe[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()&&Mxe(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&&!Oxe[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((fnt,_z)=>{\"use strict\";_z.exports=r=>{let e={};for(let[t,i]of Object.entries(r))e[t.toLowerCase()]=i;return e}});var e5=w((hnt,$z)=>{\"use strict\";var Uxe=J(\"stream\").Readable,Hxe=Zw(),Rk=class extends Uxe{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=Hxe(t),this.body=i,this.url=n}_read(){this.push(this.body),this.push(null)}};$z.exports=Rk});var r5=w((pnt,t5)=>{\"use strict\";var Gxe=[\"destroy\",\"setTimeout\",\"socket\",\"headers\",\"trailers\",\"rawHeaders\",\"statusCode\",\"httpVersion\",\"httpVersionMinor\",\"httpVersionMajor\",\"rawTrailers\",\"statusMessage\"];t5.exports=(r,e)=>{let t=new Set(Object.keys(r).concat(Gxe));for(let i of t)i in e||(e[i]=typeof r[i]==\"function\"?r[i].bind(r):r[i])}});var n5=w((dnt,i5)=>{\"use strict\";var Yxe=J(\"stream\").PassThrough,jxe=r5(),qxe=r=>{if(!(r&&r.pipe))throw new TypeError(\"Parameter `response` must be a response stream.\");let e=new Yxe;return jxe(r,e),r.pipe(e)};i5.exports=qxe});var s5=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 A5=w((mnt,a5)=>{\"use strict\";var Jxe=J(\"events\"),o5=s5(),Wxe=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:o5.stringify,deserialize:o5.parse},typeof e==\"string\"?{uri:e}:e,t),!this.opts.store){let i=Object.assign({},this.opts);this.opts.store=Wxe(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())}};a5.exports=Nk});var u5=w((Int,c5)=>{\"use strict\";var zxe=J(\"events\"),_w=J(\"url\"),Vxe=Lz(),Xxe=Vz(),Tk=Zz(),l5=e5(),Zxe=Zw(),_xe=n5(),$xe=A5(),ao=class{constructor(e,t){if(typeof e!=\"function\")throw new TypeError(\"Parameter `request` must be a function\");return this.cache=new $xe({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,...ePe(n)},t.headers=Zxe(t.headers);let s=new zxe,o=Vxe(_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 l5(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=_xe(y),(async()=>{try{let v=Xxe.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 ao.CacheError(v))}})()):g.cache&&l&&(async()=>{try{await this.cache.delete(a)}catch(v){s.emit(\"error\",new ao.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 ao.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 l5(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 ao.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 ao.CacheError(h))}})(),s}}};function ePe(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}}ao.RequestError=class extends Error{constructor(r){super(r.message),this.name=\"RequestError\",Object.assign(this,r)}};ao.CacheError=class extends Error{constructor(r){super(r.message),this.name=\"CacheError\",Object.assign(this,r)}};c5.exports=ao});var f5=w((Bnt,g5)=>{\"use strict\";var tPe=[\"aborted\",\"complete\",\"headers\",\"httpVersion\",\"httpVersionMinor\",\"httpVersionMajor\",\"method\",\"rawHeaders\",\"rawTrailers\",\"setTimeout\",\"socket\",\"statusCode\",\"statusMessage\",\"trailers\",\"url\"];g5.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(tPe)),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 p5=w((bnt,h5)=>{\"use strict\";var{Transform:rPe,PassThrough:iPe}=J(\"stream\"),Ok=J(\"zlib\"),nPe=f5();h5.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 rPe({transform(a,l,c){i=!1,c(null,a)},flush(a){a()}}),s=new iPe({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)}),nPe(r,s),r.pipe(n).pipe(o).pipe(s),s}});var Kk=w((Qnt,d5)=>{\"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)}};d5.exports=Mk});var Hk=w((Snt,I5)=>{\"use strict\";var sPe=J(\"events\"),oPe=J(\"tls\"),aPe=J(\"http2\"),APe=Kk(),on=Symbol(\"currentStreamsCount\"),C5=Symbol(\"request\"),Bs=Symbol(\"cachedOriginSet\"),Uf=Symbol(\"gracefullyClosing\"),lPe=[\"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\"],cPe=(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},uPe=(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&&E5(t)},gPe=(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&&E5(e)},m5=({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},E5=r=>{r[Uf]=!0,r[on]===0&&r.close()},zo=class extends sPe{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 APe({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 lPe)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=aPe.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(cPe(B,f,uPe),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[C5]=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[C5](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&&(gPe(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),oPe.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 m5({agent:this,isFree:!0})}get busySessions(){return m5({agent:this,isFree:!1})}};zo.kCurrentStreamsCount=on;zo.kGracefullyClosing=Uf;I5.exports={Agent:zo,globalAgent:new zo}});var Yk=w((vnt,y5)=>{\"use strict\";var{Readable:fPe}=J(\"stream\"),Gk=class extends fPe{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()}};y5.exports=Gk});var jk=w((xnt,w5)=>{\"use strict\";w5.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 b5=w((Pnt,B5)=>{\"use strict\";B5.exports=(r,e,t)=>{for(let i of t)r.on(i,(...n)=>e.emit(i,...n))}});var S5=w((Dnt,Q5)=>{\"use strict\";Q5.exports=r=>{switch(r){case\":method\":case\":scheme\":case\":authority\":case\":path\":return!0;default:return!1}}});var x5=w((Rnt,v5)=>{\"use strict\";var Hf=(r,e,t)=>{v5.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((Fnt,T5)=>{\"use strict\";var hPe=J(\"http2\"),{Writable:pPe}=J(\"stream\"),{Agent:P5,globalAgent:dPe}=Hk(),CPe=Yk(),mPe=jk(),EPe=b5(),IPe=S5(),{ERR_INVALID_ARG_TYPE:qk,ERR_INVALID_PROTOCOL:yPe,ERR_HTTP_HEADERS_SENT:D5,ERR_INVALID_HTTP_TOKEN:wPe,ERR_HTTP_INVALID_HEADER_VALUE:BPe,ERR_INVALID_CHAR:bPe}=x5(),{HTTP2_HEADER_STATUS:k5,HTTP2_HEADER_METHOD:R5,HTTP2_HEADER_PATH:F5,HTTP2_METHOD_CONNECT:QPe}=hPe.constants,Ui=Symbol(\"headers\"),Jk=Symbol(\"origin\"),Wk=Symbol(\"session\"),N5=Symbol(\"options\"),$w=Symbol(\"flushedHeaders\"),EC=Symbol(\"jobs\"),SPe=/^[\\^`\\-\\w!#$%&*+.|~]+$/,vPe=/[^\\t\\u0020-\\u007E\\u0080-\\u00FF]/,zk=class extends pPe{constructor(e,t,i){super({autoDestroy:!1});let n=typeof e==\"string\"||e instanceof URL;if(n&&(e=mPe(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 P5({maxFreeSessions:0});else if(typeof t.agent>\"u\"||t.agent===null)typeof t.createConnection==\"function\"?(this.agent=new P5({maxFreeSessions:0}),this.agent.createConnection=t.createConnection):this.agent=dPe;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 yPe(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[N5]=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][R5]}set method(e){e&&(this[Ui][R5]=e.toUpperCase())}get path(){return this[Ui][F5]}set path(e){e&&(this[Ui][F5]=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===QPe,t=i=>{if(this._request=i,this.destroyed){i.destroy();return}e||EPe(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 CPe(this.socket,i.readableHighWaterMark);this.res=c,c.req=this,c.statusCode=o[k5],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[k5]}))),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[N5],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 D5(\"remove\");delete this[Ui][e.toLowerCase()]}setHeader(e,t){if(this.headersSent)throw new D5(\"set\");if(typeof e!=\"string\"||!SPe.test(e)&&!IPe(e))throw new wPe(\"Header name\",e);if(typeof t>\"u\")throw new BPe(t,e);if(vPe.test(t))throw new bPe(\"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){}};T5.exports=zk});var O5=w((Nnt,L5)=>{\"use strict\";var xPe=J(\"tls\");L5.exports=(r={})=>new Promise((e,t)=>{let i=xPe.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 K5=w((Tnt,M5)=>{\"use strict\";var PPe=J(\"net\");M5.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]),PPe.isIP(e)?\"\":e}});var G5=w((Lnt,Zk)=>{\"use strict\";var U5=J(\"http\"),Xk=J(\"https\"),DPe=O5(),kPe=Kk(),RPe=Vk(),FPe=K5(),NPe=jk(),eB=new kPe({maxSize:100}),IC=new Map,H5=(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)},TPe=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=DPe(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?H5(i,s,r):s.destroy():a.createConnection===l?H5(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=NPe(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||FPe(e),e.port=e.port||(i?443:80),e._defaultAgent=i?Xk.globalAgent:U5.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 TPe(e)===\"h2\"?(n&&(e.agent=n.http2),new RPe(e,t)):U5.request(e,t)};Zk.exports.protocolCache=eB});var j5=w((Ont,Y5)=>{\"use strict\";var LPe=J(\"http2\"),OPe=Hk(),_k=Vk(),MPe=Yk(),KPe=G5(),UPe=(r,e,t)=>new _k(r,e,t),HPe=(r,e,t)=>{let i=new _k(r,e,t);return i.end(),i};Y5.exports={...LPe,ClientRequest:_k,IncomingMessage:MPe,...OPe,request:UPe,get:HPe,auto:KPe}});var eR=w($k=>{\"use strict\";Object.defineProperty($k,\"__esModule\",{value:!0});var q5=Ya();$k.default=r=>q5.default.nodeStream(r)&&q5.default.function_(r.getBoundary)});var V5=w(tR=>{\"use strict\";Object.defineProperty(tR,\"__esModule\",{value:!0});var W5=J(\"fs\"),z5=J(\"util\"),J5=Ya(),GPe=eR(),YPe=z5.promisify(W5.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(GPe.default(r))return z5.promisify(r.getLength.bind(r))();if(r instanceof W5.ReadStream){let{size:t}=await YPe(r.path);return t===0?void 0:t}}});var iR=w(rR=>{\"use strict\";Object.defineProperty(rR,\"__esModule\",{value:!0});function jPe(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=jPe});var X5=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 _5=w(yC=>{\"use strict\";Object.defineProperty(yC,\"__esModule\",{value:!0});yC.TimeoutError=void 0;var qPe=J(\"net\"),JPe=X5(),Z5=Symbol(\"reentry\"),WPe=()=>{},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(Z5 in r)return WPe;r[Z5]=!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:qPe.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 e6=w(sR=>{\"use strict\";Object.defineProperty(sR,\"__esModule\",{value:!0});var $5=Ya();sR.default=r=>{r=r;let e={protocol:r.protocol,hostname:$5.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 $5.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 t6=w(oR=>{\"use strict\";Object.defineProperty(oR,\"__esModule\",{value:!0});var zPe=J(\"url\"),VPe=[\"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 zPe.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 VPe)e[s]&&(n[s]=e[s].toString());return n}});var r6=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 XPe=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=XPe});var n6=w(Oc=>{\"use strict\";Object.defineProperty(Oc,\"__esModule\",{value:!0});Oc.dnsLookupIpVersionToFamily=Oc.isDnsLookupIpVersion=void 0;var i6={auto:0,ipv4:4,ipv6:6};Oc.isDnsLookupIpVersion=r=>r in i6;Oc.dnsLookupIpVersionToFamily=r=>{if(Oc.isDnsLookupIpVersion(r))return i6[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 o6=w(gR=>{\"use strict\";Object.defineProperty(gR,\"__esModule\",{value:!0});var s6=new Set;gR.default=r=>{s6.has(r)||(s6.add(r),process.emitWarning(`Got: ${r}`,{type:\"DeprecationWarning\"}))}});var a6=w(fR=>{\"use strict\";Object.defineProperty(fR,\"__esModule\",{value:!0});var mr=Ya(),ZPe=(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=ZPe});var A6=w(wC=>{\"use strict\";Object.defineProperty(wC,\"__esModule\",{value:!0});wC.retryAfterStatusCodes=void 0;wC.retryAfterStatusCodes=new Set([413,429,503]);var _Pe=({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=_Pe});var QC=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 l6=J(\"util\"),c6=J(\"stream\"),$Pe=J(\"fs\"),VA=J(\"url\"),u6=J(\"http\"),hR=J(\"http\"),eDe=J(\"https\"),tDe=Sz(),rDe=Fz(),g6=u5(),iDe=p5(),nDe=j5(),sDe=Zw(),Ee=Ya(),oDe=V5(),f6=eR(),aDe=iR(),h6=_5(),ADe=e6(),p6=t6(),lDe=r6(),cDe=cR(),d6=n6(),uDe=uR(),XA=o6(),gDe=a6(),fDe=A6(),pR,Pi=Symbol(\"request\"),sB=Symbol(\"response\"),Gf=Symbol(\"responseSize\"),Yf=Symbol(\"downloadedSize\"),jf=Symbol(\"bodySize\"),qf=Symbol(\"uploadedSize\"),iB=Symbol(\"serverResponsesPiped\"),C6=Symbol(\"unproxyEvents\"),m6=Symbol(\"isFromCache\"),dR=Symbol(\"cancelTimeouts\"),E6=Symbol(\"startedReading\"),Jf=Symbol(\"stopReading\"),nB=Symbol(\"triggerRead\"),ZA=Symbol(\"body\"),BC=Symbol(\"jobs\"),I6=Symbol(\"originalResponse\"),y6=Symbol(\"retryTimeout\");Yt.kIsNormalizedAlready=Symbol(\"isNormalizedAlready\");var hDe=Ee.default.string(process.versions.brotli);Yt.withoutBody=new Set([\"GET\",\"HEAD\"]);Yt.knownHookEvents=[\"init\",\"beforeRequest\",\"beforeRedirect\",\"beforeError\",\"beforeRetry\",\"afterResponse\"];function pDe(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 dDe(r){return Ee.default.object(r)&&!(\"statusCode\"in r)}var CR=new lDe.default,CDe=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()})}),mDe=new Set([300,301,302,303,304,307,308]),EDe=[\"context\",\"body\",\"json\",\"form\"];Yt.setNonEnumerableProperties=(r,e)=>{let t={};for(let i of r)if(!!i)for(let n of EDe)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 bC=class extends ei{constructor(e,t){super(e.message,e,t),this.name=\"ReadError\"}};Yt.ReadError=bC;var uB=class extends ei{constructor(e){super(`Unsupported protocol \"${e.url.protocol}\"`,{},e),this.name=\"UnsupportedProtocolError\"}};Yt.UnsupportedProtocolError=uB;var IDe=[\"socket\",\"connect\",\"continue\",\"information\",\"upgrade\",\"timeout\"],gB=class extends c6.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 $Pe.ReadStream&&await CDe(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 VA.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([d6.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=sDe({...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 VA.URLSearchParams)h=new VA.URLSearchParams(t.searchParams);else{pDe(t.searchParams),h=new VA.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=p6.default(t.prefixUrl+t.url,t)}else(Ee.default.undefined(t.url)&&t.prefixUrl!==\"\"||t.protocol)&&(t.url=p6.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 VA.URL(C+y.href.slice(h.length)),h=C},get:()=>h});let{protocol:p}=t.url;if(p===\"unix:\"&&(p=\"http:\",t.url=new VA.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=l6.promisify(h.bind(t.cookieJar)),p=l6.promisify(p.bind(t.cookieJar)),t.cookieJar={setCookie:h,getCookieString:p})}let{cache:g}=t;if(g&&(CR.has(g)||CR.set(g,new g6((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 rDe.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&&XA.default('\"options.family\" was never documented, please use \"options.dnsLookupIpVersion\"'),i!=null&&i.https&&(t.https={...i.https,...t.https}),\"rejectUnauthorized\"in t&&XA.default('\"options.rejectUnauthorized\" is now deprecated, please use \"options.https.rejectUnauthorized\"'),\"checkServerIdentity\"in t&&XA.default('\"options.checkServerIdentity\" was never documented, please use \"options.https.checkServerIdentity\"'),\"ca\"in t&&XA.default('\"options.ca\" was never documented, please use \"options.https.certificateAuthority\"'),\"key\"in t&&XA.default('\"options.key\" was never documented, please use \"options.https.key\"'),\"cert\"in t&&XA.default('\"options.cert\" was never documented, please use \"options.https.certificate\"'),\"passphrase\"in t&&XA.default('\"options.passphrase\" was never documented, please use \"options.https.passphrase\"'),\"pfx\"in t&&XA.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),gDe.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 c6.Readable)&&!Ee.default.string(e.body)&&!Ee.default.buffer(e.body)&&!f6.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?(f6.default(e.body)&&l&&(t[\"content-type\"]=`multipart/form-data; boundary=${e.body.getBoundary()}`),this[ZA]=e.body):i?(l&&(t[\"content-type\"]=\"application/x-www-form-urlencoded\"),this[ZA]=new VA.URLSearchParams(e.form).toString()):(l&&(t[\"content-type\"]=\"application/json\"),this[ZA]=e.stringifyJson(e.json));let c=await oDe.default(this[ZA],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[I6]=e,t.decompress&&(e=iDe(e));let n=e.statusCode,s=e;s.statusMessage=s.statusMessage?s.statusMessage:u6.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[m6]=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 bC(a,this))}),e.once(\"aborted\",()=>{this._beforeError(new bC({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&&mDe.has(n)){if(e.resume(),this[Pi]&&(this[dR](),delete this[Pi],this[C6]()),(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[ZA]=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 VA.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&&!uDe.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;tDe.default(e),this[dR]=h6.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 h6.TimeoutError?new cB(l,this.timings,this):new ei(l.message,l,this),this._beforeError(l)}),this[C6]=aDe.default(e,this,IDe),this[Pi]=e,this.emit(\"uploadProgress\",this.uploadProgress);let o=this[ZA],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,ADe.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\"]=hDe?\"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[ZA]!==o.body&&(this[ZA]=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=nDe.auto:h=f?eDe.request:u6.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=d6.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),dDe(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 g6.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 cDe.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:fDe.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[y6]=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[E6]=!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[y6]),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[I6])===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[m6]}pipe(e,t){if(this[E6])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 yDe=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]}),wDe=Ao&&Ao.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&yDe(e,r,t)};Object.defineProperty(Ao,\"__esModule\",{value:!0});Ao.CancelError=Ao.ParseError=void 0;var w6=QC(),mR=class extends w6.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 w6.RequestError{constructor(e){super(\"Promise was canceled\",{},e),this.name=\"CancelError\"}get isCanceled(){return!0}};Ao.CancelError=ER;wDe(QC(),Ao)});var b6=w(IR=>{\"use strict\";Object.defineProperty(IR,\"__esModule\",{value:!0});var B6=SC(),BDe=(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 B6.ParseError({message:`Unknown body type '${e}'`,name:\"Error\"},r)}catch(s){throw new B6.ParseError(s,r)}};IR.default=BDe});var yR=w(_A=>{\"use strict\";var bDe=_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]}),QDe=_A&&_A.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&bDe(e,r,t)};Object.defineProperty(_A,\"__esModule\",{value:!0});var SDe=J(\"events\"),vDe=Ya(),xDe=bz(),fB=SC(),Q6=b6(),S6=QC(),PDe=iR(),DDe=cR(),v6=uR(),kDe=[\"request\",\"response\",\"redirect\",\"uploadProgress\",\"downloadProgress\"];function x6(r){let e,t,i=new SDe.EventEmitter,n=new xDe((o,a,l)=>{let c=u=>{let g=new S6.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 DDe.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=Q6.default(p,D.responseType,D.parseJson,D.encoding)}catch(T){if(p.body=y.toString(),v6.isResponseOk(p)){g._beforeError(T);return}}try{for(let[T,H]of D.hooks.afterResponse.entries())p=await H(p,async j=>{let $=S6.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=x6($);return l(()=>{V.catch(()=>{}),V.cancel()}),V})}catch(T){g._beforeError(new fB.RequestError(T.message,T,g));return}if(!v6.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)&&vDe.default.nodeStream((B=C.request)===null||B===void 0?void 0:B.options.body)){f(C);return}c(p)}),PDe.default(g,i,kDe)};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 Q6.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=x6;QDe(SC(),_A)});var P6=w(wR=>{\"use strict\";Object.defineProperty(wR,\"__esModule\",{value:!0});var RDe=SC();function FDe(r,...e){let t=(async()=>{if(r instanceof RDe.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=FDe});var R6=w(BR=>{\"use strict\";Object.defineProperty(BR,\"__esModule\",{value:!0});var D6=Ya();function k6(r){for(let e of Object.values(r))(D6.default.plainObject(e)||D6.default.array(e))&&k6(e);return Object.freeze(r)}BR.default=k6});var N6=w(F6=>{\"use strict\";Object.defineProperty(F6,\"__esModule\",{value:!0})});var bR=w(Qs=>{\"use strict\";var NDe=Qs&&Qs.__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]}),TDe=Qs&&Qs.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&NDe(e,r,t)};Object.defineProperty(Qs,\"__esModule\",{value:!0});Qs.defaultHandler=void 0;var T6=Ya(),bs=yR(),LDe=P6(),pB=QC(),ODe=R6(),MDe={RequestError:bs.RequestError,CacheError:bs.CacheError,ReadError:bs.ReadError,HTTPError:bs.HTTPError,MaxRedirectsError:bs.MaxRedirectsError,TimeoutError:bs.TimeoutError,ParseError:bs.ParseError,CancelError:bs.CancelError,UnsupportedProtocolError:bs.UnsupportedProtocolError,UploadError:bs.UploadError},KDe=async r=>new Promise(e=>{setTimeout(e,r)}),{normalizeArguments:hB}=pB.default,L6=(...r)=>{let e;for(let t of r)e=hB(void 0,t,e);return e},UDe=r=>r.isStream?new pB.default(void 0,r):bs.default(r),HDe=r=>\"defaults\"in r&&\"options\"in r.defaults,GDe=[\"get\",\"post\",\"put\",\"patch\",\"head\",\"delete\"];Qs.defaultHandler=(r,e)=>e(r);var O6=(r,e)=>{if(r)for(let t of r)t(e)},M6=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?UDe:c);if(T6.default.plainObject(i)){let u={...i,...n};pB.setNonEnumerableProperties([i,n],u),n=u,i=void 0}try{let u;try{O6(r.options.hooks.init,n),O6((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 bs.RequestError(u.message,u,g);return c(g)}catch(u){if(n.isStream)throw u;return LDe.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)HDe(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!==Qs.defaultHandler),s.length===0&&s.push(Qs.defaultHandler),M6({options:L6(...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(!T6.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 KDe(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 GDe)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,MDe),Object.defineProperty(e,\"defaults\",{value:r.mutableDefaults?r:ODe.default(r),writable:r.mutableDefaults,configurable:r.mutableDefaults,enumerable:!0}),e.mergeOptions=L6,e};Qs.default=M6;TDe(N6(),Qs)});var CB=w((ja,dB)=>{\"use strict\";var YDe=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]}),K6=ja&&ja.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&YDe(e,r,t)};Object.defineProperty(ja,\"__esModule\",{value:!0});var jDe=J(\"url\"),U6=bR(),qDe={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 jDe.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:[U6.defaultHandler],mutableDefaults:!1},QR=U6.default(qDe);ja.default=QR;dB.exports=QR;dB.exports.default=QR;dB.exports.__esModule=!0;K6(bR(),ja);K6(yR(),ja)});var j6=w(Wf=>{\"use strict\";var ost=J(\"net\"),JDe=J(\"tls\"),SR=J(\"http\"),H6=J(\"https\"),WDe=J(\"events\"),ast=J(\"assert\"),zDe=J(\"util\");Wf.httpOverHttp=VDe;Wf.httpsOverHttp=XDe;Wf.httpOverHttps=ZDe;Wf.httpsOverHttps=_De;function VDe(r){var e=new qa(r);return e.request=SR.request,e}function XDe(r){var e=new qa(r);return e.request=SR.request,e.createSocket=G6,e.defaultPort=443,e}function ZDe(r){var e=new qa(r);return e.request=H6.request,e}function _De(r){var e=new qa(r);return e.request=H6.request,e.createSocket=G6,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=Y6(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)})}zDe.inherits(qa,WDe.EventEmitter);qa.prototype.addRequest=function(e,t,i,n){var s=this,o=vR({request:e},s.options,Y6(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\")),$A(\"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){$A(\"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){$A(\"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 $A(\"tunneling connection has established\"),i.sockets[i.sockets.indexOf(n)]=f,t(f)}function u(g){o.removeAllListeners(),$A(`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 G6(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 Y6(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 $A;process.env.NODE_DEBUG&&/\\btunnel\\b/.test(process.env.NODE_DEBUG)?$A=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)}:$A=function(){};Wf.debug=$A});var J6=w((lst,q6)=>{q6.exports=j6()});var iV=w((IB,FR)=>{var rV=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=rV),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 be=(it.length<<2)+1;Et=b(be),oe(it,Et,be)}return Et},array:function(it){var Et=b(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());wo(hr)}function Ii(){Ks=!0,!t.noFSInit&&!S.init.initialized&&S.init(),ns.init(),wo(fi)}function rs(){if(t.postRun)for(typeof t.postRun==\"function\"&&(t.postRun=[t.postRun]);t.postRun.length;)cg(t.postRun.shift());wo(ni)}function fa(d){hr.unshift(d)}function dA(d){fi.unshift(d)}function cg(d){ni.unshift(d)}var is=0,CA=null,ha=null;function wp(d){return d}function mA(d){is++,t.monitorRunDependencies&&t.monitorRunDependencies(is)}function EA(d){if(is--,t.monitorRunDependencies&&t.monitorRunDependencies(is),is==0&&(CA!==null&&(clearInterval(CA),CA=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 yo=\"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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AAAgAygCHEHcFmogAygCDEECdGooAgAgAygCHEHYKGpqLQAASg0ADAELIAMoAhxB3BZqIAMoAhRBAnRqIAMoAhxB3BZqIAMoAgxBAnRqKAIANgIAIAMgAygCDDYCFCADIAMoAgxBAXQ2AgwMAQsLIAMoAhxB3BZqIAMoAhRBAnRqIAMoAhA2AgAL1xMBA38jAEEwayICJAAgAiAANgIsIAIgATYCKCACIAIoAigoAgA2AiQgAiACKAIoKAIIKAIANgIgIAIgAigCKCgCCCgCDDYCHCACQX82AhAgAigCLEEANgLQKCACKAIsQb0ENgLUKCACQQA2AhgDQCACKAIYIAIoAhxIBEACQCACKAIkIAIoAhhBAnRqLwEABEAgAiACKAIYIgE2AhAgAigCLEHcFmohAyACKAIsIgQoAtAoQQFqIQAgBCAANgLQKCAAQQJ0IANqIAE2AgAgAigCGCACKAIsQdgoampBADoAAAwBCyACKAIkIAIoAhhBAnRqQQA7AQILIAIgAigCGEEBajYCGAwBCwsDQCACKAIsKALQKEECSARAAkAgAigCEEECSARAIAIgAigCEEEBaiIANgIQDAELQQAhAAsgAigCLEHcFmohAyACKAIsIgQoAtAoQQFqIQEgBCABNgLQKCABQQJ0IANqIAA2AgAgAiAANgIMIAIoAiQgAigCDEECdGpBATsBACACKAIMIAIoAixB2ChqakEAOgAAIAIoAiwiACAAKAKoLUEBazYCqC0gAigCIARAIAIoAiwiACAAKAKsLSACKAIgIAIoAgxBAnRqLwECazYCrC0LDAELCyACKAIoIAIoAhA2AgQgAiACKAIsKALQKEECbTYCGANAIAIoAhhBAU4EQCACKAIsIAIoAiQgAigCGBB5IAIgAigCGEEBazYCGAwBCwsgAiACKAIcNgIMA0AgAiACKAIsKALgFjYCGCACKAIsQdwWaiEBIAIoAiwiAygC0CghACADIABBAWs2AtAoIAIoAiwgAEECdCABaigCADYC4BYgAigCLCACKAIkQQEQeSACIAIoAiwoAuAWNgIUIAIoAhghASACKAIsQdwWaiEDIAIoAiwiBCgC1ChBAWshACAEIAA2AtQoIABBAnQgA2ogATYCACACKAIUIQEgAigCLEHcFmohAyACKAIsIgQoAtQoQQFrIQAgBCAANgLUKCAAQQJ0IANqIAE2AgAgAigCJCACKAIMQQJ0aiACKAIkIAIoAhhBAnRqLwEAIAIoAiQgAigCFEECdGovAQBqOwEAIAIoAgwgAigCLEHYKGpqAn8gAigCGCACKAIsQdgoamotAAAgAigCFCACKAIsQdgoamotAABOBEAgAigCGCACKAIsQdgoamotAAAMAQsgAigCFCACKAIsQdgoamotAAALQQFqOgAAIAIoAiQgAigCFEECdGogAigCDCIAOwECIAIoAiQgAigCGEECdGogADsBAiACIAIoAgwiAEEBajYCDCACKAIsIAA2AuAWIAIoAiwgAigCJEEBEHkgAigCLCgC0ChBAk4NAAsgAigCLCgC4BYhASACKAIsQdwWaiEDIAIoAiwiBCgC1ChBAWshACAEIAA2AtQoIABBAnQgA2ogATYCACACKAIoIQEjAEFAaiIAIAIoAiw2AjwgACABNgI4IAAgACgCOCgCADYCNCAAIAAoAjgoAgQ2AjAgACAAKAI4KAIIKAIANgIsIAAgACgCOCgCCCgCBDYCKCAAIAAoAjgoAggoAgg2AiQgACAAKAI4KAIIKAIQNgIgIABBADYCBCAAQQA2AhADQCAAKAIQQQ9MBEAgACgCPEG8FmogACgCEEEBdGpBADsBACAAIAAoAhBBAWo2AhAMAQsLIAAoAjQgACgCPEHcFmogACgCPCgC1ChBAnRqKAIAQQJ0akEAOwECIAAgACgCPCgC1ChBAWo2AhwDQCAAKAIcQb0ESARAIAAgACgCPEHcFmogACgCHEECdGooAgA2AhggACAAKAI0IAAoAjQgACgCGEECdGovAQJBAnRqLwECQQFqNgIQIAAoAhAgACgCIEoEQCAAIAAoAiA2AhAgACAAKAIEQQFqNgIECyAAKAI0IAAoAhhBAnRqIAAoAhA7AQIgACgCGCAAKAIwTARAIAAoAjwgACgCEEEBdGpBvBZqIgEgAS8BAEEBajsBACAAQQA2AgwgACgCGCAAKAIkTgRAIAAgACgCKCAAKAIYIAAoAiRrQQJ0aigCADYCDAsgACAAKAI0IAAoAhhBAnRqLwEAOwEKIAAoAjwiASABKAKoLSAALwEKIAAoAhAgACgCDGpsajYCqC0gACgCLARAIAAoAjwiASABKAKsLSAALwEKIAAoAiwgACgCGEECdGovAQIgACgCDGpsajYCrC0LCyAAIAAoAhxBAWo2AhwMAQsLAkAgACgCBEUNAANAIAAgACgCIEEBazYCEANAIAAoAjxBvBZqIAAoAhBBAXRqLwEARQRAIAAgACgCEEEBazYCEAwBCwsgACgCPCAAKAIQQQF0akG8FmoiASABLwEAQQFrOwEAIAAoAjwgACgCEEEBdGpBvhZqIgEgAS8BAEECajsBACAAKAI8IAAoAiBBAXRqQbwWaiIBIAEvAQBBAWs7AQAgACAAKAIEQQJrNgIEIAAoAgRBAEoNAAsgACAAKAIgNgIQA0AgACgCEEUNASAAIAAoAjxBvBZqIAAoAhBBAXRqLwEANgIYA0AgACgCGARAIAAoAjxB3BZqIQEgACAAKAIcQQFrIgM2AhwgACADQQJ0IAFqKAIANgIUIAAoAhQgACgCMEoNASAAKAI0IAAoAhRBAnRqLwECIAAoAhBHBEAgACgCPCIBIAEoAqgtIAAoAjQgACgCFEECdGovAQAgACgCECAAKAI0IAAoAhRBAnRqLwECa2xqNgKoLSAAKAI0IAAoAhRBAnRqIAAoAhA7AQILIAAgACgCGEEBazYCGAwBCwsgACAAKAIQQQFrNgIQDAALAAsgAigCJCEBIAIoAhAhAyACKAIsQbwWaiEEIwBBQGoiACQAIAAgATYCPCAAIAM2AjggACAENgI0IABBADYCDCAAQQE2AggDQCAAKAIIQQ9MBEAgACAAKAIMIAAoAjQgACgCCEEBa0EBdGovAQBqQQF0NgIMIABBEGogACgCCEEBdGogACgCDDsBACAAIAAoAghBAWo2AggMAQsLIABBADYCBANAIAAoAgQgACgCOEwEQCAAIAAoAjwgACgCBEECdGovAQI2AgAgACgCAARAIABBEGogACgCAEEBdGoiAS8BACEDIAEgA0EBajsBACAAKAIAIQQjAEEQayIBIAM2AgwgASAENgIIIAFBADYCBANAIAEgASgCBCABKAIMQQFxcjYCBCABIAEoAgxBAXY2AgwgASABKAIEQQF0NgIEIAEgASgCCEEBayIDNgIIIANBAEoNAAsgASgCBEEBdiEBIAAoAjwgACgCBEECdGogATsBAAsgACAAKAIEQQFqNgIEDAELCyAAQUBrJAAgAkEwaiQAC04BAX8jAEEQayICIAA7AQogAiABNgIEAkAgAi8BCkEBRgRAIAIoAgRBAUYEQCACQQA2AgwMAgsgAkEENgIMDAELIAJBADYCDAsgAigCDAvOAgEBfyMAQTBrIgUkACAFIAA2AiwgBSABNgIoIAUgAjYCJCAFIAM3AxggBSAENgIUIAVCADcDCANAIAUpAwggBSkDGFQEQCAFIAUoAiQgBSkDCKdqLQAAOgAHIAUoAhRFBEAgBSAFKAIsKAIUQQJyOwESIAUgBS8BEiAFLwESQQFzbEEIdjsBEiAFIAUtAAcgBS8BEkH/AXFzOgAHCyAFKAIoBEAgBSgCKCAFKQMIp2ogBS0ABzoAAAsgBSgCLCgCDEF/cyAFQQdqQQEQGkF/cyEAIAUoAiwgADYCDCAFKAIsIAUoAiwoAhAgBSgCLCgCDEH/AXFqQYWIosAAbEEBajYCECAFIAUoAiwoAhBBGHY6AAcgBSgCLCgCFEF/cyAFQQdqQQEQGkF/cyEAIAUoAiwgADYCFCAFIAUpAwhCAXw3AwgMAQsLIAVBMGokAAttAQF/IwBBIGsiBCQAIAQgADYCGCAEIAE2AhQgBCACNwMIIAQgAzYCBAJAIAQoAhhFBEAgBEEANgIcDAELIAQgBCgCFCAEKQMIIAQoAgQgBCgCGEEIahDEATYCHAsgBCgCHCEAIARBIGokACAAC6cDAQF/IwBBIGsiBCQAIAQgADYCGCAEIAE3AxAgBCACNgIMIAQgAzYCCCAEIAQoAhggBCkDECAEKAIMQQAQPyIANgIAAkAgAEUEQCAEQX82AhwMAQsgBCAEKAIYIAQpAxAgBCgCDBDFASIANgIEIABFBEAgBEF/NgIcDAELAkACQCAEKAIMQQhxDQAgBCgCGCgCQCAEKQMQp0EEdGooAghFDQAgBCgCGCgCQCAEKQMQp0EEdGooAgggBCgCCBA5QQBIBEAgBCgCGEEIakEPQQAQFCAEQX82AhwMAwsMAQsgBCgCCBA7IAQoAgggBCgCACgCGDYCLCAEKAIIIAQoAgApAyg3AxggBCgCCCAEKAIAKAIUNgIoIAQoAgggBCgCACkDIDcDICAEKAIIIAQoAgAoAhA7ATAgBCgCCCAEKAIALwFSOwEyIAQoAghBIEEAIAQoAgAtAAZBAXEbQdwBcq03AwALIAQoAgggBCkDEDcDECAEKAIIIAQoAgQ2AgggBCgCCCIAIAApAwBCA4Q3AwAgBEEANgIcCyAEKAIcIQAgBEEgaiQAIAALWQIBfwF+AkACf0EAIABFDQAaIACtIAGtfiIDpyICIAAgAXJBgIAESQ0AGkF/IAIgA0IgiKcbCyICEBgiAEUNACAAQQRrLQAAQQNxRQ0AIABBACACEDMLIAALAwABC+oBAgF/AX4jAEEgayIEJAAgBCAANgIYIAQgATYCFCAEIAI2AhAgBCADNgIMIAQgBCgCDBCCASIANgIIAkAgAEUEQCAEQQA2AhwMAQsjAEEQayIAIAQoAhg2AgwgACgCDCIAIAAoAjBBAWo2AjAgBCgCCCAEKAIYNgIAIAQoAgggBCgCFDYCBCAEKAIIIAQoAhA2AgggBCgCGCAEKAIQQQBCAEEOIAQoAhQRCgAhBSAEKAIIIAU3AxggBCgCCCkDGEIAUwRAIAQoAghCPzcDGAsgBCAEKAIINgIcCyAEKAIcIQAgBEEgaiQAIAAL6gEBAX8jAEEQayIBJAAgASAANgIIIAFBOBAYIgA2AgQCQCAARQRAIAEoAghBDkEAEBQgAUEANgIMDAELIAEoAgRBADYCACABKAIEQQA2AgQgASgCBEEANgIIIAEoAgRBADYCICABKAIEQQA2AiQgASgCBEEAOgAoIAEoAgRBADYCLCABKAIEQQE2AjAjAEEQayIAIAEoAgRBDGo2AgwgACgCDEEANgIAIAAoAgxBADYCBCAAKAIMQQA2AgggASgCBEEAOgA0IAEoAgRBADoANSABIAEoAgQ2AgwLIAEoAgwhACABQRBqJAAgAAuwAQIBfwF+IwBBIGsiAyQAIAMgADYCGCADIAE2AhQgAyACNgIQIAMgAygCEBCCASIANgIMAkAgAEUEQCADQQA2AhwMAQsgAygCDCADKAIYNgIEIAMoAgwgAygCFDYCCCADKAIUQQBCAEEOIAMoAhgRDgAhBCADKAIMIAQ3AxggAygCDCkDGEIAUwRAIAMoAgxCPzcDGAsgAyADKAIMNgIcCyADKAIcIQAgA0EgaiQAIAALwwIBAX8jAEEQayIDIAA2AgwgAyABNgIIIAMgAjYCBCADKAIIKQMAQgKDQgBSBEAgAygCDCADKAIIKQMQNwMQCyADKAIIKQMAQgSDQgBSBEAgAygCDCADKAIIKQMYNwMYCyADKAIIKQMAQgiDQgBSBEAgAygCDCADKAIIKQMgNwMgCyADKAIIKQMAQhCDQgBSBEAgAygCDCADKAIIKAIoNgIoCyADKAIIKQMAQiCDQgBSBEAgAygCDCADKAIIKAIsNgIsCyADKAIIKQMAQsAAg0IAUgRAIAMoAgwgAygCCC8BMDsBMAsgAygCCCkDAEKAAYNCAFIEQCADKAIMIAMoAggvATI7ATILIAMoAggpAwBCgAKDQgBSBEAgAygCDCADKAIIKAI0NgI0CyADKAIMIgAgAygCCCkDACAAKQMAhDcDAEEAC10BAX8jAEEQayICJAAgAiAANgIIIAIgATYCBAJAIAIoAgRFBEAgAkEANgIMDAELIAIgAigCCCACKAIEKAIAIAIoAgQvAQStEDY2AgwLIAIoAgwhACACQRBqJAAgAAuPAQEBfyMAQRBrIgIkACACIAA2AgggAiABNgIEAkACQCACKAIIBEAgAigCBA0BCyACIAIoAgggAigCBEY2AgwMAQsgAigCCC8BBCACKAIELwEERwRAIAJBADYCDAwBCyACIAIoAggoAgAgAigCBCgCACACKAIILwEEEE9FNgIMCyACKAIMIQAgAkEQaiQAIAALVQEBfyMAQRBrIgEkACABIAA2AgwgAUEAQQBBABAaNgIIIAEoAgwEQCABIAEoAgggASgCDCgCACABKAIMLwEEEBo2AggLIAEoAgghACABQRBqJAAgAAufAgEBfyMAQUBqIgUkACAFIAA3AzAgBSABNwMoIAUgAjYCJCAFIAM3AxggBSAENgIUIAUCfyAFKQMYQhBUBEAgBSgCFEESQQAQFEEADAELIAUoAiQLNgIEAkAgBSgCBEUEQCAFQn83AzgMAQsCQAJAAkACQAJAIAUoAgQoAggOAwIAAQMLIAUgBSkDMCAFKAIEKQMAfDcDCAwDCyAFIAUpAyggBSgCBCkDAHw3AwgMAgsgBSAFKAIEKQMANwMIDAELIAUoAhRBEkEAEBQgBUJ/NwM4DAELAkAgBSkDCEIAWQRAIAUpAwggBSkDKFgNAQsgBSgCFEESQQAQFCAFQn83AzgMAQsgBSAFKQMINwM4CyAFKQM4IQAgBUFAayQAIAALoAEBAX8jAEEgayIFJAAgBSAANgIYIAUgATYCFCAFIAI7ARIgBSADOgARIAUgBDYCDCAFIAUoAhggBSgCFCAFLwESIAUtABFBAXEgBSgCDBBjIgA2AggCQCAARQRAIAVBADYCHAwBCyAFIAUoAgggBS8BEkEAIAUoAgwQUDYCBCAFKAIIEBUgBSAFKAIENgIcCyAFKAIcIQAgBUEgaiQAIAALpgEBAX8jAEEgayIFJAAgBSAANgIYIAUgATcDECAFIAI2AgwgBSADNgIIIAUgBDYCBCAFIAUoAhggBSkDECAFKAIMQQAQPyIANgIAAkAgAEUEQCAFQX82AhwMAQsgBSgCCARAIAUoAgggBSgCAC8BCEEIdjoAAAsgBSgCBARAIAUoAgQgBSgCACgCRDYCAAsgBUEANgIcCyAFKAIcIQAgBUEgaiQAIAALjQIBAX8jAEEwayIDJAAgAyAANgIoIAMgATsBJiADIAI2AiAgAyADKAIoKAI0IANBHmogAy8BJkGABkEAEGY2AhACQCADKAIQRQ0AIAMvAR5BBUkNAAJAIAMoAhAtAABBAUYNAAwBCyADIAMoAhAgAy8BHq0QKSIANgIUIABFBEAMAQsgAygCFBCXARogAyADKAIUECo2AhggAygCIBCHASADKAIYRgRAIAMgAygCFBAwPQEOIAMgAygCFCADLwEOrRAeIAMvAQ5BgBBBABBQNgIIIAMoAggEQCADKAIgECQgAyADKAIINgIgCwsgAygCFBAWCyADIAMoAiA2AiwgAygCLCEAIANBMGokACAAC9oXAgF/AX4jAEGAAWsiBSQAIAUgADYCdCAFIAE2AnAgBSACNgJsIAUgAzoAayAFIAQ2AmQgBSAFKAJsQQBHOgAdIAVBHkEuIAUtAGtBAXEbNgIoAkACQCAFKAJsBEAgBSgCbBAwIAUoAiitVARAIAUoAmRBE0EAEBQgBUJ/NwN4DAMLDAELIAUgBSgCcCAFKAIorSAFQTBqIAUoAmQQQiIANgJsIABFBEAgBUJ/NwN4DAILCyAFKAJsQgQQHiEAQfESQfYSIAUtAGtBAXEbKAAAIAAoAABHBEAgBSgCZEETQQAQFCAFLQAdQQFxRQRAIAUoAmwQFgsgBUJ/NwN4DAELIAUoAnQQUwJAIAUtAGtBAXFFBEAgBSgCbBAdIQAgBSgCdCAAOwEIDAELIAUoAnRBADsBCAsgBSgCbBAdIQAgBSgCdCAAOwEKIAUoAmwQHSEAIAUoAnQgADsBDCAFKAJsEB1B//8DcSEAIAUoAnQgADYCECAFIAUoAmwQHTsBLiAFIAUoAmwQHTsBLCAFLwEuIQEgBS8BLCECIwBBMGsiACQAIAAgATsBLiAAIAI7ASwgAEIANwIAIABBADYCKCAAQgA3AiAgAEIANwIYIABCADcCECAAQgA3AgggAEEANgIgIAAgAC8BLEEJdkHQAGo2AhQgACAALwEsQQV2QQ9xQQFrNgIQIAAgAC8BLEEfcTYCDCAAIAAvAS5BC3Y2AgggACAALwEuQQV2QT9xNgIEIAAgAC8BLkEBdEE+cTYCACAAEBMhASAAQTBqJAAgASEAIAUoAnQgADYCFCAFKAJsECohACAFKAJ0IAA2AhggBSgCbBAqrSEGIAUoAnQgBjcDICAFKAJsECqtIQYgBSgCdCAGNwMoIAUgBSgCbBAdOwEiIAUgBSgCbBAdOwEeAkAgBS0Aa0EBcQRAIAVBADsBICAFKAJ0QQA2AjwgBSgCdEEAOwFAIAUoAnRBADYCRCAFKAJ0QgA3A0gMAQsgBSAFKAJsEB07ASAgBSgCbBAdQf//A3EhACAFKAJ0IAA2AjwgBSgCbBAdIQAgBSgCdCAAOwFAIAUoAmwQKiEAIAUoAnQgADYCRCAFKAJsECqtIQYgBSgCdCAGNwNICwJ/IwBBEGsiACAFKAJsNgIMIAAoAgwtAABBAXFFCwRAIAUoAmRBFEEAEBQgBS0AHUEBcUUEQCAFKAJsEBYLIAVCfzcDeAwBCwJAIAUoAnQvAQxBAXEEQCAFKAJ0LwEMQcAAcQRAIAUoAnRB//8DOwFSDAILIAUoAnRBATsBUgwBCyAFKAJ0QQA7AVILIAUoAnRBADYCMCAFKAJ0QQA2AjQgBSgCdEEANgI4IAUgBS8BICAFLwEiIAUvAR5qajYCJAJAIAUtAB1BAXEEQCAFKAJsEDAgBSgCJK1UBEAgBSgCZEEVQQAQFCAFQn83A3gMAwsMAQsgBSgCbBAWIAUgBSgCcCAFKAIkrUEAIAUoAmQQQiIANgJsIABFBEAgBUJ/NwN4DAILCyAFLwEiBEAgBSgCbCAFKAJwIAUvASJBASAFKAJkEIkBIQAgBSgCdCAANgIwIAUoAnQoAjBFBEACfyMAQRBrIgAgBSgCZDYCDCAAKAIMKAIAQRFGCwRAIAUoAmRBFUEAEBQLIAUtAB1BAXFFBEAgBSgCbBAWCyAFQn83A3gMAgsgBSgCdC8BDEGAEHEEQCAFKAJ0KAIwQQIQOkEFRgRAIAUoAmRBFUEAEBQgBS0AHUEBcUUEQCAFKAJsEBYLIAVCfzcDeAwDCwsLIAUvAR4EQCAFIAUoAmwgBSgCcCAFLwEeQQAgBSgCZBBjNgIYIAUoAhhFBEAgBS0AHUEBcUUEQCAFKAJsEBYLIAVCfzcDeAwCCyAFKAIYIAUvAR5BgAJBgAQgBS0Aa0EBcRsgBSgCdEE0aiAFKAJkEJQBQQFxRQRAIAUoAhgQFSAFLQAdQQFxRQRAIAUoAmwQFgsgBUJ/NwN4DAILIAUoAhgQFSAFLQBrQQFxBEAgBSgCdEEBOgAECwsgBS8BIARAIAUoAmwgBSgCcCAFLwEgQQAgBSgCZBCJASEAIAUoAnQgADYCOCAFKAJ0KAI4RQRAIAUtAB1BAXFFBEAgBSgCbBAWCyAFQn83A3gMAgsgBSgCdC8BDEGAEHEEQCAFKAJ0KAI4QQIQOkEFRgRAIAUoAmRBFUEAEBQgBS0AHUEBcUUEQCAFKAJsEBYLIAVCfzcDeAwDCwsLIAUoAnRB9eABIAUoAnQoAjAQiwEhACAFKAJ0IAA2AjAgBSgCdEH1xgEgBSgCdCgCOBCLASEAIAUoAnQgADYCOAJAAkAgBSgCdCkDKEL/////D1ENACAFKAJ0KQMgQv////8PUQ0AIAUoAnQpA0hC/////w9SDQELIAUgBSgCdCgCNCAFQRZqQQFBgAJBgAQgBS0Aa0EBcRsgBSgCZBBmNgIMIAUoAgxFBEAgBS0AHUEBcUUEQCAFKAJsEBYLIAVCfzcDeAwCCyAFIAUoAgwgBS8BFq0QKSIANgIQIABFBEAgBSgCZEEOQQAQFCAFLQAdQQFxRQRAIAUoAmwQFgsgBUJ/NwN4DAILAkAgBSgCdCkDKEL/////D1EEQCAFKAIQEDEhBiAFKAJ0IAY3AygMAQsgBS0Aa0EBcQRAIAUoAhAhASMAQSBrIgAkACAAIAE2AhggAEIINwMQIAAgACgCGCkDECAAKQMQfDcDCAJAIAApAwggACgCGCkDEFQEQCAAKAIYQQA6AAAgAEF/NgIcDAELIAAgACgCGCAAKQMIECw2AhwLIAAoAhwaIABBIGokAAsLIAUoAnQpAyBC/////w9RBEAgBSgCEBAxIQYgBSgCdCAGNwMgCyAFLQBrQQFxRQRAIAUoAnQpA0hC/////w9RBEAgBSgCEBAxIQYgBSgCdCAGNwNICyAFKAJ0KAI8Qf//A0YEQCAFKAIQECohACAFKAJ0IAA2AjwLCyAFKAIQEEdBAXFFBEAgBSgCZEEVQQAQFCAFKAIQEBYgBS0AHUEBcUUEQCAFKAJsEBYLIAVCfzcDeAwCCyAFKAIQEBYLAn8jAEEQayIAIAUoAmw2AgwgACgCDC0AAEEBcUULBEAgBSgCZEEUQQAQFCAFLQAdQQFxRQRAIAUoAmwQFgsgBUJ/NwN4DAELIAUtAB1BAXFFBEAgBSgCbBAWCyAFKAJ0KQNIQv///////////wBWBEAgBSgCZEEEQRYQFCAFQn83A3gMAQsCfyAFKAJ0IQEgBSgCZCECIwBBIGsiACQAIAAgATYCGCAAIAI2AhQCQCAAKAIYKAIQQeMARwRAIABBAToAHwwBCyAAIAAoAhgoAjQgAEESakGBsgJBgAZBABBmNgIIAkAgACgCCARAIAAvARJBB08NAQsgACgCFEEVQQAQFCAAQQA6AB8MAQsgACAAKAIIIAAvARKtECkiATYCDCABRQRAIAAoAhRBFEEAEBQgAEEAOgAfDAELIABBAToABwJAAkACQCAAKAIMEB1BAWsOAgIAAQsgACgCGCkDKEIUVARAIABBADoABwsMAQsgACgCFEEYQQAQFCAAKAIMEBYgAEEAOgAfDAELIAAoAgxCAhAeLwAAQcGKAUcEQCAAKAIUQRhBABAUIAAoAgwQFiAAQQA6AB8MAQsCQAJAAkACQAJAIAAoAgwQlwFBAWsOAwABAgMLIABBgQI7AQQMAwsgAEGCAjsBBAwCCyAAQYMCOwEEDAELIAAoAhRBGEEAEBQgACgCDBAWIABBADoAHwwBCyAALwESQQdHBEAgACgCFEEVQQAQFCAAKAIMEBYgAEEAOgAfDAELIAAoAhggAC0AB0EBcToABiAAKAIYIAAvAQQ7AVIgACgCDBAdQf//A3EhASAAKAIYIAE2AhAgACgCDBAWIABBAToAHwsgAC0AH0EBcSEBIABBIGokACABQQFxRQsEQCAFQn83A3gMAQsgBSgCdCgCNBCTASEAIAUoAnQgADYCNCAFIAUoAiggBSgCJGqtNwN4CyAFKQN4IQYgBUGAAWokACAGC80BAQF/IwBBEGsiAyQAIAMgADYCDCADIAE2AgggAyACNgIEIAMgA0EMakG4mwEQEjYCAAJAIAMoAgBFBEAgAygCBEEhOwEAIAMoAghBADsBAAwBCyADKAIAKAIUQdAASARAIAMoAgBB0AA2AhQLIAMoAgQgAygCACgCDCADKAIAKAIUQQl0IAMoAgAoAhBBBXRqQeC/AmtqOwEAIAMoAgggAygCACgCCEELdCADKAIAKAIEQQV0aiADKAIAKAIAQQF1ajsBAAsgA0EQaiQAC4MDAQF/IwBBIGsiAyQAIAMgADsBGiADIAE2AhQgAyACNgIQIAMgAygCFCADQQhqQcAAQQAQRiIANgIMAkAgAEUEQCADQQA2AhwMAQsgAygCCEEFakH//wNLBEAgAygCEEESQQAQFCADQQA2AhwMAQsgA0EAIAMoAghBBWqtECkiADYCBCAARQRAIAMoAhBBDkEAEBQgA0EANgIcDAELIAMoAgRBARCWASADKAIEIAMoAhQQhwEQISADKAIEIAMoAgwgAygCCBBBAn8jAEEQayIAIAMoAgQ2AgwgACgCDC0AAEEBcUULBEAgAygCEEEUQQAQFCADKAIEEBYgA0EANgIcDAELIAMgAy8BGgJ/IwBBEGsiACADKAIENgIMAn4gACgCDC0AAEEBcQRAIAAoAgwpAxAMAQtCAAunQf//A3ELAn8jAEEQayIAIAMoAgQ2AgwgACgCDCgCBAtBgAYQVTYCACADKAIEEBYgAyADKAIANgIcCyADKAIcIQAgA0EgaiQAIAALtAIBAX8jAEEwayIDJAAgAyAANgIoIAMgATcDICADIAI2AhwCQCADKQMgUARAIANBAToALwwBCyADIAMoAigpAxAgAykDIHw3AwgCQCADKQMIIAMpAyBaBEAgAykDCEL/////AFgNAQsgAygCHEEOQQAQFCADQQA6AC8MAQsgAyADKAIoKAIAIAMpAwinQQR0EE4iADYCBCAARQRAIAMoAhxBDkEAEBQgA0EAOgAvDAELIAMoAiggAygCBDYCACADIAMoAigpAwg3AxADQCADKQMQIAMpAwhaRQRAIAMoAigoAgAgAykDEKdBBHRqELUBIAMgAykDEEIBfDcDEAwBCwsgAygCKCADKQMIIgE3AxAgAygCKCABNwMIIANBAToALwsgAy0AL0EBcSEAIANBMGokACAAC8wBAQF/IwBBIGsiAiQAIAIgADcDECACIAE2AgwgAkEwEBgiATYCCAJAIAFFBEAgAigCDEEOQQAQFCACQQA2AhwMAQsgAigCCEEANgIAIAIoAghCADcDECACKAIIQgA3AwggAigCCEIANwMgIAIoAghCADcDGCACKAIIQQA2AiggAigCCEEAOgAsIAIoAgggAikDECACKAIMEI8BQQFxRQRAIAIoAggQJSACQQA2AhwMAQsgAiACKAIINgIcCyACKAIcIQEgAkEgaiQAIAEL1gIBAX8jAEEgayIDJAAgAyAANgIYIAMgATYCFCADIAI2AhAgAyADQQxqQgQQKTYCCAJAIAMoAghFBEAgA0F/NgIcDAELA0AgAygCFARAIAMoAhQoAgQgAygCEHFBgAZxBEAgAygCCEIAECwaIAMoAgggAygCFC8BCBAfIAMoAgggAygCFC8BChAfAn8jAEEQayIAIAMoAgg2AgwgACgCDC0AAEEBcUULBEAgAygCGEEIakEUQQAQFCADKAIIEBYgA0F/NgIcDAQLIAMoAhggA0EMakIEEDZBAEgEQCADKAIIEBYgA0F/NgIcDAQLIAMoAhQvAQoEQCADKAIYIAMoAhQoAgwgAygCFC8BCq0QNkEASARAIAMoAggQFiADQX82AhwMBQsLCyADIAMoAhQoAgA2AhQMAQsLIAMoAggQFiADQQA2AhwLIAMoAhwhACADQSBqJAAgAAtoAQF/IwBBEGsiAiAANgIMIAIgATYCCCACQQA7AQYDQCACKAIMBEAgAigCDCgCBCACKAIIcUGABnEEQCACIAIoAgwvAQogAi8BBkEEamo7AQYLIAIgAigCDCgCADYCDAwBCwsgAi8BBgvwAQEBfyMAQRBrIgEkACABIAA2AgwgASABKAIMNgIIIAFBADYCBANAIAEoAgwEQAJAAkAgASgCDC8BCEH1xgFGDQAgASgCDC8BCEH14AFGDQAgASgCDC8BCEGBsgJGDQAgASgCDC8BCEEBRw0BCyABIAEoAgwoAgA2AgAgASgCCCABKAIMRgRAIAEgASgCADYCCAsgASgCDEEANgIAIAEoAgwQIyABKAIEBEAgASgCBCABKAIANgIACyABIAEoAgA2AgwMAgsgASABKAIMNgIEIAEgASgCDCgCADYCDAwBCwsgASgCCCEAIAFBEGokACAAC7IEAQF/IwBBQGoiBSQAIAUgADYCOCAFIAE7ATYgBSACNgIwIAUgAzYCLCAFIAQ2AiggBSAFKAI4IAUvATatECkiADYC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IAEoAhBB//8DRgRAIAEgASgCDDYCEAsgASgCCEH//wNGBEAgASABKAIENgIICwJAIAEoApQBQQRxRQ0AIAEoAgggASgCBEYEQCABKAIQIAEoAgxGDQELIAEoApABQRVBABAUIAEtABdBAXEEQCABKAKkARAWCyABQQA2AqwBDAELAkAgASgCEEUEQCABKAIIRQ0BCyABKAKQAUEBQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABIAEoAqQBEDE3AyggASABKAKkARAxNwMgIAEpAyggASkDIFIEQCABKAKQAUEBQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABIAEoAqQBEDE3AzAgASABKAKkARAxNwOAAQJ/IwBBEGsiBSABKAKkATYCDCAFKAIMLQAAQQFxRQsEQCABKAKQAUEUQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABLQAXQQFxBEAgASgCpAEQFgsCQCABKQOAAUL///////////8AWARAIAEpA4ABIAEpA4ABIAEpAzB8WA0BCyABKAKQAUEEQRYQFCABQQA2AqwBDAELIAEpA4ABIAEpAzB8IAEpA5gBIAEpAzh8VgRAIAEoApABQRVBABAUIAFBADYCrAEMAQsCQCABKAKUAUEEcUUNACABKQOAASABKQMwfCABKQOYASABKQM4fFENACABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEpAyggASkDMEIugFYEQCABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEgASkDKCABKAKQARCQASIFNgKMASAFRQRAIAFBADYCrAEMAQsgASgCjAFBAToALCABKAKMASABKQMwNwMYIAEoAowBIAEpA4ABNwMgIAEgASgCjAE2AqwBCyABKAKsASEFIAFBsAFqJAAgACAFNgJQDAELIAAoAmQgACkDMBAsGiAAKAJkIQUgACkDWCEJIAAoAmgoAhQhBiAAKAJUIQcjAEHQAGsiASQAIAEgBTYCSCABIAk3A0AgASAGNgI8IAEgBzYCOAJAIAEoAkgQMEIWVARAIAEoAjhBFUEAEBQgAUEANgJMDAELIwBBEGsiBSABKAJINgIMIAECfiAFKAIMLQAAQQFxBEAgBSgCDCkDEAwBC0IACzcDCCABKAJI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ECADQcgAEBgiADYCDAJAIABFBEAgAygCEEEBQbSbASgCABAUIANBADYCHAwBCyADKAIMIAMoAhA2AgAgAygCDCADLQAbQQFxOgAEIAMoAgwgAygCFDYCCAJAIAMoAgwoAghBAU4EQCADKAIMKAIIQQlMDQELIAMoAgxBCTYCCAsgAygCDEEAOgAMIAMoAgxBADYCMCADKAIMQQA2AjQgAygCDEEANgI4IAMgAygCDDYCHAsgAygCHCEAIANBIGokACAACzgBAX8jAEEQayIBIAA2AgwgASgCDEEANgIAIAEoAgxBADYCBCABKAIMQQA2AgggASgCDEEAOgAMC+MIAQF/IwBBQGoiAiAANgI4IAIgATYCNCACIAIoAjgoAnw2AjAgAiACKAI4KAI4IAIoAjgoAmxqNgIsIAIgAigCOCgCeDYCICACIAIoAjgoApABNgIcIAICfyACKAI4KAJsIAIoAjgoAixBhgJrSwRAIAIoAjgoAmwgAigCOCgCLEGGAmtrDAELQQALNgIYIAIgAigCOCgCQDYCFCACIAIoAjgoAjQ2AhAgAiACKAI4KAI4IAIoAjgoAmxqQYICajYCDCACIAIoAiwgAigCIEEBa2otAAA6AAsgAiACKAIsIAIoAiBqLQAAOgAKIAIoAjgoAnggAigCOCgCjAFPBEAgAiACKAIwQQJ2NgIwCyACKAIcIAIoAjgoAnRLBEAgAiACKAI4KAJ0NgIcCwNAAkAgAiACKAI4KAI4IAIoAjRqNgIoAkAgAigCKCACKAIgai0AACACLQAKRw0AIAIoAiggAigCIEEBa2otAAAgAi0AC0cNACACKAIoLQAAIAIoAiwtAABHDQAgAiACKAIoIgBBAWo2AiggAC0AASACKAIsLQABRwRADAELIAIgAigCLEECajYCLCACIAIoAihBAWo2AigDQCACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AigCf0EAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACKAIsIAIoAgxJC0EBcQ0ACyACQYICIAIoAgwgAigCLGtrNgIkIAIgAigCDEGCAms2AiwgAigCJCACKAIgSgRAIAIoAjggAigCNDYCcCACIAIoAiQ2AiAgAigCJCACKAIcTg0CIAIgAigCLCACKAIgQQFrai0AADoACyACIAIoAiwgAigCIGotAAA6AAoLCyACIAIoAhQgAigCNCACKAIQcUEBdGovAQAiATYCNEEAIQAgASACKAIYSwR/IAIgAigCMEEBayIANgIwIABBAEcFQQALQQFxDQELCwJAIAIoAiAgAigCOCgCdE0EQCACIAIoAiA2AjwMAQsgAiACKAI4KAJ0NgI8CyACKAI8C5IQAQF/IwBBMGsiAiQAIAIgADYCKCACIAE2AiQgAgJ/IAIoAigoAiwgAigCKCgCDEEFa0kEQCACKAIoKAIsDAELIAIoAigoAgxBBWsLNgIgIAJBADYCECACIAIoAigoAgAoAgQ2AgwDQAJAIAJB//8DNgIcIAIgAigCKCgCvC1BKmpBA3U2AhQgAigCKCgCACgCECACKAIUSQ0AIAIgAigCKCgCACgCECACKAIUazYCFCACIAIoAigoAmwgAigCKCgCXGs2AhggAigCHCACKAIYIAIoAigoAgAoAgRqSwRAIAIgAigCGCACKAIoKAIAKAIEajYCHAsgAigCHCACKAIUSwRAIAIgAigCFDYCHAsCQCACKAIcIAIoAiBPDQACQCACKAIcRQRAIAIoAiRBBEcNAQsgAigCJEUNACACKAIcIAIoAhggAigCKCgCACgCBGpGDQELDAELQQAhACACIAIoAiRBBEYEfyACKAIcIAIoAhggAigCKCgCACgCBGpGBUEAC0EBcTYCECACKAIoQQBBACACKAIQEF0gAigCKCgCCCACKAIoKAIUQQRraiACKAIcOgAAIAIoAigoAgggAigCKCgCFEEDa2ogAigCHEEIdjoAACACKAIoKAIIIAIoAigoAhRBAmtqIAIoAhxBf3M6AAAgAigCKCgCCCACKAIoKAIUQQFraiACKAIcQX9zQQh2OgAAIAIoAigoAgAQHCACKAIYBEAgAigCGCACKAIcSwRAIAIgAigCHDYCGAsgAigCKCgCACgCDCACKAIoKAI4IAIoAigoAlxqIAIoAhgQGRogAigCKCgCACIAIAIoAhggACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCGGs2AhAgAigCKCgCACIAIAIoAhggACgCFGo2AhQgAigCKCIAIAIoAhggACgCXGo2AlwgAiACKAIcIAIoAhhrNgIcCyACKAIcBEAgAigCKCgCACACKAIoKAIAKAIMIAIoAhwQdhogAigCKCgCACIAIAIoAhwgACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCHGs2AhAgAigCKCgCACIAIAIoAhwgACgCFGo2AhQLIAIoAhBFDQELCyACIAIoAgwgAigCKCgCACgCBGs2AgwgAigCDARAAkAgAigCDCACKAIoKAIsTwRAIAIoAihBAjYCsC0gAigCKCgCOCACKAIoKAIAKAIAIAIoAigoAixrIAIoAigoAiwQGRogAigCKCACKAIoKAIsNgJsDAELIAIoAgwgAigCKCgCPCACKAIoKAJsa08EQCACKAIoIgAgACgCbCACKAIoKAIsazYCbCACKAIoKAI4IAIoAigoAjggAigCKCgCLGogAigCKCgCbBAZGiACKAIoKAKwLUECSQRAIAIoAigiACAAKAKwLUEBajYCsC0LCyACKAIoKAI4IAIoAigoAmxqIAIoAigoAgAoAgAgAigCDGsgAigCDBAZGiACKAIoIgAgAigCDCAAKAJsajYCbAsgAigCKCACKAIoKAJsNgJcIAIoAigiAQJ/IAIoAgwgAigCKCgCLCACKAIoKAK0LWtLBEAgAigCKCgCLCACKAIoKAK0LWsMAQsgAigCDAsgASgCtC1qNgK0LQsgAigCKCgCwC0gAigCKCgCbEkEQCACKAIoIAIoAigoAmw2AsAtCwJAIAIoAhAEQCACQQM2AiwMAQsCQCACKAIkRQ0AIAIoAiRBBEYNACACKAIoKAIAKAIEDQAgAigCKCgCbCACKAIoKAJcRw0AIAJBATYCLAwBCyACIAIoAigoAjwgAigCKCgCbGtBAWs2AhQCQCACKAIoKAIAKAIEIAIoAhRNDQAgAigCKCgCXCACKAIoKAIsSA0AIAIoAigiACAAKAJcIAIoAigoAixrNgJcIAIoAigiACAAKAJsIAIoAigoAixrNgJsIAIoAigoAjggAigCKCgCOCACKAIoKAIsaiACKAIoKAJsEBkaIAIoAigoArAtQQJJBEAgAigCKCIAIAAoArAtQQFqNgKwLQsgAiACKAIoKAIsIAIoAhRqNgIUCyACKAIUIAIoAigoAgAoAgRLBEAgAiACKAIoKAIAKAIENgIUCyACKAIUBEAgAigCKCgCACACKAIoKAI4IAIoAigoAmxqIAIoAhQQdhogAigCKCIAIAIoAhQgACgCbGo2AmwLIAIoAigoAsAtIAIoAigoAmxJBEAgAigCKCACKAIoKAJsNgLALQsgAiACKAIoKAK8LUEqakEDdTYCFCACIAIoAigoAgwgAigCFGtB//8DSwR/Qf//AwUgAigCKCgCDCACKAIUaws2AhQgAgJ/IAIoAhQgAigCKCgCLEsEQCACKAIoKAIsDAELIAIoAhQLNgIgIAIgAigCKCgCbCACKAIoKAJcazYCGAJAIAIoAhggAigCIEkEQCACKAIYRQRAIAIoAiRBBEcNAgsgAigCJEUNASACKAIoKAIAKAIEDQEgAigCGCACKAIUSw0BCyACAn8gAigCGCACKAIUSwRAIAIoAhQMAQsgAigCGAs2AhwgAgJ/QQAgAigCJEEERw0AGkEAIAIoAigoAgAoAgQNABogAigCHCACKAIYRgtBAXE2AhAgAigCKCACKAIoKAI4IAIoAigoAlxqIAIoAhwgAigCEBBdIAIoAigiACACKAIcIAAoAlxqNgJcIAIoAigoAgAQHAsgAkECQQAgAigCEBs2AiwLIAIoAiwhACACQTBqJAAgAAuyAgEBfyMAQRBrIgEkACABIAA2AggCQCABKAIIEHgEQCABQX42AgwMAQsgASABKAIIKAIcKAIENgIEIAEoAggoAhwoAggEQCABKAIIKAIoIAEoAggoAhwoAgggASgCCCgCJBEEAAsgASgCCCgCHCgCRARAIAEoAggoAiggASgCCCgCHCgCRCABKAIIKAIkEQQACyABKAIIKAIc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DQAgAiEAIANBAWsiAw0ACwsgBCgCFBogASACNgKgAQwCCyMAQRBrIgAgASgCqAEoAgQ2AgwgAUEAIAAoAgxrQQJ0QajZAGooAgA2AqABDAELIAFBADYCoAELCwJAIAEoAqABRQRAIAEgASgCpAE2AqwBDAELIAEgASgCoAEQLgJ/IAEoAqQBBEAgASgCpAEQLkECagwBC0EAC2pBAWoQGCIANgIcIABFBEAgAUG4EygCADYCrAEMAQsgASgCHCEAAn8gASgCpAEEQCABKAKkAQwBC0H6EgshA0HfEkH6EiABKAKkARshAiABIAEoAqABNgIIIAEgAjYCBCABIAM2AgAgAEG+CiABEG8gASgCqAEgASgCHDYCCCABIAEoAhw2AqwBCyABKAKsASEAIAFBsAFqJAAgAAsIAEEBQTgQfwszAQF/IAAoAhQiAyABIAIgACgCECADayIBIAEgAksbIgEQGRogACAAKAIUIAFqNgIUIAILjwUCBn4BfyABIAEoAgBBD2pBcHEiAUEQajYCACAAAnwgASkDACEDIAEpAwghBiMAQSBrIggkAAJAIAZC////////////AIMiBEKAgICAgIDAgDx9IARCgICAgICAwP/DAH1UBEAgBkIEhiADQjyIhCEEIANC//////////8PgyIDQoGAgICAgICACFoEQCAEQoGAgICAgICAwAB8IQIMAgsgBEKAgICAgICAgEB9IQIgA0KAgICAgICAgAiFQgBSDQEgAiAEQgGDfCECDAELIANQIARCgICAgICAwP//AFQgBEKAgICAgIDA//8AURtFBEAgBkIEhiADQjyIhEL/////////A4NCgICAgICAgPz/AIQhAgwBC0KAgICAgICA+P8AIQIgBEL///////+//8MAVg0AQgAhAiAEQjCIpyIAQZH3AEkNACADIQIgBkL///////8/g0KAgICAgIDAAIQiBSEHAkAgAEGB9wBrIgFBwABxBEAgAiABQUBqrYYhB0IAIQIMAQsgAUUNACAHIAGtIgSGIAJBwAAgAWutiIQhByACIASGIQILIAggAjcDECAIIAc3AxgCQEGB+AAgAGsiAEHAAHEEQCAFIABBQGqtiCEDQgAhBQwBCyAARQ0AIAVBwAAgAGuthiADIACtIgKIhCEDIAUgAoghBQsgCCADNwMAIAggBTcDCCAIKQMIQgSGIAgpAwAiA0I8iIQhAiAIKQMQIAgpAxiEQgBSrSADQv//////////D4OEIgNCgYCAgICAgIAIWgRAIAJCAXwhAgwBCyADQoCAgICAgICACIVCAFINACACQgGDIAJ8IQILIAhBIGokACACIAZCgICAgICAgICAf4OEvws5AwALrRcDEn8CfgF8IwBBsARrIgkkACAJQQA2AiwCQCABvSIYQn9XBEBBASESQa4IIRMgAZoiAb0hGAwBCyAEQYAQcQRAQQEhEkGxCCETDAELQbQIQa8IIARBAXEiEhshEyASRSEXCwJAIBhCgICAgICAgPj/AINCgICAgICAgPj/AFEEQCAAQSAgAiASQQNqIg0gBEH//3txECYgACATIBIQIiAAQeQLQbUSIAVBIHEiAxtBjw1BuRIgAxsgASABYhtBAxAiDAELIAlBEGohEAJAAn8CQCABIAlBLGoQqQEiASABoCIBRAAAAAAAAAAAYgRAIAkgCSgCLCIGQQFrNgIsIAVBIHIiFEHhAEcNAQwDCyAFQSByIhRB4QBGDQIgCSgCLCELQQYgAyADQQBIGwwBCyAJIAZBHWsiCzYCLCABRAAAAAAAALBBoiEBQQYgAyADQQBIGwshCiAJQTBqIAlB0AJqIAtBAEgbIg4hBwNAIAcCfyABRAAAAAAAAPBBYyABRAAAAAAAAAAAZnEEQCABqwwBC0EACyIDNgIAIAdBBGohByABIAO4oUQAAAAAZc3NQaIiAUQAAAAAAAAAAGINAAsCQCALQQFIBEAgCyEDIAchBiAOIQgMAQsgDiEIIAshAwNAIANBHSADQR1IGyEMAkAgB0EEayIGIAhJDQAgDK0hGUIAIRgDQCAGIAY1AgAgGYYgGHwiGCAYQoCU69wDgCIYQoCU69wDfn0+AgAgCCAGQQRrIgZNBEAgGEL/////D4MhGAwBCwsgGKciA0UNACAIQQRrIgggAzYCAAsDQCAIIAciBkkEQCAGQQRrIgcoAgBFDQELCyAJIAkoAiwgDGsiAzYCLCAGIQcgA0EASg0ACwsgCkEZakEJbSEHIANBf0wEQCAHQQFqIQ0gFEHmAEYhFQNAQQlBACADayADQXdIGyEWAkAgBiAISwRAQYCU69wDIBZ2IQ9BfyAWdEF/cyERQQAhAyAIIQcDQCAHIAMgBygCACIMIBZ2ajYCACAMIBFxIA9sIQMgB0EEaiIHIAZJDQALIAggCEEEaiAIKAIAGyEIIANFDQEgBiADNgIAIAZBBGohBgwBCyAIIAhBBGogCCgCABshCAsgCSAJKAIsIBZqIgM2AiwgDiAIIBUbIgcgDUECdGogBiAGIAdrQQJ1IA1KGyEGIANBAEgNAAsLQQAhBwJAIAYgCE0NACAOIAhrQQJ1QQlsIQcgCCgCACIMQQpJDQBB5AAhAwNAIAdBAWohByADIAxLDQEgA0EKbCEDDAALAAsgCkEAIAcgFEHmAEYbayAUQecARiAKQQBHcWsiAyAGIA5rQQJ1QQlsQQlrSARAIANBgMgAaiIRQQltIgxBAnQgCUEwakEEciAJQdQCaiALQQBIG2pBgCBrIQ1BCiEDAkAgESAMQQlsayIMQQdKDQBB5AAhAwNAIAxBAWoiDEEIRg0BIANBCmwhAwwACwALAkAgDSgCACIRIBEgA24iDCADbGsiD0EBIA1BBGoiCyAGRhtFDQBEAAAAAAAA4D9EAAAAAAAA8D9EAAAAAAAA+D8gBiALRhtEAAAAAAAA+D8gDyADQQF2IgtGGyALIA9LGyEaRAEAAAAAAEBDRAAAAAAAAEBDIAxBAXEbIQECQCAXDQAgEy0AAEEtRw0AIBqaIRogAZohAQsgDSARIA9rIgs2AgAgASAaoCABYQ0AIA0gAyALaiIDNgIAIANBgJTr3ANPBEADQCANQQA2AgAgCCANQQRrIg1LBEAgCEEEayIIQQA2AgALIA0gDSgCAEEBaiIDNgIAIANB/5Pr3ANLDQALCyAOIAhrQQJ1QQlsIQcgCCgCACILQQpJDQBB5AAhAwNAIAdBAWohByADIAtLDQEgA0EKbCEDDAALAAsgDUEEaiIDIAYgAyAGSRshBgsDQCAGIgsgCE0iDEUEQCALQQRrIgYoAgBFDQELCwJAIBRB5wBHBEAgBEEIcSEPDAELIAdBf3NBfyAKQQEgChsiBiAHSiAHQXtKcSIDGyAGaiEKQX9BfiADGyAFaiEFIARBCHEiDw0AQXchBgJAIAwNACALQQRrKAIAIgNFDQBBACEGIANBCnANAEEAIQxB5AAhBgNAIAMgBnBFBEAgDEEBaiEMIAZBCmwhBgwBCwsgDEF/cyEGCyALIA5rQQJ1QQlsIQMgBUFfcUHGAEYEQEEAIQ8gCiADIAZqQQlrIgNBACADQQBKGyIDIAMgCkobIQoMAQtBACEPIAogAyAHaiAGakEJayIDQQAgA0EAShsiAyADIApKGyEKCyAKIA9yQQBHIREgAEEgIAIgBUFfcSIMQcYARgR/IAdBACAHQQBKGwUgECAHIAdBH3UiA2ogA3OtIBAQRCIGa0EBTARAA0AgBkEBayIGQTA6AAAgECAGa0ECSA0ACwsgBkECayIVIAU6AAAgBkEBa0EtQSsgB0EASBs6AAAgECAVawsgCiASaiARampBAWoiDSAEECYgACATIBIQIiAAQTAgAiANIARBgIAEcxAmAkACQAJAIAxBxgBGBEAgCUEQakEIciEDIAlBEGpBCXIhByAOIAggCCAOSxsiBSEIA0AgCDUCACAHEEQhBgJAIAUgCEcEQCAGIAlBEGpNDQEDQCAGQQFrIgZBMDoAACAGIAlBEGpLDQALDAELIAYgB0cNACAJQTA6ABggAyEGCyAAIAYgByAGaxAiIAhBBGoiCCAOTQ0AC0EAIQYgEUUNAiAAQdYSQQEQIiAIIAtPDQEgCkEBSA0BA0AgCDUCACAHEEQiBiAJQRBqSwRAA0AgBkEBayIGQTA6AAAgBiAJQRBqSw0ACwsgACAGIApBCSAKQQlIGxAiIApBCWshBiAIQQRqIgggC08NAyAKQQlKIQMgBiEKIAMNAAsMAgsCQCAKQQBIDQAgCyAIQQRqIAggC0kbIQUgCUEQakEJciELIAlBEGpBCHIhAyAIIQcDQCALIAc1AgAgCxBEIgZGBEAgCUEwOgAYIAMhBgsCQCAHIAhHBEAgBiAJQRBqTQ0BA0AgBkEBayIGQTA6AAAgBiAJQRBqSw0ACwwBCyAAIAZBARAiIAZBAWohBkEAIApBAEwgDxsNACAAQdYSQQEQIgsgACAGIAsgBmsiBiAKIAYgCkgbECIgCiAGayEKIAdBBGoiByAFTw0BIApBf0oNAAsLIABBMCAKQRJqQRJBABAmIAAgFSAQIBVrECIMAgsgCiEGCyAAQTAgBkEJakEJQQAQJgsMAQsgE0EJaiATIAVBIHEiCxshCgJAIANBC0sNAEEMIANrIgZFDQBEAAAAAAAAIEAhGgNAIBpEAAAAAAAAMECiIRogBkEBayIGDQALIAotAABBLUYEQCAaIAGaIBqhoJohAQwBCyABIBqgIBqhIQELIBAgCSgCLCIGIAZBH3UiBmogBnOtIBAQRCIGRgRAIAlBMDoADyAJQQ9qIQYLIBJBAnIhDiAJKAIsIQcgBkECayIMIAVBD2o6AAAgBkEBa0EtQSsgB0EASBs6AAAgBEEIcSEHIAlBEGohCANAIAgiBQJ/IAGZRAAAAAAAAOBBYwRAIAGqDAELQYCAgIB4CyIGQYCHAWotAAAgC3I6AAAgASAGt6FEAAAAAAAAMECiIQECQCAFQQFqIgggCUEQamtBAUcNAAJAIAFEAAAAAAAAAABiDQAgA0EASg0AIAdFDQELIAVBLjoAASAFQQJqIQgLIAFEAAAAAAAAAABiDQALIABBICACIA4CfwJAIANFDQAgCCAJa0ESayADTg0AIAMgEGogDGtBAmoMAQsgECAJQRBqIAxqayAIagsiA2oiDSAEECYgACAKIA4QIiAAQTAgAiANIARBgIAEcxAmIAAgCUEQaiAIIAlBEGprIgUQIiAAQTAgAyAFIBAgDGsiA2prQQBBABAmIAAgDCADECILIABBICACIA0gBEGAwABzECYgCUGwBGokACACIA0gAiANShsLBgBB4J8BCwYAQdyfAQsGAEHUnwELGAEBfyMAQRBrIgEgADYCDCABKAIMQQRqCxgBAX8jAEEQayIBIAA2AgwgASgCDEEIagtpAQF/IwBBEGsiASQAIAEgADYCDCABKAIMKAIUBEAgASgCDCgCFBAbCyABQQA2AgggASgCDCgCBARAIAEgASgCDCgCBDYCCAsgASgCDEEEahA4IAEoAgwQFSABKAIIIQAgAUEQaiQAIAALqQEBA38CQCAALQAAIgJFDQADQCABLQAAIgRFBEAgAiEDDAILAkAgAiAERg0AIAJBIHIgAiACQcEAa0EaSRsgAS0AACICQSByIAIgAkHBAGtBGkkbRg0AIAAtAAAhAwwCCyABQQFqIQEgAC0AASECIABBAWohACACDQALCyADQf8BcSIAQSByIAAgAEHBAGtBGkkbIAEtAAAiAEEgciAAIABBwQBrQRpJG2sLiAEBAX8jAEEQayICJAAgAiAANgIMIAIgATYCCCMAQRBrIgAgAigCDDYCDCAAKAIMQQA2AgAgACgCDEEANgIEIAAoAgxBADYCCCACKAIMIAIoAgg2AgACQCACKAIMEKwBQQFGBEAgAigCDEG0mwEoAgA2AgQMAQsgAigCDEEANgIECyACQRBqJAAL2AkBAX8jAEGwAWsiBSQAIAUgADYCpAEgBSABNgKgASAFIAI2ApwBIAUgAzcDkAEgBSAENgKMASAFIAUoAqABNgKIAQJAAkACQAJAAkACQAJAAkACQAJAAkAgBSgCjAEODwABAgMEBQcICQkJCQkJBgkLIAUoAogBQgA3AyAgBUIANwOoAQwJCyAFIAUoAqQBIAUoApwBIAUpA5ABECsiAzcDgAEgA0IAUwRAIAUoAogBQQhqIAUoAqQBEBcgBUJ/NwOoAQwJCwJAIAUpA4ABUARAIAUoAogBKQMoIAUoAogBKQMgUQRAIAUoAogBQQE2AgQgBSgCiAEgBSgCiAEpAyA3AxggBSgCiAEoAgAEQCAFKAKkASAFQcgAahA5QQBIBEAgBSgCiAFBCGogBSgCpAEQFyAFQn83A6gBDA0LAkAgBSkDSEIgg1ANACAFKAJ0IAUoAogBKAIwRg0AIAUoAogBQQhqQQdBABAUIAVCfzcDqAEMDQsCQCAFKQNIQgSDUA0AIAUpA2AgBSgCiAEpAxhRDQAgBSgCiAFBCGpBFUEAEBQgBUJ/NwOoAQwNCwsLDAELAkAgBSgCiAEoAgQNACAFKAKIASkDICAFKAKIASkDKFYNACAFIAUoAogBKQMoIAUoAogBKQMgfTcDQANAIAUpA0AgBSkDgAFUBEAgBSAFKQOAASAFKQNAfUL/////D1YEfkL/////DwUgBSkDgAEgBSkDQH0LNwM4IAUoAogBKAIwIAUoApwBIAUpA0CnaiAFKQM4pxAaIQAgBSgCiAEgADYCMCAFKAKIASIAIAUpAzggACkDKHw3AyggBSAFKQM4IAUpA0B8NwNADAELCwsLIAUoAogBIgAgBSkDgAEgACkDIHw3AyAgBSAFKQOAATcDqAEMCAsgBUIANwOoAQwHCyAFIAUoApwBNgI0IAUoAogBKAIEBEAgBSgCNCAFKAKIASkDGDcDGCAFKAI0IAUoAogBKAIwNgIsIAUoAjQgBSgCiAEpAxg3AyAgBSgCNEEAOwEwIAUoAjRBADsBMiAFKAI0IgAgACkDAELsAYQ3AwALIAVCADcDqAEMBgsgBSAFKAKIAUEIaiAFKAKcASAFKQOQARBDNwOoAQwFCyAFKAKIARAVIAVCADcDqAEMBAsjAEEQayIAIAUoAqQBNgIMIAUgACgCDCkDGDcDKCAFKQMoQgBTBEAgBSgCiAFBCGogBSgCpAEQFyAFQn83A6gBDAQLIAUpAyghAyAFQX82AhggBUEQNgIUIAVBDzYCECAFQQ02AgwgBUEMNgIIIAVBCjYCBCAFQQk2AgAgBUEIIAUQNEJ/hSADgzcDqAEMAwsgBQJ/IAUpA5ABQhBUBEAgBSgCiAFBCGpBEkEAEBRBAAwBCyAFKAKcAQs2AhwgBSgCHEUEQCAFQn83A6gBDAMLAkAgBSgCpAEgBSgCHCkDACAFKAIcKAIIECdBAE4EQCAFIAUoAqQBEEkiAzcDICADQgBZDQELIAUoAogBQQhqIAUoAqQBEBcgBUJ/NwOoAQwDCyAFKAKIASAFKQMgNwMgIAVCADcDqAEMAgsgBSAFKAKIASkDIDcDqAEMAQsgBSgCiAFBCGpBHEEAEBQgBUJ/NwOoAQsgBSkDqAEhAyAFQbABaiQAIAMLnAwBAX8jAEEwayIFJAAgBSAANgIkIAUgATYCICAFIAI2AhwgBSADNwMQIAUgBDYCDCAFIAUoAiA2AggCQAJAAkACQAJAAkACQAJAAkACQCAFKAIMDhEAAQIDBQYICAgICAgICAcIBAgLIAUoAghCADcDGCAFKAIIQQA6AAwgBSgCCEEAOgANIAUoAghBADoADyAFKAIIQn83AyAgBSgCCCgCrEAgBSgCCCgCqEAoAgwRAABBAXFFBEAgBUJ/NwMoDAkLIAVCADcDKAwICyAFKAIkIQEgBSgCCCECIAUoAhwhBCAFKQMQIQMjAEFAaiIAJAAgACABNgI0IAAgAjYCMCAAIAQ2AiwgACADNwMgAkACfyMAQRBrIgEgACgCMDYCDCABKAIMKAIACwRAIABCfzcDOAwBCwJAIAApAyBQRQRAIAAoAjAtAA1BAXFFDQELIABCADcDOAwBCyAAQgA3AwggAEEAOgAbA0AgAC0AG0EBcQR/QQAFIAApAwggACkDIFQLQQFxBEAgACAAKQMgIAApAwh9NwMAIAAgACgCMCgCrEAgACgCLCAAKQMIp2ogACAAKAIwKAKoQCgCHBEBADYCHCAAKAIcQQJHBEAgACAAKQMAIAApAwh8NwMICwJAAkACQAJAIAAoAhxBAWsOAwACAQMLIAAoAjBBAToADQJAIAAoAjAtAAxBAXENAAsgACgCMCkDIEIAUwRAIAAoAjBBFEEAEBQgAEEBOgAbDAMLAkAgACgCMC0ADkEBcUUNACAAKAIwKQMgIAApAwhWDQAgACgCMEEBOgAPIAAoAjAgACgCMCkDIDcDGCAAKAIsIAAoAjBBKGogACgCMCkDGKcQGRogACAAKAIwKQMYNwM4DAYLIABBAToAGwwCCyAAKAIwLQAMQQFxBEAgAEEBOgAbDAILIAAgACgCNCAAKAIwQShqQoDAABArIgM3AxAgA0IAUwRAIAAoAjAgACgCNBAXIABBAToAGwwCCwJAIAApAxBQBEAgACgCMEEBOgAMIAAoAjAoAqxAIAAoAjAoAqhAKAIYEQIAIAAoAjApAyBCAFMEQCAAKAIwQgA3AyALDAELAkAgACgCMCkDIEIAWQRAIAAoAjBBADoADgwBCyAAKAIwIAApAxA3AyALIAAoAjAoAqxAIAAoAjBBKGogACkDECAAKAIwKAKoQCgCFBEQABoLDAELAn8jAEEQayIBIAAoAjA2AgwgASgCDCgCAEULBEAgACgCMEEUQQAQFAsgAEEBOgAbCwwBCwsgACkDCEIAUgRAIAAoAjBBADoADiAAKAIwIgEgACkDCCABKQMYfDcDGCAAIAApAwg3AzgMAQsgAEF/QQACfyMAQRBrIgEgACgCMDYCDCABKAIMKAIACxusNwM4CyAAKQM4IQMgAEFAayQAIAUgAzcDKAwHCyAFKAIIKAKsQCAFKAIIKAKoQCgCEBEAAEEBcUUEQCAFQn83AygMBwsgBUIANwMoDAYLIAUgBSgCHDYCBAJAIAUoAggtABBBAXEEQCAFKAIILQANQQFxBEAgBSgCBCAFKAIILQAPQQFxBH9BAAUCfwJAIAUoAggoAhRBf0cEQCAFKAIIKAIUQX5HDQELQQgMAQsgBSgCCCgCFAtB//8DcQs7ATAgBSgCBCAFKAIIKQMYNwMgIAUoAgQiACAAKQMAQsgAhDcDAAwCCyAFKAIEIgAgACkDAEK3////D4M3AwAMAQsgBSgCBEEAOwEwIAUoAgQiACAAKQMAQsAAhDcDAAJAIAUoAggtAA1BAXEEQCAFKAIEIAUoAggpAxg3AxggBSgCBCIAIAApAwBCBIQ3AwAMAQsgBSgCBCIAIAApAwBC+////w+DNwMACwsgBUIANwMoDAULIAUgBSgCCC0AD0EBcQR/QQAFIAUoAggoAqxAIAUoAggoAqhAKAIIEQAAC6w3AygMBAsgBSAFKAIIIAUoAhwgBSkDEBBDNwMoDAMLIAUoAggQsQEgBUIANwMoDAILIAVBfzYCACAFQRAgBRA0Qj+ENwMoDAELIAUoAghBFEEAEBQgBUJ/NwMoCyAFKQMoIQMgBUEwaiQAIAMLPAEBfyMAQRBrIgMkACADIAA7AQ4gAyABNgIIIAMgAjYCBEEAIAMoAgggAygCBBC0ASEAIANBEGokACAAC46nAQEEfyMAQSBrIgUkACAFIAA2AhggBSABNgIUIAUgAjYCECAFIAUoAhg2AgwgBSgCDCAFKAIQKQMAQv////8PVgR+Qv////8PBSAFKAIQKQMACz4CICAFKAIMIAUoAhQ2AhwCQCAFKAIMLQAEQQFxBEAgBSgCDEEQaiEBQQRBACAFKAIMLQAMQQFxGyECIwBBQGoiACQAIAAgATYCOCAAIAI2AjQCQAJAAkAgACgCOBB4DQAgACgCNEEFSg0AIAAoAjRBAE4NAQsgAEF+NgI8DAELIAAgACgCOCgCHDYCLAJAAkAgACgCOCgCDEUNACAAKAI4KAIEBEAgACgCOCgCAEUNAQsgACgCLCgCBEGaBUcNASAAKAI0QQRGDQELIAAoAjhBsNkAKAIANgIYIABBfjYCPAwBCyAAKAI4KAIQRQRAIAAoAjhBvNkAKAIANgIYIABBezYCPAwBCyAAIAAoAiwoAig2AjAgACgCLCAAKAI0NgIoAkAgACgCLCgCFARAIAAoAjgQHCAAKAI4KAIQRQRAIAAoAixBfzYCKCAAQQA2AjwMAwsMAQsCQCAAKAI4KAIEDQAgACgCNEEBdEEJQQAgACgCNEEEShtrIAAoAjBBAXRBCUEAIAAoAjBBBEoba0oNACAAKAI0QQRGDQAgACgCOEG82QAoAgA2AhggAEF7NgI8DAILCwJAIAAoAiwoAgRBmgVHDQAgACgCOCgCBEUNACAAKAI4QbzZACgCADYCGCAAQXs2AjwMAQsgACgCLCgCBEEqRgRAIAAgACgCLCgCMEEEdEH4AGtBCHQ2AigCQAJAIAAoAiwoAogBQQJIBEAgACgCLCgChAFBAk4NAQsgAEEANgIkDAELAkAgACgCLCgChAFBBkgEQCAAQQE2AiQMAQsCQCAAKAIsKAKEAUEGRgRAIABBAjYCJAwBCyAAQQM2AiQLCwsgACAAKAIoIAAoAiRBBnRyNgIoIAAoAiwoAmwEQCAAIAAoAihBIHI2AigLIAAgACgCKEEfIAAoAihBH3BrajYCKCAAKAIsIAAoAigQSyAAKAIsKAJsBEAgACgCLCAAKAI4KAIwQRB2EEsgACgCLCAAKAI4KAIwQf//A3EQSwtBAEEAQQAQPSEBIAAoAjggATYCMCAAKAIsQfEANgIEIAAoAjgQHCAAKAIsKAIUBEAgACgCLEF/NgIoIABBADYCPAwCCwsgACgCLCgCBEE5RgRAQQBBAEEAEBohASAAKAI4IAE2AjAgACgCLCgCCCECIAAoAiwiAygCFCEBIAMgAUEBajYCFCABIAJqQR86AAAgACgCLCgCCCECIAAoAiwiAygCFCEBIAMgAUEBajYCFCABIAJqQYsBOgAAIAAoAiwoAgghAiAAKAIsIgMoAhQhASADIAFBAWo2AhQgASACakEIOgAAAkAgACgCLCgCHEUEQCAAKAIsKAIIIQIgACgCLCIDKAIUIQEgAyABQQFqNgIUIAEgAmpBADoAACAAKAIsKAIIIQIgACgCLCIDKAIUIQEgAyABQQFqNgIUIAEgAmpBADoAACAAKAIsKAIIIQIgACgCLCIDKAIUIQEgAyABQQFqNgIUIAEgAmpBADoAACAAKAIsKAIIIQIgACgCLCIDKAIUIQEgAyABQQFqNgIUIAEgAmpBADoAACAAKAIsKAIIIQIgACgCLCIDKAIUIQEgAyABQQFqNgIUIAEgAmpBADoAACAAKAIsKAKEAUEJRgR/QQIFQQRBACAAKAIsKAKIAUECSAR/IAAoAiwoAoQBQQJIBUEBC0EBcRsLIQIgACgCLCgCCCEDIAAoAiwiBCgCFCEBIAQgAUEBajYCFCABIANqIAI6AAAgACgCLCgCCCECIAAoAiwiAygCFCEBIAMgAUEBajYCFCABIAJqQQM6AAAgACgCLEHxADYCBCAAKAI4EBwgACgCLCgCFARAIAAoAixBfzYCKCAAQQA2AjwMBAsMAQsgACgCLCgCHCgCAEVFQQJBACAAKAIsKAIcKAIsG2pBBEEAIAAoAiwoAhwoAhAbakEIQQAgACgCLCgCHCgCHBtqQRBBACAAKAIsKAIcKAIkG2ohAiAAKAIsKAIIIQMgACgCLCIEKAIUIQEgBCABQQFqNgIUIAEgA2ogAjoAACAAKAIsKAIcKAIEQf8BcSECIAAoAiwoAgghAyAAKAIsIgQoAhQhASAEIAFBAWo2AhQgASADaiACOgAAIAAoAiwoAhwoAgRBCHZB/wFxIQIgACgCLCgCCCEDIAAoAiwiBCgCFCEBIAQgAUEBajYCFCABIANqIAI6AAAgACgCLCgCHCgCBEEQdkH/AXEhAiAAKAIsKAIIIQMgACgCLCIEKAIUIQEgBCABQQFqNgIUIAEgA2ogAjoAACAAKAIsKAIcKAIEQRh2IQIgACgCLCgCCCEDIAAoAiwiBCgCFCEBIAQgAUEBajYCFCABIANqIAI6AAAgACgCLCgChAFBCUYEf0ECBUEEQQAgACgCLCgCiAFBAkgEfyAAKAIsKAKEAUECSAVBAQtBAXEbCyECIAAoAiwoAgghAyAAKAIsIgQoAhQhASAEIAFBAWo2AhQgASADaiACOgAAIAAoAiwoAhwoAgxB/wFxIQIgACgCLCgCCCEDIAAoAiwiBCgCFCEBIAQgAUEBajYCFCABIANqIAI6AAAgACgCLCgCHCgCEARAIAAoAiwoAhwoAhRB/wFxIQIgACgCLCgCCCEDIAAoAiwiBCgCFCEBIAQgAUEBajYCFCABIANqIAI6AAAgACgCLCgCHCgCFEEIdkH/AXEhAiAAKAIsKAIIIQMgACgCLCIEKAIUIQEgBCABQQFqNgIUIAEgA2ogAjoAAAsgACgCLCgCHCgCLARAIAAoAjgoAjAgACgCLCgCCCAAKAIsKAIUEBohASAAKAI4IAE2AjALIAAoAixBADYCICAAKAIsQcUANgIECwsgACgCLCgCBEHFAEYEQCAAKAIsKAIcKAIQBEAgACAAKAIsKAIUNgIgIAAgACgCLCgCHCgCFEH//wNxIAAoAiwoAiBrNgIcA0AgACgCLCgCDCAAKAIsKAIUIAAoAhxqSQRAIAAgACgCLCgCDCAAKAIsKAIUazYCGCAAKAIsKAIIIAAoAiwoAhRqIAAoAiwoAhwoAhAgACgCLCgCIGogACgCGBAZGiAAKAIsIAAoAiwoAgw2AhQCQCAAKAIsKAIcKAIsRQ0AIAAoAiwoAhQgACgCIE0NACAAKAI4KAIwIAAoAiwoAgggACgCIGogACgCLCgCFCAAKAIgaxAaIQEgACgCOCABNgIwCyAAKAIsIgEgACgCGCABKAIgajYCICAAKAI4EBwgACgCLCgCFARAIAAoAixBfzYCKCAAQQA2AjwMBQUgAEEANgIgIAAgACgCHCAAKAIYazYCHAwCCwALCyAAKAIsKAIIIAAoAiwoAhRqIAAoAiwoAhwoAhAgACgCLCgCIGogACgCHBAZGiAAKAIsIgEgACgCHCABKAIUajYCFAJAIAAoAiwoAhwoAixFDQAgACgCLCgCFCAAKAIgTQ0AIAAoAjgoAjAgACgCLCgCCCAAKAIgaiAAKAIsKAIUIAAoAiBrEBohASAAKAI4IAE2AjALIAAoAixBADYCIAsgACgCLEHJADYCBAsgACgCLCgCBEHJAEYEQCAAKAIsKAIcKAIcBEAgACAAKAIsKAIUNgIUA0AgACgCLCgCFCAAKAIsKAIMRgRAAkAgACgCLCgCHCgCLEUNACAAKAIsKAIUIAAoAhRNDQAgACgCOCgCMCAAKAIsKAIIIAAoAhRqIAAoAiwoAhQgACgCFGsQGiEBIAAoAjggATYCMAsgACgCOBAcIAAoAiwoAhQEQCAAKAIsQX82AiggAEEANgI8DAULIABBADYCFAsgACgCLCgCHCgCHCECIAAoAiwiAygCICEBIAMgAUEBajYCICAAIAEgAmotAAA2AhAgACgCECECIAAoAiwoAgghAyAAKAIsIgQoAhQhASAEIAFBAWo2AhQgASADaiACOgAAIAAoAhANAAsCQCAAKAIsKAIcKAIsRQ0AIAAoAiwoAhQgACgCFE0NACAAKAI4KAIwIAAoAiwoAgggACgCFGogACgCLCgCFCAAKAIUaxAaIQEgACgCOCABNgIwCyAAKAIsQQA2AiALIAAoAixB2wA2AgQLIAAoAiwoAgRB2wBGBEAgACgCLCgCHCgCJARAIAAgACgCLCgCFDYCDANAIAAoAiwoAhQgACgCLCgCDEYEQAJAIAAoAiwoAhwoAixFDQAgACgCLCgCFCAAKAIMTQ0AIAAoAjgoAjAgACgCLCgCCCAAKAIMaiAAKAIsKAIUIAAoAgxrEBohASAAKAI4IAE2AjALIAAoAjgQHCAAKAIsKAIUBEAgACgCLEF/NgIoIABBADYCPAwFCyAAQQA2AgwLIAAoAiwoAhwoAiQhAiAAKAIsIgMoAiAhASADIAFBAWo2AiAgACABIAJqLQAANgIIIAAoAgghAiAAKAIsKAIIIQMgACgCLCIEKAIUIQEgBCABQQFqNgIUIAEgA2ogAjoAACAAKAIIDQALAkAgACgCLCgCHCgCLEUNACAAKAIsKAIUIAAoAgxNDQAgACgCOCgCMCAAKAIsKAIIIAAoAgxqIAAoAiwoAhQgACgCDGsQGiEBIAAoAjggATYCMAsLIAAoAixB5wA2AgQLIAAoAiwoAgRB5wBGBEAgACgCLCgCHCgCLARAIAAoAiwoAgwgACgCLCgCFEECakkEQCAAKAI4EBwgACgCLCgCFARAIAAoAixBfzYCKCAAQQA2AjwMBAsLIAAoAjgoAjBB/wFxIQIgACgCLCgCCCEDIAAoAiwiBCgCFCEBIAQgAUEBajYCFCABIANqIAI6AAAgACgCOCgCMEEIdkH/AXEhAiAAKAIsKAIIIQMgACgCLCIEKAIUIQEgBCABQQFqNgIUIAEgA2ogAjoAAEEAQQBBABAaIQEgACgCOCABNgIwCyAAKAIsQfEANgIEIAAoAjgQHCAAKAIsKAIUBEAgACgCLEF/NgIoIABBADYCPAwCCwsCQAJAIAAoAjgoAgQNACAAKAIsKAJ0DQAgACgCNEUNASAAKAIsKAIEQZoFRg0BCyAAAn8gACgCLCgChAFFBEAgACgCLCAAKAI0ELcBDAELAn8gACgCLCgCiAFBAkYEQCAAKAIsIQIgACgCNCEDIwBBIGsiASQAIAEgAjYCGCABIAM2AhQCQANAAkAgASgCGCgCdEUEQCABKAIYEFwgASgCGCgCdEUEQCABKAIURQRAIAFBADYCHAwFCwwCCwsgASgCGEEANgJgIAEgASgCGCICKAI4IAIoAmxqLQAAOgAPIAEoAhgiAigCpC0gAigCoC1BAXRqQQA7AQAgAS0ADyEDIAEoAhgiAigCmC0hBCACIAIoAqAtIgJBAWo2AqAtIAIgBGogAzoAACABKAIYIAEtAA9BAnRqIgIgAi8BlAFBAWo7AZQBIAEgASgCGCgCoC0gASgCGCgCnC1BAWtGNgIQIAEoAhgiAiACKAJ0QQFrNgJ0IAEoAhgiAiACKAJsQQFqNgJsIAEoAhAEQCABKAIYAn8gASgCGCgCXEEATgRAIAEoAhgoAjggASgCGCgCXGoMAQtBAAsgASgCGCgCbCABKAIYKAJca0EAECggASgCGCABKAIYKAJsNgJcIAEoAhgoAgAQHCABKAIYKAIAKAIQRQRAIAFBADYCHAwECwsMAQsLIAEoAhhBADYCtC0gASgCFEEERgRAIAEoAhgCfyABKAIYKAJcQQBOBEAgASgCGCgCOCABKAIYKAJcagwBC0EACyABKAIYKAJsIAEoAhgoAlxrQQEQKCABKAIYIAEoAhgoAmw2AlwgASgCGCgCABAcIAEoAhgoAgAoAhBFBEAgAUECNgIcDAILIAFBAzYCHAwBCyABKAIYKAKgLQRAIAEoAhgCfyABKAIYKAJcQQBOBEAgASgCGCgCOCABKAIYKAJcagwBC0EACyABKAIYKAJsIAEoAhgoAlxrQQAQKCABKAIYIAEoAhgoAmw2AlwgASgCGCgCABAcIAEoAhgoAgAoAhBFBEAgAUEANgIcDAILCyABQQE2AhwLIAEoAhwhAiABQSBqJAAgAgwBCwJ/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(yo)||(yo=h(yo));function gg(d){try{if(d==yo&&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 bp(){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,dA(t.asm.v),EA(\"wasm-instantiate\")}if(mA(\"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(yo,d);return E(k[0]),t.asm}var vr,se;function wo(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 bt={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=bt.normalizeArray(d.split(\"/\").filter(function(k){return!!k}),!E).join(\"/\"),!d&&!E&&(d=\".\"),d&&I&&(d+=\"/\"),(E?\"/\":\"\")+d},dirname:function(d){var E=bt.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=bt.normalize(d),d=d.replace(/\\/$/,\"\");var E=d.lastIndexOf(\"/\");return E===-1?d:d.substr(E+1)},extname:function(d){return bt.splitPath(d)[3]},join:function(){var d=Array.prototype.slice.call(arguments,0);return bt.normalize(d.join(\"/\"))},join2:function(d,E){return bt.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=bt.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=yA(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}}},Bo={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 Bo[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(),bt.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=bt.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=bt.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=bt.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=bt.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=bt.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(Bo.EINVAL);if(k<0)throw new S.ErrnoError(Bo.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(Bo.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(Bo.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=bt.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=bt.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(bt.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=bt.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=bt.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=bt.dirname(d),k=bt.dirname(E),L=bt.basename(d),Z=bt.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=bt.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=bt.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=bt.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=bt.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=bt.join2(d,Z);try{S.mkdir(te)}catch{}d=te}}return te},createFile:function(d,E,I,k,L){var Z=bt.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?bt.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=bt.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=yA(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,be=(Et=lt.getResponseHeader(\"Accept-Ranges\"))&&Et===\"bytes\",On=(Et=lt.getResponseHeader(\"Content-Encoding\"))&&Et===\"gzip\",Ri=1024*1024;be||(Ri=it);var SA=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||[]):yA(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]=SA(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,be,On){S.forceLoadFile(me);var Ri=lt.node.contents;if(On>=Ri.length)return 0;var SA=Math.min(Ri.length-On,be);if(Ri.slice)for(var Mr=0;Mr<SA;Mr++)it[Et+Mr]=Ri[On+Mr];else for(var Mr=0;Mr<SA;Mr++)it[Et+Mr]=Ri.get(On+Mr);return SA},me.stream_ops=Je,me},createPreloadedFile:function(d,E,I,k,L,Z,te,we,me,Je){Browser.init();var nt=E?Nn.resolve(bt.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(),EA(wt)}var be=!1;t.preloadPlugins.forEach(function(On){be||On.canHandle(nt)&&(On.handle(it,nt,Et,function(){te&&te(),EA(wt)}),be=!0)}),be||Et(it)}mA(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(bt.dirname(it),bt.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 bt.join2(k,E)},doStat:function(d,E,I){try{var k=d(E)}catch(L){if(L&&L.node&&bt.normalize(E)!==bt.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=bt.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 Qp(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 IA(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=rV,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(Bo[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 yA(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:Qp,k:Sp,o:vp,q:xp,i:Pp,r:G,c:yt,h:IA,l:zi,m:Xe,f:pa,j:pg,g:OE,n:Dp,d:ME,a:ar,b:Tn,t:kp},rt=bp(),bo=t.___wasm_call_ctors=rt.v,wA=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,BA=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,JQ=t._zip_source_seek=rt.Y,k1=t._zip_file_set_external_attributes=rt.Z,R1=t._zip_file_set_mtime=rt._,WQ=t._zip_fopen=rt.$,F1=t._zip_fopen_index=rt.aa,N1=t._zip_fread=rt.ba,zQ=t._zip_get_name=rt.ca,T1=t._zip_get_num_entries=rt.da,L1=t._zip_source_read=rt.ea,VQ=t._zip_name_locate=rt.fa,O1=t._zip_open=rt.ga,M1=t._zip_open_from_source=rt.ha,XQ=t._zip_set_file_compression=rt.ia,K1=t._zip_source_buffer=rt.ja,U1=t._zip_source_buffer_create=rt.ka,H1=t._zip_source_close=rt.la,G1=t._zip_source_free=rt.ma,ZQ=t._zip_source_keep=rt.na,_Q=t._zip_source_open=rt.oa,$Q=t._zip_source_set_mtime=rt.qa,eS=t._zip_source_tell=rt.ra,tS=t._zip_stat=rt.sa,Y1=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,b=t.stackAlloc=rt.za;t.cwrap=ue,t.getValue=_;var Me;ha=function d(){Me||QA(),Me||(ha=d)};function QA(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=QA,t.preInit)for(typeof t.preInit==\"function\"&&(t.preInit=[t.preInit]);t.preInit.length>0;)t.preInit.pop()();return QA(),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 vV=w((jst,SV)=>{function dke(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}SV.exports=dke});var vs=w((qst,xV)=>{var Cke=Array.isArray;xV.exports=Cke});var NV=w((Jst,FV)=>{var PV=Rc(),mke=vV(),Eke=vs(),Ike=gC(),yke=1/0,DV=PV?PV.prototype:void 0,kV=DV?DV.toString:void 0;function RV(r){if(typeof r==\"string\")return r;if(Eke(r))return mke(r,RV)+\"\";if(Ike(r))return kV?kV.call(r):\"\";var e=r+\"\";return e==\"0\"&&1/r==-yke?\"-0\":e}FV.exports=RV});var Vf=w((Wst,TV)=>{var wke=NV();function Bke(r){return r==null?\"\":wke(r)}TV.exports=Bke});var HR=w((zst,LV)=>{function bke(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}LV.exports=bke});var MV=w((Vst,OV)=>{var Qke=HR();function Ske(r,e,t){var i=r.length;return t=t===void 0?i:t,!e&&t>=i?r:Qke(r,e,t)}OV.exports=Ske});var GR=w((Xst,KV)=>{var vke=\"\\\\ud800-\\\\udfff\",xke=\"\\\\u0300-\\\\u036f\",Pke=\"\\\\ufe20-\\\\ufe2f\",Dke=\"\\\\u20d0-\\\\u20ff\",kke=xke+Pke+Dke,Rke=\"\\\\ufe0e\\\\ufe0f\",Fke=\"\\\\u200d\",Nke=RegExp(\"[\"+Fke+vke+kke+Rke+\"]\");function Tke(r){return Nke.test(r)}KV.exports=Tke});var HV=w((Zst,UV)=>{function Lke(r){return r.split(\"\")}UV.exports=Lke});var VV=w((_st,zV)=>{var GV=\"\\\\ud800-\\\\udfff\",Oke=\"\\\\u0300-\\\\u036f\",Mke=\"\\\\ufe20-\\\\ufe2f\",Kke=\"\\\\u20d0-\\\\u20ff\",Uke=Oke+Mke+Kke,Hke=\"\\\\ufe0e\\\\ufe0f\",Gke=\"[\"+GV+\"]\",YR=\"[\"+Uke+\"]\",jR=\"\\\\ud83c[\\\\udffb-\\\\udfff]\",Yke=\"(?:\"+YR+\"|\"+jR+\")\",YV=\"[^\"+GV+\"]\",jV=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",qV=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",jke=\"\\\\u200d\",JV=Yke+\"?\",WV=\"[\"+Hke+\"]?\",qke=\"(?:\"+jke+\"(?:\"+[YV,jV,qV].join(\"|\")+\")\"+WV+JV+\")*\",Jke=WV+JV+qke,Wke=\"(?:\"+[YV+YR+\"?\",YR,jV,qV,Gke].join(\"|\")+\")\",zke=RegExp(jR+\"(?=\"+jR+\")|\"+Wke+Jke,\"g\");function Vke(r){return r.match(zke)||[]}zV.exports=Vke});var ZV=w(($st,XV)=>{var Xke=HV(),Zke=GR(),_ke=VV();function $ke(r){return Zke(r)?_ke(r):Xke(r)}XV.exports=$ke});var $V=w((eot,_V)=>{var eRe=MV(),tRe=GR(),rRe=ZV(),iRe=Vf();function nRe(r){return function(e){e=iRe(e);var t=tRe(e)?rRe(e):void 0,i=t?t[0]:e.charAt(0),n=t?eRe(t,1).join(\"\"):e.slice(1);return i[r]()+n}}_V.exports=nRe});var t9=w((tot,e9)=>{var sRe=$V(),oRe=sRe(\"toUpperCase\");e9.exports=oRe});var PB=w((rot,r9)=>{var aRe=Vf(),ARe=t9();function lRe(r){return ARe(aRe(r).toLowerCase())}r9.exports=lRe});var i9=w((iot,DB)=>{function cRe(){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=cRe)});var s9=w((not,n9)=>{var uRe=/^(.*?)(\\x1b\\[[^m]+m|\\x1b\\]8;;.*?(\\x1b\\\\|\\u0007))/,kB;function gRe(){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=i9(),e=new r;return kB=t=>e.splitGraphemes(t)}}n9.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(uRe)||[r,r,void 0],l=gRe()(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((bot,y9)=>{\"use strict\";var I9=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\"]]);y9.exports=r=>r?Object.keys(r).map(e=>[I9.has(e)?I9.get(e):e,r[e]]).reduce((e,t)=>(e[t[0]]=t[1],e),Object.create(null)):{}});var _f=w((Qot,D9)=>{\"use strict\";var w9=typeof process==\"object\"&&process?process:{stdout:null,stderr:null},QRe=J(\"events\"),B9=J(\"stream\"),b9=J(\"string_decoder\").StringDecoder,Wa=Symbol(\"EOF\"),za=Symbol(\"maybeEmitEnd\"),rl=Symbol(\"emittedEnd\"),OB=Symbol(\"emittingEnd\"),NC=Symbol(\"emittedError\"),MB=Symbol(\"closed\"),Q9=Symbol(\"read\"),KB=Symbol(\"flush\"),S9=Symbol(\"flushChunk\"),xn=Symbol(\"encoding\"),Va=Symbol(\"decoder\"),UB=Symbol(\"flowing\"),TC=Symbol(\"paused\"),Zf=Symbol(\"resume\"),Ci=Symbol(\"bufferLength\"),XR=Symbol(\"bufferPush\"),ZR=Symbol(\"bufferShift\"),Hi=Symbol(\"objectMode\"),Gi=Symbol(\"destroyed\"),_R=Symbol(\"emitData\"),v9=Symbol(\"emitEnd\"),$R=Symbol(\"emitEnd2\"),Xa=Symbol(\"async\"),LC=r=>Promise.resolve().then(r),x9=global._MP_NO_ITERATOR_SYMBOLS_!==\"1\",SRe=x9&&Symbol.asyncIterator||Symbol(\"asyncIterator not implemented\"),vRe=x9&&Symbol.iterator||Symbol(\"iterator not implemented\"),xRe=r=>r===\"end\"||r===\"finish\"||r===\"prefinish\",PRe=r=>r instanceof ArrayBuffer||typeof r==\"object\"&&r.constructor&&r.constructor.name===\"ArrayBuffer\"&&r.byteLength>=0,DRe=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()}},eF=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)}};D9.exports=class P9 extends B9{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[Xa]=e&&!!e.async||!1,this[Va]=this[xn]?new b9(this[xn]):null,this[Wa]=!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[Va]&&this[Va].lastNeed||this[Ci]))throw new Error(\"cannot change encoding\");this[xn]!==e&&(this[Va]=e?new b9(e):null,this.buffer.length&&(this.buffer=this.buffer.map(t=>this[Va].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[Xa]}set async(e){this[Xa]=this[Xa]||!!e}write(e,t,i){if(this[Wa])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[Xa]?LC:s=>s();return!this[Hi]&&!Buffer.isBuffer(e)&&(DRe(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):PRe(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[XR](e),this[Ci]!==0&&this.emit(\"readable\"),i&&n(i),this.flowing):e.length?(typeof e==\"string\"&&!(t===this[xn]&&!this[Va].lastNeed)&&(e=Buffer.from(e,t)),Buffer.isBuffer(e)&&this[xn]&&(e=this[Va].write(e)),this.flowing&&this[Ci]!==0&&this[KB](!0),this.flowing?this.emit(\"data\",e):this[XR](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[za](),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[Q9](e||null,this.buffer[0]);return this[za](),t}[Q9](e,t){return e===t.length||e===null?this[ZR]():(this.buffer[0]=t.slice(e),t=t.slice(0,e),this[Ci]-=e),this.emit(\"data\",t),!this.buffer.length&&!this[Wa]&&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[Wa]=!0,this.writable=!1,(this.flowing||!this[TC])&&this[za](),this}[Zf](){this[Gi]||(this[TC]=!1,this[UB]=!0,this.emit(\"resume\"),this.buffer.length?this[KB]():this[Wa]?this[za]():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]}[XR](e){this[Hi]?this[Ci]+=1:this[Ci]+=e.length,this.buffer.push(e)}[ZR](){return this.buffer.length&&(this[Hi]?this[Ci]-=1:this[Ci]-=this.buffer[0].length),this.buffer.shift()}[KB](e){do;while(this[S9](this[ZR]()));!e&&!this.buffer.length&&!this[Wa]&&this.emit(\"drain\")}[S9](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===w9.stdout||e===w9.stderr?t.end=!1:t.end=t.end!==!1,t.proxyErrors=!!t.proxyErrors,i?t.end&&e.end():(this.pipes.push(t.proxyErrors?new eF(this,e,t):new HB(this,e,t)),this[Xa]?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\"):xRe(e)&&this[rl]?(super.emit(e),this.removeAllListeners(e)):e===\"error\"&&this[NC]&&(this[Xa]?LC(()=>t.call(this,this[NC])):t.call(this,this[NC])),i}get emittedEnd(){return this[rl]}[za](){!this[OB]&&!this[rl]&&!this[Gi]&&this.buffer.length===0&&this[Wa]&&(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[Xa]?LC(()=>this[_R](t)):this[_R](t):!1;if(e===\"end\")return this[v9]();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[za](),s}else if(e===\"resume\"){let s=super.emit(\"resume\");return this[za](),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[za](),n}[_R](e){for(let i of this.pipes)i.dest.write(e)===!1&&this.pause();let t=super.emit(\"data\",e);return this[za](),t}[v9](){this[rl]||(this[rl]=!0,this.readable=!1,this[Xa]?LC(()=>this[$R]()):this[$R]())}[$R](){if(this[Va]){let t=this[Va].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())})}[SRe](){return{next:()=>{let t=this.read();if(t!==null)return Promise.resolve({done:!1,value:t});if(this[Wa])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[Wa]})},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)})}}}[vRe](){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 P9||e instanceof B9||e instanceof QRe&&(typeof e.pipe==\"function\"||typeof e.write==\"function\"&&typeof e.end==\"function\"))}}});var R9=w((Sot,k9)=>{var kRe=J(\"zlib\").constants||{ZLIB_VERNUM:4736};k9.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},kRe))});var dF=w(Xn=>{\"use strict\";var sF=J(\"assert\"),il=J(\"buffer\").Buffer,T9=J(\"zlib\"),Uc=Xn.constants=R9(),RRe=_f(),F9=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\"}},FRe=Symbol(\"opts\"),OC=Symbol(\"flushFlag\"),N9=Symbol(\"finishFlushFlag\"),pF=Symbol(\"fullFlushFlag\"),cr=Symbol(\"handle\"),GB=Symbol(\"onError\"),$f=Symbol(\"sawError\"),tF=Symbol(\"level\"),rF=Symbol(\"strategy\"),iF=Symbol(\"ended\"),vot=Symbol(\"_defaultFullFlush\"),YB=class extends RRe{constructor(e,t){if(!e||typeof e!=\"object\")throw new TypeError(\"invalid options for ZlibBase constructor\");super(e),this[$f]=!1,this[iF]=!1,this[FRe]=e,this[OC]=e.flush,this[N9]=e.finishFlush;try{this[cr]=new T9[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 sF(this[cr],\"zlib binding closed\"),this[cr].reset()}flush(e){this.ended||(typeof e!=\"number\"&&(e=this[pF]),this.write(Object.assign(il.alloc(0),{[OC]:e})))}end(e,t,i){return e&&this.write(e,t),this.flush(this[N9]),this[iF]=!0,super.end(null,null,i)}get ended(){return this[iF]}write(e,t,i){if(typeof t==\"function\"&&(i=t,t=\"utf8\"),typeof e==\"string\"&&(e=il.from(e,t)),this[$f])return;sF(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=F9}catch(c){il.concat=F9,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)}},Za=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[pF]=Uc.Z_FULL_FLUSH,this[tF]=e.level,this[rF]=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[tF]!==e||this[rF]!==t){this.flush(Uc.Z_SYNC_FLUSH),sF(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[tF]=e,this[rF]=t)}}}},oF=class extends Za{constructor(e){super(e,\"Deflate\")}},aF=class extends Za{constructor(e){super(e,\"Inflate\")}},nF=Symbol(\"_portable\"),AF=class extends Za{constructor(e){super(e,\"Gzip\"),this[nF]=e&&!!e.portable}[Hc](e){return this[nF]?(this[nF]=!1,e[9]=255,super[Hc](e)):super[Hc](e)}},lF=class extends Za{constructor(e){super(e,\"Gunzip\")}},cF=class extends Za{constructor(e){super(e,\"DeflateRaw\")}},uF=class extends Za{constructor(e){super(e,\"InflateRaw\")}},gF=class extends Za{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[pF]=Uc.BROTLI_OPERATION_FLUSH}},fF=class extends jB{constructor(e){super(e,\"BrotliCompress\")}},hF=class extends jB{constructor(e){super(e,\"BrotliDecompress\")}};Xn.Deflate=oF;Xn.Inflate=aF;Xn.Gzip=AF;Xn.Gunzip=lF;Xn.DeflateRaw=cF;Xn.InflateRaw=uF;Xn.Unzip=gF;typeof T9.BrotliCompress==\"function\"?(Xn.BrotliCompress=fF,Xn.BrotliDecompress=hF):Xn.BrotliCompress=Xn.BrotliDecompress=class{constructor(){throw new Error(\"Brotli is not supported in this version of Node.js\")}}});var th=w((Dot,L9)=>{var NRe=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform;L9.exports=NRe!==\"win32\"?r=>r:r=>r&&r.replace(/\\\\/g,\"/\")});var qB=w((Rot,O9)=>{\"use strict\";var TRe=_f(),CF=th(),mF=Symbol(\"slurp\");O9.exports=class extends TRe{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=CF(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=CF(e.linkpath),this.uname=e.uname,this.gname=e.gname,t&&this[mF](t),i&&this[mF](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))}[mF](e,t){for(let i in e)e[i]!==null&&e[i]!==void 0&&!(t&&i===\"path\")&&(this[i]=i===\"path\"||i===\"linkpath\"?CF(e[i]):e[i])}}});var EF=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 H9=w((Not,U9)=>{\"use strict\";var LRe=(r,e)=>{if(Number.isSafeInteger(r))r<0?MRe(r,e):ORe(r,e);else throw Error(\"cannot encode number outside of javascript safe integer range\");return e},ORe=(r,e)=>{e[0]=128;for(var t=e.length;t>1;t--)e[t-1]=r&255,r=Math.floor(r/256)},MRe=(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]=M9(n):n===0?e[i-1]=0:(t=!0,e[i-1]=K9(n))}},KRe=r=>{let e=r[0],t=e===128?HRe(r.slice(1,r.length)):e===255?URe(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},URe=r=>{for(var e=r.length,t=0,i=!1,n=e-1;n>-1;n--){var s=r[n],o;i?o=M9(s):s===0?o=s:(i=!0,o=K9(s)),o!==0&&(t-=o*Math.pow(256,e-n-1))}return t},HRe=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},M9=r=>(255^r)&255,K9=r=>(255^r)+1&255;U9.exports={encode:LRe,parse:KRe}});var ih=w((Tot,Y9)=>{\"use strict\";var IF=EF(),rh=J(\"path\").posix,G9=H9(),yF=Symbol(\"slurp\"),Zn=Symbol(\"type\"),bF=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=wF(e,t+136,12),this.cksum=nl(e,t+148,12),this[yF](i),this[yF](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=wF(e,t+476,12),this.ctime=wF(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)}[yF](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=GRe(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=BF(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=BF(e,t+476,12,this.atime)||this.needPax,this.needPax=BF(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 IF.name.get(this[Zn])||this[Zn]}get typeKey(){return this[Zn]}set type(e){IF.code.has(e)?this[Zn]=IF.code.get(e):this[Zn]=e}},GRe=(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.*/,\"\"),wF=(r,e,t)=>YRe(nl(r,e,t)),YRe=r=>r===null?null:new Date(r*1e3),nl=(r,e,t)=>r[e]&128?G9.parse(r.slice(e,e+t)):qRe(r,e,t),jRe=r=>isNaN(r)?null:r,qRe=(r,e,t)=>jRe(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?(G9.encode(i,r.slice(e,e+t)),!0):(WRe(r,e,t,i),!1),WRe=(r,e,t,i)=>r.write(zRe(i,t),e,t,\"ascii\"),zRe=(r,e)=>VRe(Math.floor(r).toString(8),e),VRe=(r,e)=>(r.length===e-1?r:new Array(e-r.length-1).join(\"0\")+r+\" \")+\"\\0\",BF=(r,e,t,i)=>i===null?!1:sl(r,e,t,i.getTime()/1e3),XRe=new Array(156).join(\"\\0\"),Yc=(r,e,t,i)=>i===null?!1:(r.write(i+XRe,e,t,\"utf8\"),i.length!==Buffer.byteLength(i)||i.length>t);Y9.exports=bF});var WB=w((Lot,j9)=>{\"use strict\";var ZRe=ih(),_Re=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 ZRe({path:(\"PaxHeader/\"+_Re.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($Re(eFe(r),e),t);var $Re=(r,e)=>e?Object.keys(r).reduce((t,i)=>(t[i]=r[i],t),e):r,eFe=r=>r.replace(/\\n$/,\"\").split(`\n`).reduce(tFe,Object.create(null)),tFe=(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};j9.exports=MC});var nh=w((Oot,q9)=>{q9.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((Mot,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 SF=w((Uot,W9)=>{\"use strict\";var VB=[\"|\",\"<\",\">\",\"?\",\":\"],QF=VB.map(r=>String.fromCharCode(61440+r.charCodeAt(0))),rFe=new Map(VB.map((r,e)=>[r,QF[e]])),iFe=new Map(QF.map((r,e)=>[r,VB[e]]));W9.exports={encode:r=>VB.reduce((e,t)=>e.split(t).join(rFe.get(t)),r),decode:r=>QF.reduce((e,t)=>e.split(t).join(iFe.get(t)),r)}});var vF=w((Hot,V9)=>{var{isAbsolute:nFe,parse:z9}=J(\"path\").win32;V9.exports=r=>{let e=\"\",t=z9(r);for(;nFe(r)||t.root;){let i=r.charAt(0)===\"/\"&&r.slice(0,4)!==\"//?/\"?\"/\":t.root;r=r.substr(i.length),e+=i,t=z9(r)}return[e,r]}});var Z9=w((Got,X9)=>{\"use strict\";X9.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 OF=w((qot,u7)=>{\"use strict\";var n7=_f(),s7=WB(),o7=ih(),Zo=J(\"fs\"),_9=J(\"path\"),Xo=th(),sFe=nh(),a7=(r,e)=>e?(r=Xo(r).replace(/^\\.(\\/|$)/,\"\"),sFe(e)+\"/\"+r):Xo(r),oFe=16*1024*1024,$9=Symbol(\"process\"),e7=Symbol(\"file\"),t7=Symbol(\"directory\"),PF=Symbol(\"symlink\"),r7=Symbol(\"hardlink\"),KC=Symbol(\"header\"),XB=Symbol(\"read\"),DF=Symbol(\"lstat\"),ZB=Symbol(\"onlstat\"),kF=Symbol(\"onread\"),RF=Symbol(\"onreadlink\"),FF=Symbol(\"openfile\"),NF=Symbol(\"onopenfile\"),ol=Symbol(\"close\"),_B=Symbol(\"mode\"),TF=Symbol(\"awaitDrain\"),xF=Symbol(\"ondrain\"),_o=Symbol(\"prefix\"),i7=Symbol(\"hadError\"),A7=zB(),aFe=SF(),l7=vF(),c7=Z9(),$B=A7(class extends n7{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||oFe,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]=l7(this.path);n&&(this.path=s,i=n)}this.win32=!!t.win32||process.platform===\"win32\",this.win32&&(this.path=aFe.decode(this.path.replace(/\\\\/g,\"/\")),e=e.replace(/\\\\/g,\"/\")),this.absolute=Xo(t.absolute||_9.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[DF]()}emit(e,...t){return e===\"error\"&&(this[i7]=!0),super.emit(e,...t)}[DF](){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=lFe(e),this.emit(\"stat\",e),this[$9]()}[$9](){switch(this.type){case\"File\":return this[e7]();case\"Directory\":return this[t7]();case\"SymbolicLink\":return this[PF]();default:return this.end()}}[_B](e){return c7(e,this.type===\"Directory\",this.portable)}[_o](e){return a7(e,this.prefix)}[KC](){this.type===\"Directory\"&&this.portable&&(this.noMtime=!0),this.header=new o7({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 s7({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)}[t7](){this.path.substr(-1)!==\"/\"&&(this.path+=\"/\"),this.stat.size=0,this[KC](),this.end()}[PF](){Zo.readlink(this.absolute,(e,t)=>{if(e)return this.emit(\"error\",e);this[RF](t)})}[RF](e){this.linkpath=Xo(e),this[KC](),this.end()}[r7](e){this.type=\"Link\",this.linkpath=Xo(_9.relative(this.cwd,e)),this.stat.size=0,this[KC](),this.end()}[e7](){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[r7](t)}this.linkCache.set(e,this.absolute)}if(this[KC](),this.stat.size===0)return this.end();this[FF]()}[FF](){Zo.open(this.absolute,\"r\",(e,t)=>{if(e)return this.emit(\"error\",e);this[NF](t)})}[NF](e){if(this.fd=e,this[i7])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[kF](a)})}[ol](e){Zo.close(this.fd,e)}[kF](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[xF]():this[TF](()=>this[xF]())}[TF](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)}[xF](){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]()}}),LF=class extends $B{[DF](){this[ZB](Zo.lstatSync(this.absolute))}[PF](){this[RF](Zo.readlinkSync(this.absolute))}[FF](){this[NF](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[kF](a),e=!1}finally{if(e)try{this[ol](()=>{})}catch{}}}[TF](e){e()}[ol](e){Zo.closeSync(this.fd),e()}},AFe=A7(class extends n7{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]=l7(this.path);n&&(this.path=s,i=n)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.header=new o7({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 s7({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 a7(e,this.prefix)}[_B](e){return c7(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=LF;$B.Tar=AFe;var lFe=r=>r.isFile()?\"File\":r.isDirectory()?\"Directory\":r.isSymbolicLink()?\"SymbolicLink\":\"Unsupported\";u7.exports=$B});var A0=w((Wot,m7)=>{\"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}},cFe=_f(),uFe=dF(),gFe=qB(),JF=OF(),fFe=JF.Sync,hFe=JF.Tar,pFe=WI(),g7=Buffer.alloc(1024),r0=Symbol(\"onStat\"),e0=Symbol(\"ended\"),$o=Symbol(\"queue\"),sh=Symbol(\"current\"),jc=Symbol(\"process\"),t0=Symbol(\"processing\"),f7=Symbol(\"processJob\"),ea=Symbol(\"jobs\"),MF=Symbol(\"jobDone\"),i0=Symbol(\"addFSEntry\"),h7=Symbol(\"addTarEntry\"),GF=Symbol(\"stat\"),YF=Symbol(\"readdir\"),n0=Symbol(\"onreaddir\"),s0=Symbol(\"pipe\"),p7=Symbol(\"entry\"),KF=Symbol(\"entryOpt\"),jF=Symbol(\"writeEntryClass\"),C7=Symbol(\"write\"),UF=Symbol(\"ondrain\"),a0=J(\"fs\"),d7=J(\"path\"),dFe=zB(),HF=th(),WF=dFe(class extends cFe{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=HF(e.prefix||\"\"),this.linkCache=e.linkCache||new Map,this.statCache=e.statCache||new Map,this.readdirCache=e.readdirCache||new Map,this[jF]=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 uFe.Gzip(e.gzip),this.zip.on(\"data\",t=>super.write(t)),this.zip.on(\"end\",t=>super.end()),this.zip.on(\"drain\",t=>this[UF]()),this.on(\"resume\",t=>this.zip.resume())):this.on(\"drain\",this[UF]),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 pFe,this[ea]=0,this.jobs=+e.jobs||4,this[t0]=!1,this[e0]=!1}[C7](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 gFe?this[h7](e):this[i0](e),this.flowing}[h7](e){let t=HF(d7.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 hFe(e,this[KF](i)),i.entry.on(\"end\",n=>this[MF](i)),this[ea]+=1,this[$o].push(i)}this[jc]()}[i0](e){let t=HF(d7.resolve(this.cwd,e));this[$o].push(new o0(e,t)),this[jc]()}[GF](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]()}[YF](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[f7](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(g7):(super.write(g7),super.end()))}}get[sh](){return this[$o]&&this[$o].head&&this[$o].head.value}[MF](e){this[$o].shift(),this[ea]-=1,this[jc]()}[f7](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[GF](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[YF](e),!e.readdir))){if(e.entry=this[p7](e),!e.entry){e.ignore=!0;return}e===this[sh]&&!e.piped&&this[s0](e)}}}[KF](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}}[p7](e){this[ea]+=1;try{return new this[jF](e.path,this[KF](e)).on(\"end\",()=>this[MF](e)).on(\"error\",t=>this.emit(\"error\",t))}catch(t){this.emit(\"error\",t)}}[UF](){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()}}),qF=class extends WF{constructor(e){super(e),this[jF]=fFe}pause(){}resume(){}[GF](e){let t=this.follow?\"statSync\":\"lstatSync\";this[r0](e,a0[t](e.absolute))}[YF](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[C7](n)})}};WF.Sync=qF;m7.exports=WF});var fh=w(HC=>{\"use strict\";var CFe=_f(),mFe=J(\"events\").EventEmitter,Pn=J(\"fs\"),XF=Pn.writev;if(!XF){let r=process.binding(\"fs\"),e=r.FSReqWrap||r.FSReqCallback;XF=(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\"),lo=Symbol(\"_close\"),UC=Symbol(\"_ended\"),rr=Symbol(\"_fd\"),E7=Symbol(\"_finished\"),Al=Symbol(\"_flags\"),zF=Symbol(\"_flush\"),ZF=Symbol(\"_handleChunk\"),_F=Symbol(\"_makeBuf\"),f0=Symbol(\"_mode\"),l0=Symbol(\"_needDrain\"),lh=Symbol(\"_onerror\"),gh=Symbol(\"_onopen\"),VF=Symbol(\"_onread\"),ah=Symbol(\"_onwrite\"),ll=Symbol(\"_open\"),_a=Symbol(\"_path\"),qc=Symbol(\"_pos\"),ta=Symbol(\"_queue\"),Ah=Symbol(\"_read\"),I7=Symbol(\"_readSize\"),al=Symbol(\"_reading\"),c0=Symbol(\"_remain\"),y7=Symbol(\"_size\"),u0=Symbol(\"_write\"),oh=Symbol(\"_writing\"),g0=Symbol(\"_defaultFlag\"),ch=Symbol(\"_errored\"),h0=class extends CFe{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[I7]=t.readSize||16*1024*1024,this[al]=!1,this[y7]=typeof t.size==\"number\"?t.size:1/0,this[c0]=this[y7],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]())}[_F](){return Buffer.allocUnsafe(Math.min(this[I7],this[c0]))}[Ah](){if(!this[al]){this[al]=!0;let e=this[_F]();if(e.length===0)return process.nextTick(()=>this[VF](null,0,e));Pn.read(this[rr],e,0,e.length,null,(t,i,n)=>this[VF](t,i,n))}}[VF](e,t,i){this[al]=!1,e?this[lh](e):this[ZF](t,i)&&this[Ah]()}[lo](){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[lo](),this.emit(\"error\",e)}[ZF](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[lo](),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)}}},$F=class extends h0{[ll](){let e=!0;try{this[gh](null,Pn.openSync(this[_a],\"r\")),e=!1}finally{e&&this[lo]()}}[Ah](){let e=!0;try{if(!this[al]){this[al]=!0;do{let t=this[_F](),i=t.length===0?0:Pn.readSync(this[rr],t,0,t.length,null);if(!this[ZF](i,t))break}while(!0);this[al]=!1}e=!1}finally{e&&this[lo]()}}[lo](){if(this[uh]&&typeof this[rr]==\"number\"){let e=this[rr];this[rr]=null,Pn.closeSync(e),this.emit(\"close\")}}},p0=class extends mFe{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[lo](),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[zF]())}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[zF]():(this[oh]=!1,this[UC]&&!this[E7]?(this[E7]=!0,this[lo](),this.emit(\"finish\")):this[l0]&&(this[l0]=!1,this.emit(\"drain\"))))}[zF](){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]=[],XF(this[rr],e,this[qc],(t,i)=>this[ah](t,i))}}[lo](){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\"))}}},eN=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)}[lo](){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[lo]()}catch{}}}};HC.ReadStream=h0;HC.ReadStreamSync=$F;HC.WriteStream=p0;HC.WriteStreamSync=eN});var w0=w((Xot,x7)=>{\"use strict\";var EFe=zB(),IFe=ih(),yFe=J(\"events\"),wFe=WI(),BFe=1024*1024,bFe=qB(),w7=WB(),QFe=dF(),tN=Buffer.from([31,139]),xs=Symbol(\"state\"),Jc=Symbol(\"writeEntry\"),$a=Symbol(\"readEntry\"),rN=Symbol(\"nextEntry\"),B7=Symbol(\"processEntry\"),Ps=Symbol(\"extendedHeader\"),GC=Symbol(\"globalExtendedHeader\"),cl=Symbol(\"meta\"),b7=Symbol(\"emitMeta\"),Er=Symbol(\"buffer\"),eA=Symbol(\"queue\"),Wc=Symbol(\"ended\"),Q7=Symbol(\"emittedEnd\"),zc=Symbol(\"emit\"),Dn=Symbol(\"unzip\"),d0=Symbol(\"consumeChunk\"),C0=Symbol(\"consumeChunkSub\"),iN=Symbol(\"consumeBody\"),S7=Symbol(\"consumeMeta\"),v7=Symbol(\"consumeHeader\"),m0=Symbol(\"consuming\"),nN=Symbol(\"bufferConcat\"),sN=Symbol(\"maybeEnd\"),YC=Symbol(\"writing\"),ul=Symbol(\"aborted\"),E0=Symbol(\"onDone\"),Vc=Symbol(\"sawValidEntry\"),I0=Symbol(\"sawNullBlock\"),y0=Symbol(\"sawEOF\"),SFe=r=>!0;x7.exports=EFe(class extends yFe{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||BFe,this.filter=typeof e.filter==\"function\"?e.filter:SFe,this.writable=!0,this.readable=!1,this[eA]=new wFe,this[Er]=null,this[$a]=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)}[v7](e,t){this[Vc]===null&&(this[Vc]=!1);let i;try{i=new IFe(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 bFe(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[$a]?this[eA].push(s):(this[eA].push(s),this[rN]())))}}}[B7](e){let t=!0;return e?Array.isArray(e)?this.emit.apply(this,e):(this[$a]=e,this.emit(\"entry\",e),e.emittedEnd||(e.on(\"end\",i=>this[rN]()),t=!1)):(this[$a]=null,t=!1),t}[rN](){do;while(this[B7](this[eA].shift()));if(!this[eA].length){let e=this[$a];!e||e.flowing||e.size===e.remain?this[YC]||this.emit(\"drain\"):e.once(\"drain\",i=>this.emit(\"drain\"))}}[iN](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}[S7](e,t){let i=this[Jc],n=this[iN](e,t);return this[Jc]||this[b7](i),n}[zc](e,t,i){!this[eA].length&&!this[$a]?this.emit(e,t,i):this[eA].push([e,t,i])}[b7](e){switch(this[zc](\"meta\",this[cl]),e.type){case\"ExtendedHeader\":case\"OldExtendedHeader\":this[Ps]=w7.parse(this[cl],this[Ps],!1);break;case\"GlobalExtendedHeader\":this[GC]=w7.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<tN.length)return this[Er]=e,!0;for(let i=0;this[Dn]===null&&i<tN.length;i++)e[i]!==tN[i]&&(this[Dn]=!1);if(this[Dn]===null){let i=this[Wc];this[Wc]=!1,this[Dn]=new QFe.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[eA].length?!1:this[$a]?this[$a].flowing:!0;return!t&&!this[eA].length&&this[$a].once(\"drain\",i=>this.emit(\"drain\")),t}[nN](e){e&&!this[ul]&&(this[Er]=this[Er]?Buffer.concat([this[Er],e]):e)}[sN](){if(this[Wc]&&!this[Q7]&&!this[ul]&&!this[m0]){this[Q7]=!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[nN](e);else if(!e&&!this[Er])this[sN]();else{if(this[m0]=!0,this[Er]){this[nN](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[sN]()}[C0](e){let t=0,i=e.length;for(;t+512<=i&&!this[ul]&&!this[y0];)switch(this[xs]){case\"begin\":case\"header\":this[v7](e,t),t+=512;break;case\"ignore\":case\"body\":t+=this[iN](e,t);break;case\"meta\":t+=this[S7](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((Zot,R7)=>{\"use strict\";var vFe=Xf(),D7=w0(),hh=J(\"fs\"),xFe=fh(),P7=J(\"path\"),oN=nh();R7.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=vFe(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&&DFe(i,e),i.noResume||PFe(i),i.file&&i.sync?kFe(i):i.file?RFe(i,t):k7(i)};var PFe=r=>{let e=r.onentry;r.onentry=e?t=>{e(t),t.resume()}:t=>t.resume()},DFe=(r,e)=>{let t=new Map(e.map(s=>[oN(s),!0])),i=r.filter,n=(s,o)=>{let a=o||P7.parse(s).root||\".\",l=s===a?!1:t.has(s)?t.get(s):n(P7.dirname(s),a);return t.set(s,l),l};r.filter=i?(s,o)=>i(s,o)&&n(oN(s)):s=>n(oN(s))},kFe=r=>{let e=k7(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{}}},RFe=(r,e)=>{let t=new D7(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 xFe.ReadStream(n,{readSize:i,size:c.size});u.on(\"error\",a),u.pipe(t)}})});return e?s.then(e,e):s},k7=r=>new D7(r)});var M7=w((_ot,O7)=>{\"use strict\";var FFe=Xf(),b0=A0(),F7=fh(),N7=B0(),T7=J(\"path\");O7.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=FFe(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?NFe(i,e):i.file?TFe(i,e,t):i.sync?LFe(i,e):OFe(i,e)};var NFe=(r,e)=>{let t=new b0.Sync(r),i=new F7.WriteStreamSync(r.file,{mode:r.mode||438});t.pipe(i),L7(t,e)},TFe=(r,e,t)=>{let i=new b0(r),n=new F7.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 aN(i,e),t?s.then(t,t):s},L7=(r,e)=>{e.forEach(t=>{t.charAt(0)===\"@\"?N7({file:T7.resolve(r.cwd,t.substr(1)),sync:!0,noResume:!0,onentry:i=>r.add(i)}):r.add(t)}),r.end()},aN=(r,e)=>{for(;e.length;){let t=e.shift();if(t.charAt(0)===\"@\")return N7({file:T7.resolve(r.cwd,t.substr(1)),noResume:!0,onentry:i=>r.add(i)}).then(i=>aN(r,e));r.add(t)}r.end()},LFe=(r,e)=>{let t=new b0.Sync(r);return L7(t,e),t},OFe=(r,e)=>{let t=new b0(r);return aN(t,e),t}});var AN=w(($ot,q7)=>{\"use strict\";var MFe=Xf(),K7=A0(),_n=J(\"fs\"),U7=fh(),H7=B0(),G7=J(\"path\"),Y7=ih();q7.exports=(r,e,t)=>{let i=MFe(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?KFe(i,e):HFe(i,e,t)};var KFe=(r,e)=>{let t=new K7.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 Y7(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,UFe(r,t,s,n,e)}finally{if(i)try{_n.closeSync(n)}catch{}}},UFe=(r,e,t,i,n)=>{let s=new U7.WriteStreamSync(r.file,{fd:i,start:t});e.pipe(s),GFe(e,n)},HFe=(r,e,t)=>{e=Array.from(e);let i=new K7(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 Y7(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 U7.WriteStream(r.file,{fd:g,start:C});i.pipe(y),y.on(\"error\",a),y.on(\"close\",o),j7(i,e)})})};_n.open(r.file,l,c)});return t?s.then(t,t):s},GFe=(r,e)=>{e.forEach(t=>{t.charAt(0)===\"@\"?H7({file:G7.resolve(r.cwd,t.substr(1)),sync:!0,noResume:!0,onentry:i=>r.add(i)}):r.add(t)}),r.end()},j7=(r,e)=>{for(;e.length;){let t=e.shift();if(t.charAt(0)===\"@\")return H7({file:G7.resolve(r.cwd,t.substr(1)),noResume:!0,onentry:i=>r.add(i)}).then(i=>j7(r,e));r.add(t)}r.end()}});var W7=w((eat,J7)=>{\"use strict\";var YFe=Xf(),jFe=AN();J7.exports=(r,e,t)=>{let i=YFe(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),qFe(i),jFe(i,e,t)};var qFe=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 X7=w((tat,V7)=>{var{promisify:z7}=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=z7(r.mkdir),r.stat=r.stat||r.fs.stat||gl.stat,r.statAsync=z7(r.stat),r.statSync=r.statSync||r.fs.statSync||gl.statSync,r.mkdirSync=r.mkdirSync||r.fs.mkdirSync||gl.mkdirSync,r};V7.exports=JFe});var _7=w((rat,Z7)=>{var WFe=process.env.__TESTING_MKDIRP_PLATFORM__||process.platform,{resolve:zFe,parse:VFe}=J(\"path\"),XFe=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=zFe(r),WFe===\"win32\"){let e=/[*|\"<>?:]/,{root:t}=VFe(r);if(e.test(r.substr(t.length)))throw Object.assign(new Error(\"Illegal characters in path.\"),{path:r,code:\"EINVAL\"})}return r};Z7.exports=XFe});var iX=w((iat,rX)=>{var{dirname:$7}=J(\"path\"),eX=(r,e,t=void 0)=>t===e?Promise.resolve():r.statAsync(e).then(i=>i.isDirectory()?t:void 0,i=>i.code===\"ENOENT\"?eX(r,$7(e),e):void 0),tX=(r,e,t=void 0)=>{if(t!==e)try{return r.statSync(e).isDirectory()?t:void 0}catch(i){return i.code===\"ENOENT\"?tX(r,$7(e),e):void 0}};rX.exports={findMade:eX,findMadeSync:tX}});var uN=w((nat,sX)=>{var{dirname:nX}=J(\"path\"),lN=(r,e,t)=>{e.recursive=!1;let i=nX(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 lN(i,e).then(s=>lN(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})})},cN=(r,e,t)=>{let i=nX(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 cN(r,e,cN(i,e,t));if(n.code!==\"EEXIST\"&&n.code!==\"EROFS\")throw n;try{if(!e.statSync(r).isDirectory())throw n}catch{throw n}}};sX.exports={mkdirpManual:lN,mkdirpManualSync:cN}});var AX=w((sat,aX)=>{var{dirname:oX}=J(\"path\"),{findMade:ZFe,findMadeSync:_Fe}=iX(),{mkdirpManual:$Fe,mkdirpManualSync:eNe}=uN(),tNe=(r,e)=>(e.recursive=!0,oX(r)===r?e.mkdirAsync(r,e):ZFe(e,r).then(i=>e.mkdirAsync(r,e).then(()=>i).catch(n=>{if(n.code===\"ENOENT\")return $Fe(r,e);throw n}))),rNe=(r,e)=>{if(e.recursive=!0,oX(r)===r)return e.mkdirSync(r,e);let i=_Fe(e,r);try{return e.mkdirSync(r,e),i}catch(n){if(n.code===\"ENOENT\")return eNe(r,e);throw n}};aX.exports={mkdirpNative:tNe,mkdirpNativeSync:rNe}});var gX=w((oat,uX)=>{var lX=J(\"fs\"),iNe=process.env.__TESTING_MKDIRP_NODE_VERSION__||process.version,gN=iNe.replace(/^v/,\"\").split(\".\"),cX=+gN[0]>10||+gN[0]==10&&+gN[1]>=12,nNe=cX?r=>r.mkdir===lX.mkdir:()=>!1,sNe=cX?r=>r.mkdirSync===lX.mkdirSync:()=>!1;uX.exports={useNative:nNe,useNativeSync:sNe}});var mX=w((aat,CX)=>{var ph=X7(),dh=_7(),{mkdirpNative:fX,mkdirpNativeSync:hX}=AX(),{mkdirpManual:pX,mkdirpManualSync:dX}=uN(),{useNative:oNe,useNativeSync:aNe}=gX(),Ch=(r,e)=>(r=dh(r),e=ph(e),oNe(e)?fX(r,e):pX(r,e)),ANe=(r,e)=>(r=dh(r),e=ph(e),aNe(e)?hX(r,e):dX(r,e));Ch.sync=ANe;Ch.native=(r,e)=>fX(dh(r),ph(e));Ch.manual=(r,e)=>pX(dh(r),ph(e));Ch.nativeSync=(r,e)=>hX(dh(r),ph(e));Ch.manualSync=(r,e)=>dX(dh(r),ph(e));CX.exports=Ch});var QX=w((Aat,bX)=>{\"use strict\";var Ds=J(\"fs\"),Xc=J(\"path\"),lNe=Ds.lchown?\"lchown\":\"chown\",cNe=Ds.lchownSync?\"lchownSync\":\"chownSync\",IX=Ds.lchown&&!process.version.match(/v1[1-9]+\\./)&&!process.version.match(/v10\\.[6-9]/),EX=(r,e,t)=>{try{return Ds[cNe](r,e,t)}catch(i){if(i.code!==\"ENOENT\")throw i}},uNe=(r,e,t)=>{try{return Ds.chownSync(r,e,t)}catch(i){if(i.code!==\"ENOENT\")throw i}},gNe=IX?(r,e,t,i)=>n=>{!n||n.code!==\"EISDIR\"?i(n):Ds.chown(r,e,t,i)}:(r,e,t,i)=>i,fN=IX?(r,e,t)=>{try{return EX(r,e,t)}catch(i){if(i.code!==\"EISDIR\")throw i;uNe(r,e,t)}}:(r,e,t)=>EX(r,e,t),fNe=process.version,yX=(r,e,t)=>Ds.readdir(r,e,t),hNe=(r,e)=>Ds.readdirSync(r,e);/^v4\\./.test(fNe)&&(yX=(r,e,t)=>Ds.readdir(r,t));var Q0=(r,e,t,i)=>{Ds[lNe](r,e,t,gNe(r,e,t,n=>{i(n&&n.code!==\"ENOENT\"?n:null)}))},wX=(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,wX(r,o,t,i,n)});if(e.isDirectory())hN(Xc.resolve(r,e.name),t,i,s=>{if(s)return n(s);let o=Xc.resolve(r,e.name);Q0(o,t,i,n)});else{let s=Xc.resolve(r,e.name);Q0(s,t,i,n)}},hN=(r,e,t,i)=>{yX(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 Q0(r,e,t,i);let o=s.length,a=null,l=c=>{if(!a){if(c)return i(a=c);if(--o===0)return Q0(r,e,t,i)}};s.forEach(c=>wX(r,c,e,t,l))})},pNe=(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()&&BX(Xc.resolve(r,e.name),t,i),fN(Xc.resolve(r,e.name),t,i)},BX=(r,e,t)=>{let i;try{i=hNe(r,{withFileTypes:!0})}catch(n){if(n.code===\"ENOENT\")return;if(n.code===\"ENOTDIR\"||n.code===\"ENOTSUP\")return fN(r,e,t);throw n}return i&&i.length&&i.forEach(n=>pNe(r,n,e,t)),fN(r,e,t)};bX.exports=hN;hN.sync=BX});var PX=w((lat,pN)=>{\"use strict\";var SX=mX(),ks=J(\"fs\"),S0=J(\"path\"),vX=QX(),co=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(co(e)),jC=(r,e,t)=>r.set(co(e),t),dNe=(r,e)=>{ks.stat(r,(t,i)=>{(t||!i.isDirectory())&&(t=new x0(r,t&&t.code||\"ENOTDIR\")),e(t)})};pN.exports=(r,e,t)=>{r=co(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=co(e.cwd),h=(y,B)=>{y?t(y):(jC(g,r,!0),B&&l?vX(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 dNe(r,h);if(c)return SX(r,{mode:n}).then(y=>h(null,y),h);let C=co(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=co(S0.resolve(r+\"/\"+l));if(P0(i,c))return D0(c,e,t,i,n,s,o,a);ks.mkdir(c,t,xX(c,e,t,i,n,s,o,a))},xX=(r,e,t,i,n,s,o,a)=>l=>{l?ks.lstat(r,(c,u)=>{if(c)c.path=c.path&&co(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,xX(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))},CNe=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)}};pN.exports.sync=(r,e)=>{r=co(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=co(e.cwd),f=y=>{jC(u,r,!0),y&&a&&vX.sync(y,s,o),n&&ks.chmodSync(r,i)};if(u&&P0(u,r)===!0)return f();if(r===g)return CNe(g),f();if(l)return f(SX.sync(r,i));let p=co(S0.relative(g,r)).split(\"/\"),C=null;for(let y=p.shift(),B=g;y&&(B+=\"/\"+y);y=p.shift())if(B=co(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 CN=w((cat,DX)=>{var dN=Object.create(null),{hasOwnProperty:mNe}=Object.prototype;DX.exports=r=>(mNe.call(dN,r)||(dN[r]=r.normalize(\"NFKD\")),dN[r])});var NX=w((uat,FX)=>{var kX=J(\"assert\"),ENe=CN(),INe=nh(),{join:RX}=J(\"path\"),yNe=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,wNe=yNe===\"win32\";FX.exports=()=>{let r=new Map,e=new Map,t=c=>c.split(\"/\").slice(0,-1).reduce((g,f)=>(g.length&&(f=RX(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);kX.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);kX(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=wNe?[\"win32 parallelization disabled\"]:c.map(f=>ENe(INe(RX(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 OX=w((gat,LX)=>{var BNe=process.env.__FAKE_PLATFORM__||process.platform,bNe=BNe===\"win32\",QNe=global.__FAKE_TESTING_FS__||J(\"fs\"),{O_CREAT:SNe,O_TRUNC:vNe,O_WRONLY:xNe,UV_FS_O_FILEMAP:TX=0}=QNe.constants,PNe=bNe&&!!TX,DNe=512*1024,kNe=TX|vNe|SNe|xNe;LX.exports=PNe?r=>r<DNe?kNe:\"w\":()=>\"w\"});var SN=w((fat,ZX)=>{\"use strict\";var RNe=J(\"assert\"),FNe=w0(),jt=J(\"fs\"),NNe=fh(),tA=J(\"path\"),zX=PX(),MX=SF(),TNe=NX(),LNe=vF(),$n=th(),ONe=nh(),MNe=CN(),KX=Symbol(\"onEntry\"),IN=Symbol(\"checkFs\"),UX=Symbol(\"checkFs2\"),F0=Symbol(\"pruneCache\"),yN=Symbol(\"isReusable\"),Rs=Symbol(\"makeFs\"),wN=Symbol(\"file\"),BN=Symbol(\"directory\"),N0=Symbol(\"link\"),HX=Symbol(\"symlink\"),GX=Symbol(\"hardlink\"),YX=Symbol(\"unsupported\"),jX=Symbol(\"checkPath\"),fl=Symbol(\"mkdir\"),Yi=Symbol(\"onError\"),k0=Symbol(\"pending\"),qX=Symbol(\"pend\"),mh=Symbol(\"unpend\"),mN=Symbol(\"ended\"),EN=Symbol(\"maybeClose\"),bN=Symbol(\"skip\"),qC=Symbol(\"doChown\"),JC=Symbol(\"uid\"),WC=Symbol(\"gid\"),zC=Symbol(\"checkedCwd\"),VX=J(\"crypto\"),XX=OX(),KNe=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,VC=KNe===\"win32\",UNe=(r,e)=>{if(!VC)return jt.unlink(r,e);let t=r+\".DELETE.\"+VX.randomBytes(16).toString(\"hex\");jt.rename(r,t,i=>{if(i)return e(i);jt.unlink(t,e)})},HNe=r=>{if(!VC)return jt.unlinkSync(r);let e=r+\".DELETE.\"+VX.randomBytes(16).toString(\"hex\");jt.renameSync(r,e),jt.unlinkSync(e)},JX=(r,e,t)=>r===r>>>0?r:e===e>>>0?e:t,WX=r=>MNe(ONe($n(r))).toLowerCase(),GNe=(r,e)=>{e=WX(e);for(let t of r.keys()){let i=WX(t);(i===e||i.indexOf(e+\"/\")===0)&&r.delete(t)}},YNe=r=>{for(let e of r.keys())r.delete(e)},XC=class extends FNe{constructor(e){if(e||(e={}),e.ondone=t=>{this[mN]=!0,this[EN]()},super(e),this[zC]=!1,this.reservations=TNe(),this.transform=typeof e.transform==\"function\"?e.transform:null,this.writable=!0,this.readable=!1,this[k0]=0,this[mN]=!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(tA.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[KX](t))}warn(e,t,i={}){return(e===\"TAR_BAD_ARCHIVE\"||e===\"TAR_ABORT\")&&(i.recoverable=!1),super.warn(e,t,i)}[EN](){this[mN]&&this[k0]===0&&(this.emit(\"prefinish\"),this.emit(\"finish\"),this.emit(\"end\"),this.emit(\"close\"))}[jX](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]=LNe(t);n&&(e.path=s,this.warn(\"TAR_ENTRY_INFO\",`stripping ${n} from absolute path`,{entry:e,path:t}))}if(tA.isAbsolute(e.path)?e.absolute=$n(tA.resolve(e.path)):e.absolute=$n(tA.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}=tA.win32.parse(e.absolute);e.absolute=t+MX.encode(e.absolute.substr(t.length));let{root:i}=tA.win32.parse(e.path);e.path=i+MX.encode(e.path.substr(i.length))}return!0}[KX](e){if(!this[jX](e))return e.resume();switch(RNe.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[IN](e);case\"CharacterDevice\":case\"BlockDevice\":case\"FIFO\":default:return this[YX](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){zX($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 JX(this.uid,e.uid,this.processUid)}[WC](e){return JX(this.gid,e.gid,this.processGid)}[wN](e,t){let i=e.mode&4095||this.fmode,n=new NNe.WriteStream(e.absolute,{flags:XX(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)}[BN](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()})}[YX](e){e.unsupported=!0,this.warn(\"TAR_ENTRY_UNSUPPORTED\",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[HX](e,t){this[N0](e,e.linkpath,\"symlink\",t)}[GX](e,t){let i=$n(tA.resolve(this.cwd,e.linkpath));this[N0](e,i,\"link\",t)}[qX](){this[k0]++}[mh](){this[k0]--,this[EN]()}[bN](e){this[mh](),e.resume()}[yN](e,t){return e.type===\"File\"&&!this.unlink&&t.isFile()&&t.nlink<=1&&!VC}[IN](e){this[qX]();let t=[e.path];e.linkpath&&t.push(e.linkpath),this.reservations.reserve(t,i=>this[UX](e,i))}[F0](e){e.type===\"SymbolicLink\"?YNe(this.dirCache):e.type!==\"Directory\"&&GNe(this.dirCache,e.absolute)}[UX](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(tA.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[bN](e),i();return}if(a||this[yN](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);UNe(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[wN](t,i);case\"Link\":return this[GX](t,i);case\"SymbolicLink\":return this[HX](t,i);case\"Directory\":case\"GNUDumpDir\":return this[BN](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]}},QN=class extends XC{[Rs](e,t){return super[Rs](e,t,()=>{})}[IN](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(tA.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[bN](e);if(t||this[yN](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(()=>HNe(e.absolute));this[Rs](n,e)}[wN](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,XX(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)})}[BN](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 zX.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=QN;ZX.exports=XC});var rZ=w((hat,tZ)=>{\"use strict\";var jNe=Xf(),T0=SN(),$X=J(\"fs\"),eZ=fh(),_X=J(\"path\"),vN=nh();tZ.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=jNe(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&&qNe(i,e),i.file&&i.sync?JNe(i):i.file?WNe(i,t):i.sync?zNe(i):VNe(i)};var qNe=(r,e)=>{let t=new Map(e.map(s=>[vN(s),!0])),i=r.filter,n=(s,o)=>{let a=o||_X.parse(s).root||\".\",l=s===a?!1:t.has(s)?t.get(s):n(_X.dirname(s),a);return t.set(s,l),l};r.filter=i?(s,o)=>i(s,o)&&n(vN(s)):s=>n(vN(s))},JNe=r=>{let e=new T0.Sync(r),t=r.file,i=$X.statSync(t),n=r.maxReadSize||16*1024*1024;new eZ.ReadStreamSync(t,{readSize:n,size:i.size}).pipe(e)},WNe=(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),$X.stat(n,(l,c)=>{if(l)a(l);else{let u=new eZ.ReadStream(n,{readSize:i,size:c.size});u.on(\"error\",a),u.pipe(t)}})});return e?s.then(e,e):s},zNe=r=>new T0.Sync(r),VNe=r=>new T0(r)});var iZ=w(ci=>{\"use strict\";ci.c=ci.create=M7();ci.r=ci.replace=AN();ci.t=ci.list=B0();ci.u=ci.update=W7();ci.x=ci.extract=rZ();ci.Pack=A0();ci.Unpack=SN();ci.Parse=w0();ci.ReadEntry=qB();ci.WriteEntry=OF();ci.Header=ih();ci.Pax=WB();ci.types=EF()});var aZ=w((Cat,oZ)=>{var xN;oZ.exports.getContent=()=>(typeof xN>\"u\"&&(xN=J(\"zlib\").brotliDecompressSync(Buffer.from(\"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\",\"base64\")).toString()),xN)});var fZ=w((PN,gZ)=>{(function(r,e){typeof PN==\"object\"?gZ.exports=e():typeof define==\"function\"&&define.amd?define(e):r.treeify=e()})(PN,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((Uat,BZ)=>{var fTe=vs(),hTe=gC(),pTe=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,dTe=/^\\w*$/;function CTe(r,e){if(fTe(r))return!1;var t=typeof r;return t==\"number\"||t==\"symbol\"||t==\"boolean\"||r==null||hTe(r)?!0:dTe.test(r)||!pTe.test(r)||e!=null&&r in Object(e)}BZ.exports=CTe});var U0=w((Hat,bZ)=>{var mTe=Fc(),ETe=vn(),ITe=\"[object AsyncFunction]\",yTe=\"[object Function]\",wTe=\"[object GeneratorFunction]\",BTe=\"[object Proxy]\";function bTe(r){if(!ETe(r))return!1;var e=mTe(r);return e==yTe||e==wTe||e==ITe||e==BTe}bZ.exports=bTe});var SZ=w((Gat,QZ)=>{var QTe=ys(),STe=QTe[\"__core-js_shared__\"];QZ.exports=STe});var PZ=w((Yat,xZ)=>{var ON=SZ(),vZ=function(){var r=/[^.]+$/.exec(ON&&ON.keys&&ON.keys.IE_PROTO||\"\");return r?\"Symbol(src)_1.\"+r:\"\"}();function vTe(r){return!!vZ&&vZ in r}xZ.exports=vTe});var MN=w((jat,DZ)=>{var xTe=Function.prototype,PTe=xTe.toString;function DTe(r){if(r!=null){try{return PTe.call(r)}catch{}try{return r+\"\"}catch{}}return\"\"}DZ.exports=DTe});var RZ=w((qat,kZ)=>{var kTe=U0(),RTe=PZ(),FTe=vn(),NTe=MN(),TTe=/[\\\\^$.*+?()[\\]{}|]/g,LTe=/^\\[object .+?Constructor\\]$/,OTe=Function.prototype,MTe=Object.prototype,KTe=OTe.toString,UTe=MTe.hasOwnProperty,HTe=RegExp(\"^\"+KTe.call(UTe).replace(TTe,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\");function GTe(r){if(!FTe(r)||RTe(r))return!1;var e=kTe(r)?HTe:LTe;return e.test(NTe(r))}kZ.exports=GTe});var NZ=w((Jat,FZ)=>{function YTe(r,e){return r==null?void 0:r[e]}FZ.exports=YTe});var pl=w((Wat,TZ)=>{var jTe=RZ(),qTe=NZ();function JTe(r,e){var t=qTe(r,e);return jTe(t)?t:void 0}TZ.exports=JTe});var _C=w((zat,LZ)=>{var WTe=pl(),zTe=WTe(Object,\"create\");LZ.exports=zTe});var KZ=w((Vat,MZ)=>{var OZ=_C();function VTe(){this.__data__=OZ?OZ(null):{},this.size=0}MZ.exports=VTe});var HZ=w((Xat,UZ)=>{function XTe(r){var e=this.has(r)&&delete this.__data__[r];return this.size-=e?1:0,e}UZ.exports=XTe});var YZ=w((Zat,GZ)=>{var ZTe=_C(),_Te=\"__lodash_hash_undefined__\",$Te=Object.prototype,eLe=$Te.hasOwnProperty;function tLe(r){var e=this.__data__;if(ZTe){var t=e[r];return t===_Te?void 0:t}return eLe.call(e,r)?e[r]:void 0}GZ.exports=tLe});var qZ=w((_at,jZ)=>{var rLe=_C(),iLe=Object.prototype,nLe=iLe.hasOwnProperty;function sLe(r){var e=this.__data__;return rLe?e[r]!==void 0:nLe.call(e,r)}jZ.exports=sLe});var WZ=w(($at,JZ)=>{var oLe=_C(),aLe=\"__lodash_hash_undefined__\";function ALe(r,e){var t=this.__data__;return this.size+=this.has(r)?0:1,t[r]=oLe&&e===void 0?aLe:e,this}JZ.exports=ALe});var VZ=w((eAt,zZ)=>{var lLe=KZ(),cLe=HZ(),uLe=YZ(),gLe=qZ(),fLe=WZ();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=lLe;Eh.prototype.delete=cLe;Eh.prototype.get=uLe;Eh.prototype.has=gLe;Eh.prototype.set=fLe;zZ.exports=Eh});var ZZ=w((tAt,XZ)=>{function hLe(){this.__data__=[],this.size=0}XZ.exports=hLe});var Ih=w((rAt,_Z)=>{function pLe(r,e){return r===e||r!==r&&e!==e}_Z.exports=pLe});var $C=w((iAt,$Z)=>{var dLe=Ih();function CLe(r,e){for(var t=r.length;t--;)if(dLe(r[t][0],e))return t;return-1}$Z.exports=CLe});var t_=w((nAt,e_)=>{var mLe=$C(),ELe=Array.prototype,ILe=ELe.splice;function yLe(r){var e=this.__data__,t=mLe(e,r);if(t<0)return!1;var i=e.length-1;return t==i?e.pop():ILe.call(e,t,1),--this.size,!0}e_.exports=yLe});var i_=w((sAt,r_)=>{var wLe=$C();function BLe(r){var e=this.__data__,t=wLe(e,r);return t<0?void 0:e[t][1]}r_.exports=BLe});var s_=w((oAt,n_)=>{var bLe=$C();function QLe(r){return bLe(this.__data__,r)>-1}n_.exports=QLe});var a_=w((aAt,o_)=>{var SLe=$C();function vLe(r,e){var t=this.__data__,i=SLe(t,r);return i<0?(++this.size,t.push([r,e])):t[i][1]=e,this}o_.exports=vLe});var em=w((AAt,A_)=>{var xLe=ZZ(),PLe=t_(),DLe=i_(),kLe=s_(),RLe=a_();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=xLe;yh.prototype.delete=PLe;yh.prototype.get=DLe;yh.prototype.has=kLe;yh.prototype.set=RLe;A_.exports=yh});var H0=w((lAt,l_)=>{var FLe=pl(),NLe=ys(),TLe=FLe(NLe,\"Map\");l_.exports=TLe});var g_=w((cAt,u_)=>{var c_=VZ(),LLe=em(),OLe=H0();function MLe(){this.size=0,this.__data__={hash:new c_,map:new(OLe||LLe),string:new c_}}u_.exports=MLe});var h_=w((uAt,f_)=>{function KLe(r){var e=typeof r;return e==\"string\"||e==\"number\"||e==\"symbol\"||e==\"boolean\"?r!==\"__proto__\":r===null}f_.exports=KLe});var tm=w((gAt,p_)=>{var ULe=h_();function HLe(r,e){var t=r.__data__;return ULe(e)?t[typeof e==\"string\"?\"string\":\"hash\"]:t.map}p_.exports=HLe});var C_=w((fAt,d_)=>{var GLe=tm();function YLe(r){var e=GLe(this,r).delete(r);return this.size-=e?1:0,e}d_.exports=YLe});var E_=w((hAt,m_)=>{var jLe=tm();function qLe(r){return jLe(this,r).get(r)}m_.exports=qLe});var y_=w((pAt,I_)=>{var JLe=tm();function WLe(r){return JLe(this,r).has(r)}I_.exports=WLe});var B_=w((dAt,w_)=>{var zLe=tm();function VLe(r,e){var t=zLe(this,r),i=t.size;return t.set(r,e),this.size+=t.size==i?0:1,this}w_.exports=VLe});var G0=w((CAt,b_)=>{var XLe=g_(),ZLe=C_(),_Le=E_(),$Le=y_(),eOe=B_();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=XLe;wh.prototype.delete=ZLe;wh.prototype.get=_Le;wh.prototype.has=$Le;wh.prototype.set=eOe;b_.exports=wh});var v_=w((mAt,S_)=>{var Q_=G0(),tOe=\"Expected a function\";function KN(r,e){if(typeof r!=\"function\"||e!=null&&typeof e!=\"function\")throw new TypeError(tOe);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(KN.Cache||Q_),t}KN.Cache=Q_;S_.exports=KN});var P_=w((EAt,x_)=>{var rOe=v_(),iOe=500;function nOe(r){var e=rOe(r,function(i){return t.size===iOe&&t.clear(),i}),t=e.cache;return e}x_.exports=nOe});var k_=w((IAt,D_)=>{var sOe=P_(),oOe=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,aOe=/\\\\(\\\\)?/g,AOe=sOe(function(r){var e=[];return r.charCodeAt(0)===46&&e.push(\"\"),r.replace(oOe,function(t,i,n,s){e.push(n?s.replace(aOe,\"$1\"):i||t)}),e});D_.exports=AOe});var Bh=w((yAt,R_)=>{var lOe=vs(),cOe=K0(),uOe=k_(),gOe=Vf();function fOe(r,e){return lOe(r)?r:cOe(r,e)?[r]:uOe(gOe(r))}R_.exports=fOe});var Zc=w((wAt,F_)=>{var hOe=gC(),pOe=1/0;function dOe(r){if(typeof r==\"string\"||hOe(r))return r;var e=r+\"\";return e==\"0\"&&1/r==-pOe?\"-0\":e}F_.exports=dOe});var rm=w((BAt,N_)=>{var COe=Bh(),mOe=Zc();function EOe(r,e){e=COe(e,r);for(var t=0,i=e.length;r!=null&&t<i;)r=r[mOe(e[t++])];return t&&t==i?r:void 0}N_.exports=EOe});var UN=w((bAt,T_)=>{var IOe=pl(),yOe=function(){try{var r=IOe(Object,\"defineProperty\");return r({},\"\",{}),r}catch{}}();T_.exports=yOe});var bh=w((QAt,O_)=>{var L_=UN();function wOe(r,e,t){e==\"__proto__\"&&L_?L_(r,e,{configurable:!0,enumerable:!0,value:t,writable:!0}):r[e]=t}O_.exports=wOe});var Y0=w((SAt,M_)=>{var BOe=bh(),bOe=Ih(),QOe=Object.prototype,SOe=QOe.hasOwnProperty;function vOe(r,e,t){var i=r[e];(!(SOe.call(r,e)&&bOe(i,t))||t===void 0&&!(e in r))&&BOe(r,e,t)}M_.exports=vOe});var im=w((vAt,K_)=>{var xOe=9007199254740991,POe=/^(?:0|[1-9]\\d*)$/;function DOe(r,e){var t=typeof r;return e=e==null?xOe:e,!!e&&(t==\"number\"||t!=\"symbol\"&&POe.test(r))&&r>-1&&r%1==0&&r<e}K_.exports=DOe});var HN=w((xAt,H_)=>{var kOe=Y0(),ROe=Bh(),FOe=im(),U_=vn(),NOe=Zc();function TOe(r,e,t,i){if(!U_(r))return r;e=ROe(e,r);for(var n=-1,s=e.length,o=s-1,a=r;a!=null&&++n<s;){var l=NOe(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=U_(u)?u:FOe(e[n+1])?[]:{})}kOe(a,l,c),a=a[l]}return r}H_.exports=TOe});var Y_=w((PAt,G_)=>{var LOe=rm(),OOe=HN(),MOe=Bh();function KOe(r,e,t){for(var i=-1,n=e.length,s={};++i<n;){var o=e[i],a=LOe(r,o);t(a,o)&&OOe(s,MOe(o,r),a)}return s}G_.exports=KOe});var q_=w((DAt,j_)=>{function UOe(r,e){return r!=null&&e in Object(r)}j_.exports=UOe});var W_=w((kAt,J_)=>{var HOe=Fc(),GOe=Wo(),YOe=\"[object Arguments]\";function jOe(r){return GOe(r)&&HOe(r)==YOe}J_.exports=jOe});var nm=w((RAt,X_)=>{var z_=W_(),qOe=Wo(),V_=Object.prototype,JOe=V_.hasOwnProperty,WOe=V_.propertyIsEnumerable,zOe=z_(function(){return arguments}())?z_:function(r){return qOe(r)&&JOe.call(r,\"callee\")&&!WOe.call(r,\"callee\")};X_.exports=zOe});var j0=w((FAt,Z_)=>{var VOe=9007199254740991;function XOe(r){return typeof r==\"number\"&&r>-1&&r%1==0&&r<=VOe}Z_.exports=XOe});var GN=w((NAt,__)=>{var ZOe=Bh(),_Oe=nm(),$Oe=vs(),eMe=im(),tMe=j0(),rMe=Zc();function iMe(r,e,t){e=ZOe(e,r);for(var i=-1,n=e.length,s=!1;++i<n;){var o=rMe(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&&tMe(n)&&eMe(o,n)&&($Oe(r)||_Oe(r)))}__.exports=iMe});var YN=w((TAt,$_)=>{var nMe=q_(),sMe=GN();function oMe(r,e){return r!=null&&sMe(r,e,nMe)}$_.exports=oMe});var t$=w((LAt,e$)=>{var aMe=Y_(),AMe=YN();function lMe(r,e){return aMe(r,e,function(t,i){return AMe(r,i)})}e$.exports=lMe});var q0=w((OAt,r$)=>{function cMe(r,e){for(var t=-1,i=e.length,n=r.length;++t<i;)r[n+t]=e[t];return r}r$.exports=cMe});var o$=w((MAt,s$)=>{var i$=Rc(),uMe=nm(),gMe=vs(),n$=i$?i$.isConcatSpreadable:void 0;function fMe(r){return gMe(r)||uMe(r)||!!(n$&&r&&r[n$])}s$.exports=fMe});var l$=w((KAt,A$)=>{var hMe=q0(),pMe=o$();function a$(r,e,t,i,n){var s=-1,o=r.length;for(t||(t=pMe),n||(n=[]);++s<o;){var a=r[s];e>0&&t(a)?e>1?a$(a,e-1,t,i,n):hMe(n,a):i||(n[n.length]=a)}return n}A$.exports=a$});var u$=w((UAt,c$)=>{var dMe=l$();function CMe(r){var e=r==null?0:r.length;return e?dMe(r,1):[]}c$.exports=CMe});var f$=w((HAt,g$)=>{function mMe(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)}g$.exports=mMe});var jN=w((GAt,p$)=>{var EMe=f$(),h$=Math.max;function IMe(r,e,t){return e=h$(e===void 0?r.length-1:e,0),function(){for(var i=arguments,n=-1,s=h$(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),EMe(r,this,a)}}p$.exports=IMe});var C$=w((YAt,d$)=>{function yMe(r){return function(){return r}}d$.exports=yMe});var J0=w((jAt,m$)=>{function wMe(r){return r}m$.exports=wMe});var y$=w((qAt,I$)=>{var BMe=C$(),E$=UN(),bMe=J0(),QMe=E$?function(r,e){return E$(r,\"toString\",{configurable:!0,enumerable:!1,value:BMe(e),writable:!0})}:bMe;I$.exports=QMe});var B$=w((JAt,w$)=>{var SMe=800,vMe=16,xMe=Date.now;function PMe(r){var e=0,t=0;return function(){var i=xMe(),n=vMe-(i-t);if(t=i,n>0){if(++e>=SMe)return arguments[0]}else e=0;return r.apply(void 0,arguments)}}w$.exports=PMe});var qN=w((WAt,b$)=>{var DMe=y$(),kMe=B$(),RMe=kMe(DMe);b$.exports=RMe});var S$=w((zAt,Q$)=>{var FMe=u$(),NMe=jN(),TMe=qN();function LMe(r){return TMe(NMe(r,void 0,FMe),r+\"\")}Q$.exports=LMe});var x$=w((VAt,v$)=>{var OMe=t$(),MMe=S$(),KMe=MMe(function(r,e){return r==null?{}:OMe(r,e)});v$.exports=KMe});var K$=w((mct,M$)=>{\"use strict\";var _N;try{_N=Map}catch{}var $N;try{$N=Set}catch{}function L$(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(O$);if(_N&&r instanceof _N)return new Map(Array.from(r.entries()));if($N&&r instanceof $N)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]:L$(r[n],e,t)}return i}return r}function O$(r){return L$(r,[],[])}M$.exports=O$});var om=w(eT=>{\"use strict\";Object.defineProperty(eT,\"__esModule\",{value:!0});eT.default=e1e;var zMe=Object.prototype.toString,VMe=Error.prototype.toString,XMe=RegExp.prototype.toString,ZMe=typeof Symbol<\"u\"?Symbol.prototype.toString:()=>\"\",_Me=/^Symbol\\((.*)\\)(.*)$/;function $Me(r){return r!=+r?\"NaN\":r===0&&1/r<0?\"-0\":\"\"+r}function U$(r,e=!1){if(r==null||r===!0||r===!1)return\"\"+r;let t=typeof r;if(t===\"number\")return $Me(r);if(t===\"string\")return e?`\"${r}\"`:r;if(t===\"function\")return\"[Function \"+(r.name||\"anonymous\")+\"]\";if(t===\"symbol\")return ZMe.call(r).replace(_Me,\"Symbol($1)\");let i=zMe.call(r).slice(8,-1);return i===\"Date\"?isNaN(r.getTime())?\"\"+r:r.toISOString(r):i===\"Error\"||r instanceof Error?\"[\"+VMe.call(r)+\"]\":i===\"RegExp\"?XMe.call(r):null}function e1e(r,e){let t=U$(r,e);return t!==null?t:JSON.stringify(r,function(i,n){let s=U$(this[i],e);return s!==null?s:n},2)}});var iA=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 H$=t1e(om());function t1e(r){return r&&r.__esModule?r:{default:r}}var G$={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,H$.default)(t,!0)}\\``+(n?` (cast from the value \\`${(0,H$.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=G$;var Y$={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=Y$;var j$={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=j$;var q$={min:\"${path} field must be later than ${min}\",max:\"${path} field must be at earlier than ${max}\"};Ei.date=q$;var J$={isValue:\"${path} field must be ${value}\"};Ei.boolean=J$;var W$={noUnknown:\"${path} field has unspecified keys: ${unknown}\"};Ei.object=W$;var z$={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=z$;var r1e=Object.assign(Object.create(null),{mixed:G$,string:Y$,number:j$,date:q$,object:W$,array:z$,boolean:J$});Ei.default=r1e});var X$=w((yct,V$)=>{var i1e=Object.prototype,n1e=i1e.hasOwnProperty;function s1e(r,e){return r!=null&&n1e.call(r,e)}V$.exports=s1e});var am=w((wct,Z$)=>{var o1e=X$(),a1e=GN();function A1e(r,e){return r!=null&&a1e(r,e,o1e)}Z$.exports=A1e});var xh=w(eb=>{\"use strict\";Object.defineProperty(eb,\"__esModule\",{value:!0});eb.default=void 0;var l1e=r=>r&&r.__isYupSchema__;eb.default=l1e});var $$=w(tb=>{\"use strict\";Object.defineProperty(tb,\"__esModule\",{value:!0});tb.default=void 0;var c1e=_$(am()),u1e=_$(xh());function _$(r){return r&&r.__esModule?r:{default:r}}var tT=class{constructor(e,t){if(this.refs=e,this.refs=e,typeof t==\"function\"){this.fn=t;return}if(!(0,c1e.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,u1e.default)(n))throw new TypeError(\"conditions must return a schema object\");return n.resolve(t)}},g1e=tT;tb.default=g1e});var iT=w(rT=>{\"use strict\";Object.defineProperty(rT,\"__esModule\",{value:!0});rT.default=f1e;function f1e(r){return r==null?[]:[].concat(r)}});var _c=w(rb=>{\"use strict\";Object.defineProperty(rb,\"__esModule\",{value:!0});rb.default=void 0;var h1e=eee(om()),p1e=eee(iT());function eee(r){return r&&r.__esModule?r:{default:r}}function nT(){return nT=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},nT.apply(this,arguments)}var d1e=/\\$\\{\\s*(\\w+)\\s*\\}/g,Ph=class extends Error{static formatError(e,t){let i=t.label||t.path||\"this\";return i!==t.path&&(t=nT({},t,{path:i})),typeof e==\"string\"?e.replace(d1e,(n,s)=>(0,h1e.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,p1e.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)}};rb.default=Ph});var ib=w(oT=>{\"use strict\";Object.defineProperty(oT,\"__esModule\",{value:!0});oT.default=E1e;var sT=C1e(_c());function C1e(r){return r&&r.__esModule?r:{default:r}}var m1e=r=>{let e=!1;return(...t)=>{e||(e=!0,r(...t))}};function E1e(r,e){let{endEarly:t,tests:i,args:n,value:s,errors:o,sort:a,path:l}=r,c=m1e(e),u=i.length,g=[];if(o=o||[],!u)return o.length?c(new sT.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(!sT.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 sT.default(o,s,l),s);return}c(null,s)}})}}});var ree=w((xct,tee)=>{function I1e(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}}tee.exports=I1e});var aT=w((Pct,iee)=>{var y1e=ree(),w1e=y1e();iee.exports=w1e});var see=w((Dct,nee)=>{function B1e(r,e){for(var t=-1,i=Array(r);++t<r;)i[t]=e(t);return i}nee.exports=B1e});var aee=w((kct,oee)=>{function b1e(){return!1}oee.exports=b1e});var lm=w((Am,Dh)=>{var Q1e=ys(),S1e=aee(),cee=typeof Am==\"object\"&&Am&&!Am.nodeType&&Am,Aee=cee&&typeof Dh==\"object\"&&Dh&&!Dh.nodeType&&Dh,v1e=Aee&&Aee.exports===cee,lee=v1e?Q1e.Buffer:void 0,x1e=lee?lee.isBuffer:void 0,P1e=x1e||S1e;Dh.exports=P1e});var gee=w((Rct,uee)=>{var D1e=Fc(),k1e=j0(),R1e=Wo(),F1e=\"[object Arguments]\",N1e=\"[object Array]\",T1e=\"[object Boolean]\",L1e=\"[object Date]\",O1e=\"[object Error]\",M1e=\"[object Function]\",K1e=\"[object Map]\",U1e=\"[object Number]\",H1e=\"[object Object]\",G1e=\"[object RegExp]\",Y1e=\"[object Set]\",j1e=\"[object String]\",q1e=\"[object WeakMap]\",J1e=\"[object ArrayBuffer]\",W1e=\"[object DataView]\",z1e=\"[object Float32Array]\",V1e=\"[object Float64Array]\",X1e=\"[object Int8Array]\",Z1e=\"[object Int16Array]\",_1e=\"[object Int32Array]\",$1e=\"[object Uint8Array]\",eKe=\"[object Uint8ClampedArray]\",tKe=\"[object Uint16Array]\",rKe=\"[object Uint32Array]\",Ir={};Ir[z1e]=Ir[V1e]=Ir[X1e]=Ir[Z1e]=Ir[_1e]=Ir[$1e]=Ir[eKe]=Ir[tKe]=Ir[rKe]=!0;Ir[F1e]=Ir[N1e]=Ir[J1e]=Ir[T1e]=Ir[W1e]=Ir[L1e]=Ir[O1e]=Ir[M1e]=Ir[K1e]=Ir[U1e]=Ir[H1e]=Ir[G1e]=Ir[Y1e]=Ir[j1e]=Ir[q1e]=!1;function iKe(r){return R1e(r)&&k1e(r.length)&&!!Ir[D1e(r)]}uee.exports=iKe});var nb=w((Fct,fee)=>{function nKe(r){return function(e){return r(e)}}fee.exports=nKe});var sb=w((cm,kh)=>{var sKe=WD(),hee=typeof cm==\"object\"&&cm&&!cm.nodeType&&cm,um=hee&&typeof kh==\"object\"&&kh&&!kh.nodeType&&kh,oKe=um&&um.exports===hee,AT=oKe&&sKe.process,aKe=function(){try{var r=um&&um.require&&um.require(\"util\").types;return r||AT&&AT.binding&&AT.binding(\"util\")}catch{}}();kh.exports=aKe});var ob=w((Nct,Cee)=>{var AKe=gee(),lKe=nb(),pee=sb(),dee=pee&&pee.isTypedArray,cKe=dee?lKe(dee):AKe;Cee.exports=cKe});var lT=w((Tct,mee)=>{var uKe=see(),gKe=nm(),fKe=vs(),hKe=lm(),pKe=im(),dKe=ob(),CKe=Object.prototype,mKe=CKe.hasOwnProperty;function EKe(r,e){var t=fKe(r),i=!t&&gKe(r),n=!t&&!i&&hKe(r),s=!t&&!i&&!n&&dKe(r),o=t||i||n||s,a=o?uKe(r.length,String):[],l=a.length;for(var c in r)(e||mKe.call(r,c))&&!(o&&(c==\"length\"||n&&(c==\"offset\"||c==\"parent\")||s&&(c==\"buffer\"||c==\"byteLength\"||c==\"byteOffset\")||pKe(c,l)))&&a.push(c);return a}mee.exports=EKe});var ab=w((Lct,Eee)=>{var IKe=Object.prototype;function yKe(r){var e=r&&r.constructor,t=typeof e==\"function\"&&e.prototype||IKe;return r===t}Eee.exports=yKe});var cT=w((Oct,Iee)=>{function wKe(r,e){return function(t){return r(e(t))}}Iee.exports=wKe});var wee=w((Mct,yee)=>{var BKe=cT(),bKe=BKe(Object.keys,Object);yee.exports=bKe});var bee=w((Kct,Bee)=>{var QKe=ab(),SKe=wee(),vKe=Object.prototype,xKe=vKe.hasOwnProperty;function PKe(r){if(!QKe(r))return SKe(r);var e=[];for(var t in Object(r))xKe.call(r,t)&&t!=\"constructor\"&&e.push(t);return e}Bee.exports=PKe});var gm=w((Uct,Qee)=>{var DKe=U0(),kKe=j0();function RKe(r){return r!=null&&kKe(r.length)&&!DKe(r)}Qee.exports=RKe});var Rh=w((Hct,See)=>{var FKe=lT(),NKe=bee(),TKe=gm();function LKe(r){return TKe(r)?FKe(r):NKe(r)}See.exports=LKe});var uT=w((Gct,vee)=>{var OKe=aT(),MKe=Rh();function KKe(r,e){return r&&OKe(r,e,MKe)}vee.exports=KKe});var Pee=w((Yct,xee)=>{var UKe=em();function HKe(){this.__data__=new UKe,this.size=0}xee.exports=HKe});var kee=w((jct,Dee)=>{function GKe(r){var e=this.__data__,t=e.delete(r);return this.size=e.size,t}Dee.exports=GKe});var Fee=w((qct,Ree)=>{function YKe(r){return this.__data__.get(r)}Ree.exports=YKe});var Tee=w((Jct,Nee)=>{function jKe(r){return this.__data__.has(r)}Nee.exports=jKe});var Oee=w((Wct,Lee)=>{var qKe=em(),JKe=H0(),WKe=G0(),zKe=200;function VKe(r,e){var t=this.__data__;if(t instanceof qKe){var i=t.__data__;if(!JKe||i.length<zKe-1)return i.push([r,e]),this.size=++t.size,this;t=this.__data__=new WKe(i)}return t.set(r,e),this.size=t.size,this}Lee.exports=VKe});var fm=w((zct,Mee)=>{var XKe=em(),ZKe=Pee(),_Ke=kee(),$Ke=Fee(),eUe=Tee(),tUe=Oee();function Fh(r){var e=this.__data__=new XKe(r);this.size=e.size}Fh.prototype.clear=ZKe;Fh.prototype.delete=_Ke;Fh.prototype.get=$Ke;Fh.prototype.has=eUe;Fh.prototype.set=tUe;Mee.exports=Fh});var Uee=w((Vct,Kee)=>{var rUe=\"__lodash_hash_undefined__\";function iUe(r){return this.__data__.set(r,rUe),this}Kee.exports=iUe});var Gee=w((Xct,Hee)=>{function nUe(r){return this.__data__.has(r)}Hee.exports=nUe});var jee=w((Zct,Yee)=>{var sUe=G0(),oUe=Uee(),aUe=Gee();function Ab(r){var e=-1,t=r==null?0:r.length;for(this.__data__=new sUe;++e<t;)this.add(r[e])}Ab.prototype.add=Ab.prototype.push=oUe;Ab.prototype.has=aUe;Yee.exports=Ab});var Jee=w((_ct,qee)=>{function AUe(r,e){for(var t=-1,i=r==null?0:r.length;++t<i;)if(e(r[t],t,r))return!0;return!1}qee.exports=AUe});var zee=w(($ct,Wee)=>{function lUe(r,e){return r.has(e)}Wee.exports=lUe});var gT=w((eut,Vee)=>{var cUe=jee(),uUe=Jee(),gUe=zee(),fUe=1,hUe=2;function pUe(r,e,t,i,n,s){var o=t&fUe,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&hUe?new cUe: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(!uUe(e,function(B,v){if(!gUe(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}Vee.exports=pUe});var fT=w((tut,Xee)=>{var dUe=ys(),CUe=dUe.Uint8Array;Xee.exports=CUe});var _ee=w((rut,Zee)=>{function mUe(r){var e=-1,t=Array(r.size);return r.forEach(function(i,n){t[++e]=[n,i]}),t}Zee.exports=mUe});var ete=w((iut,$ee)=>{function EUe(r){var e=-1,t=Array(r.size);return r.forEach(function(i){t[++e]=i}),t}$ee.exports=EUe});var ste=w((nut,nte)=>{var tte=Rc(),rte=fT(),IUe=Ih(),yUe=gT(),wUe=_ee(),BUe=ete(),bUe=1,QUe=2,SUe=\"[object Boolean]\",vUe=\"[object Date]\",xUe=\"[object Error]\",PUe=\"[object Map]\",DUe=\"[object Number]\",kUe=\"[object RegExp]\",RUe=\"[object Set]\",FUe=\"[object String]\",NUe=\"[object Symbol]\",TUe=\"[object ArrayBuffer]\",LUe=\"[object DataView]\",ite=tte?tte.prototype:void 0,hT=ite?ite.valueOf:void 0;function OUe(r,e,t,i,n,s,o){switch(t){case LUe:if(r.byteLength!=e.byteLength||r.byteOffset!=e.byteOffset)return!1;r=r.buffer,e=e.buffer;case TUe:return!(r.byteLength!=e.byteLength||!s(new rte(r),new rte(e)));case SUe:case vUe:case DUe:return IUe(+r,+e);case xUe:return r.name==e.name&&r.message==e.message;case kUe:case FUe:return r==e+\"\";case PUe:var a=wUe;case RUe:var l=i&bUe;if(a||(a=BUe),r.size!=e.size&&!l)return!1;var c=o.get(r);if(c)return c==e;i|=QUe,o.set(r,e);var u=yUe(a(r),a(e),i,n,s,o);return o.delete(r),u;case NUe:if(hT)return hT.call(r)==hT.call(e)}return!1}nte.exports=OUe});var pT=w((sut,ote)=>{var MUe=q0(),KUe=vs();function UUe(r,e,t){var i=e(r);return KUe(r)?i:MUe(i,t(r))}ote.exports=UUe});var Ate=w((out,ate)=>{function HUe(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}ate.exports=HUe});var dT=w((aut,lte)=>{function GUe(){return[]}lte.exports=GUe});var lb=w((Aut,ute)=>{var YUe=Ate(),jUe=dT(),qUe=Object.prototype,JUe=qUe.propertyIsEnumerable,cte=Object.getOwnPropertySymbols,WUe=cte?function(r){return r==null?[]:(r=Object(r),YUe(cte(r),function(e){return JUe.call(r,e)}))}:jUe;ute.exports=WUe});var CT=w((lut,gte)=>{var zUe=pT(),VUe=lb(),XUe=Rh();function ZUe(r){return zUe(r,XUe,VUe)}gte.exports=ZUe});var pte=w((cut,hte)=>{var fte=CT(),_Ue=1,$Ue=Object.prototype,e2e=$Ue.hasOwnProperty;function t2e(r,e,t,i,n,s){var o=t&_Ue,a=fte(r),l=a.length,c=fte(e),u=c.length;if(l!=u&&!o)return!1;for(var g=l;g--;){var f=a[g];if(!(o?f in e:e2e.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}hte.exports=t2e});var Cte=w((uut,dte)=>{var r2e=pl(),i2e=ys(),n2e=r2e(i2e,\"DataView\");dte.exports=n2e});var Ete=w((gut,mte)=>{var s2e=pl(),o2e=ys(),a2e=s2e(o2e,\"Promise\");mte.exports=a2e});var yte=w((fut,Ite)=>{var A2e=pl(),l2e=ys(),c2e=A2e(l2e,\"Set\");Ite.exports=c2e});var Bte=w((hut,wte)=>{var u2e=pl(),g2e=ys(),f2e=u2e(g2e,\"WeakMap\");wte.exports=f2e});var hm=w((put,Dte)=>{var mT=Cte(),ET=H0(),IT=Ete(),yT=yte(),wT=Bte(),Pte=Fc(),Nh=MN(),bte=\"[object Map]\",h2e=\"[object Object]\",Qte=\"[object Promise]\",Ste=\"[object Set]\",vte=\"[object WeakMap]\",xte=\"[object DataView]\",p2e=Nh(mT),d2e=Nh(ET),C2e=Nh(IT),m2e=Nh(yT),E2e=Nh(wT),$c=Pte;(mT&&$c(new mT(new ArrayBuffer(1)))!=xte||ET&&$c(new ET)!=bte||IT&&$c(IT.resolve())!=Qte||yT&&$c(new yT)!=Ste||wT&&$c(new wT)!=vte)&&($c=function(r){var e=Pte(r),t=e==h2e?r.constructor:void 0,i=t?Nh(t):\"\";if(i)switch(i){case p2e:return xte;case d2e:return bte;case C2e:return Qte;case m2e:return Ste;case E2e:return vte}return e});Dte.exports=$c});var Mte=w((dut,Ote)=>{var BT=fm(),I2e=gT(),y2e=ste(),w2e=pte(),kte=hm(),Rte=vs(),Fte=lm(),B2e=ob(),b2e=1,Nte=\"[object Arguments]\",Tte=\"[object Array]\",cb=\"[object Object]\",Q2e=Object.prototype,Lte=Q2e.hasOwnProperty;function S2e(r,e,t,i,n,s){var o=Rte(r),a=Rte(e),l=o?Tte:kte(r),c=a?Tte:kte(e);l=l==Nte?cb:l,c=c==Nte?cb:c;var u=l==cb,g=c==cb,f=l==c;if(f&&Fte(r)){if(!Fte(e))return!1;o=!0,u=!1}if(f&&!u)return s||(s=new BT),o||B2e(r)?I2e(r,e,t,i,n,s):y2e(r,e,l,t,i,n,s);if(!(t&b2e)){var h=u&&Lte.call(r,\"__wrapped__\"),p=g&&Lte.call(e,\"__wrapped__\");if(h||p){var C=h?r.value():r,y=p?e.value():e;return s||(s=new BT),n(C,y,t,i,s)}}return f?(s||(s=new BT),w2e(r,e,t,i,n,s)):!1}Ote.exports=S2e});var bT=w((Cut,Hte)=>{var v2e=Mte(),Kte=Wo();function Ute(r,e,t,i,n){return r===e?!0:r==null||e==null||!Kte(r)&&!Kte(e)?r!==r&&e!==e:v2e(r,e,t,i,Ute,n)}Hte.exports=Ute});var Yte=w((mut,Gte)=>{var x2e=fm(),P2e=bT(),D2e=1,k2e=2;function R2e(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 x2e;if(i)var f=i(c,u,l,r,e,g);if(!(f===void 0?P2e(u,c,D2e|k2e,i,g):f))return!1}}return!0}Gte.exports=R2e});var QT=w((Eut,jte)=>{var F2e=vn();function N2e(r){return r===r&&!F2e(r)}jte.exports=N2e});var Jte=w((Iut,qte)=>{var T2e=QT(),L2e=Rh();function O2e(r){for(var e=L2e(r),t=e.length;t--;){var i=e[t],n=r[i];e[t]=[i,n,T2e(n)]}return e}qte.exports=O2e});var ST=w((yut,Wte)=>{function M2e(r,e){return function(t){return t==null?!1:t[r]===e&&(e!==void 0||r in Object(t))}}Wte.exports=M2e});var Vte=w((wut,zte)=>{var K2e=Yte(),U2e=Jte(),H2e=ST();function G2e(r){var e=U2e(r);return e.length==1&&e[0][2]?H2e(e[0][0],e[0][1]):function(t){return t===r||K2e(t,r,e)}}zte.exports=G2e});var ub=w((But,Xte)=>{var Y2e=rm();function j2e(r,e,t){var i=r==null?void 0:Y2e(r,e);return i===void 0?t:i}Xte.exports=j2e});var _te=w((but,Zte)=>{var q2e=bT(),J2e=ub(),W2e=YN(),z2e=K0(),V2e=QT(),X2e=ST(),Z2e=Zc(),_2e=1,$2e=2;function eHe(r,e){return z2e(r)&&V2e(e)?X2e(Z2e(r),e):function(t){var i=J2e(t,r);return i===void 0&&i===e?W2e(t,r):q2e(e,i,_2e|$2e)}}Zte.exports=eHe});var ere=w((Qut,$te)=>{function tHe(r){return function(e){return e==null?void 0:e[r]}}$te.exports=tHe});var rre=w((Sut,tre)=>{var rHe=rm();function iHe(r){return function(e){return rHe(e,r)}}tre.exports=iHe});var nre=w((vut,ire)=>{var nHe=ere(),sHe=rre(),oHe=K0(),aHe=Zc();function AHe(r){return oHe(r)?nHe(aHe(r)):sHe(r)}ire.exports=AHe});var vT=w((xut,sre)=>{var lHe=Vte(),cHe=_te(),uHe=J0(),gHe=vs(),fHe=nre();function hHe(r){return typeof r==\"function\"?r:r==null?uHe:typeof r==\"object\"?gHe(r)?cHe(r[0],r[1]):lHe(r):fHe(r)}sre.exports=hHe});var xT=w((Put,ore)=>{var pHe=bh(),dHe=uT(),CHe=vT();function mHe(r,e){var t={};return e=CHe(e,3),dHe(r,function(i,n,s){pHe(t,n,e(i,n,s))}),t}ore.exports=mHe});var pm=w((Dut,ure)=>{\"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 EHe=/[^.^\\]^[]+|(?=\\[\\]|\\.\\.)/g,cre=/^\\d+$/,IHe=/^\\d/,yHe=/[~`!#$%\\^&*+=\\-\\[\\]\\\\';,/{}|\\\\\":<>\\?]/g,wHe=/^\\s*(['\"]?)(.*?)(\\1)\\s*$/,kT=512,are=new eu(kT),Are=new eu(kT),lre=new eu(kT);ure.exports={Cache:eu,split:DT,normalizePath:PT,setter:function(r){var e=PT(r);return Are.get(r)||Are.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=PT(r);return lre.get(r)||lre.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+(RT(t)||cre.test(t)?\"[\"+t+\"]\":(e?\".\":\"\")+t)},\"\")},forEach:function(r,e,t){BHe(Array.isArray(r)?r:DT(r),e,t)}};function PT(r){return are.get(r)||are.set(r,DT(r).map(function(e){return e.replace(wHe,\"$2\")}))}function DT(r){return r.match(EHe)}function BHe(r,e,t){var i=r.length,n,s,o,a;for(s=0;s<i;s++)n=r[s],n&&(SHe(n)&&(n='\"'+n+'\"'),a=RT(n),o=!a&&/^\\d+$/.test(n),e.call(t,n,a,o,s,r))}function RT(r){return typeof r==\"string\"&&r&&[\"'\",'\"'].indexOf(r.charAt(0))!==-1}function bHe(r){return r.match(IHe)&&!r.match(cre)}function QHe(r){return yHe.test(r)}function SHe(r){return!RT(r)&&(bHe(r)||QHe(r))}});var tu=w(Cm=>{\"use strict\";Object.defineProperty(Cm,\"__esModule\",{value:!0});Cm.create=xHe;Cm.default=void 0;var vHe=pm(),gb={context:\"$\",value:\".\"};function xHe(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]===gb.context,this.isValue=this.key[0]===gb.value,this.isSibling=!this.isContext&&!this.isValue;let i=this.isContext?gb.context:this.isValue?gb.value:\"\";this.path=this.key.slice(i.length),this.getter=this.path&&(0,vHe.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 gre=w(NT=>{\"use strict\";Object.defineProperty(NT,\"__esModule\",{value:!0});NT.default=RHe;var PHe=FT(xT()),fb=FT(_c()),DHe=FT(tu());function FT(r){return r&&r.__esModule?r:{default:r}}function hb(){return hb=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},hb.apply(this,arguments)}function kHe(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 RHe(r){function e(t,i){let{value:n,path:s=\"\",label:o,options:a,originalValue:l,sync:c}=t,u=kHe(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 DHe.default.isRef(j)?j.getValue(n,C,y):j}function v(j={}){let $=(0,PHe.default)(hb({value:n,originalValue:l,label:o,path:j.path||s},h,j.params),B),V=new fb.default(fb.default.formatError(j.message||p,$),n,$.path,j.type||g);return V.params=$,V}let D=hb({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=>{fb.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}fb.default.isError(T)?i(T):T?i(null,T):i(v())}return e.OPTIONS=r,e}});var TT=w(mm=>{\"use strict\";Object.defineProperty(mm,\"__esModule\",{value:!0});mm.getIn=fre;mm.default=void 0;var FHe=pm(),NHe=r=>r.substr(0,r.length-1).substr(1);function fre(r,e,t,i=t){let n,s,o;return e?((0,FHe.forEach)(e,(a,l,c)=>{let u=l?NHe(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 THe=(r,e,t,i)=>fre(r,e,t,i).schema,LHe=THe;mm.default=LHe});var pre=w(pb=>{\"use strict\";Object.defineProperty(pb,\"__esModule\",{value:!0});pb.default=void 0;var hre=OHe(tu());function OHe(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){hre.default.isRef(e)?this.refs.set(e.key,e):this.list.add(e)}delete(e){hre.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}};pb.default=Em});var sA=w(Cb=>{\"use strict\";Object.defineProperty(Cb,\"__esModule\",{value:!0});Cb.default=void 0;var dre=nA(K$()),Th=iA(),MHe=nA($$()),Cre=nA(ib()),db=nA(gre()),mre=nA(om()),KHe=nA(tu()),UHe=TT(),HHe=nA(iT()),Ere=nA(_c()),Ire=nA(pre());function nA(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 uo=class{constructor(e){this.deps=[],this.conditions=[],this._whitelist=new Ire.default,this._blacklist=new Ire.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,dre.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,mre.default)(e),o=(0,mre.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,Cre.default)({args:g,value:u,path:s,sync:n,tests:f,endEarly:c},h=>{if(h)return void i(h,u);(0,Cre.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(Ere.default.isError(i))return!1;throw i})}isValidSync(e,t){try{return this.validateSync(e,t),!0}catch(i){if(Ere.default.isError(i))return!1;throw i}}_getDefault(){let e=this.spec.default;return e==null?e:typeof e==\"function\"?e.call(this):(0,dre.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,db.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,HHe.default)(e).map(s=>new KHe.default(s));return n.forEach(s=>{s.isSibling&&i.deps.push(s.key)}),i.conditions.push(new MHe.default(n,t)),i}typeError(e){var t=this.clone();return t._typeError=(0,db.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,db.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,db.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)}}};Cb.default=uo;uo.prototype.__isYupSchema__=!0;for(let r of[\"validate\",\"validateSync\"])uo.prototype[`${r}At`]=function(e,t,i={}){let{parent:n,parentPath:s,schema:o}=(0,UHe.getIn)(this,e,t,i.context);return o[r](n&&n[s],Fs({},i,{parent:n,path:e}))};for(let r of[\"equals\",\"is\"])uo.prototype[r]=uo.prototype.oneOf;for(let r of[\"not\",\"nope\"])uo.prototype[r]=uo.prototype.notOneOf;uo.prototype.optional=uo.prototype.notRequired});var wre=w(Im=>{\"use strict\";Object.defineProperty(Im,\"__esModule\",{value:!0});Im.create=yre;Im.default=void 0;var GHe=YHe(sA());function YHe(r){return r&&r.__esModule?r:{default:r}}var LT=GHe.default,jHe=LT;Im.default=jHe;function yre(){return new LT}yre.prototype=LT.prototype});var Lh=w(mb=>{\"use strict\";Object.defineProperty(mb,\"__esModule\",{value:!0});mb.default=void 0;var qHe=r=>r==null;mb.default=qHe});var vre=w(wm=>{\"use strict\";Object.defineProperty(wm,\"__esModule\",{value:!0});wm.create=Sre;wm.default=void 0;var JHe=Qre(sA()),Bre=iA(),bre=Qre(Lh());function Qre(r){return r&&r.__esModule?r:{default:r}}function Sre(){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=Bre.boolean.isValue){return this.test({message:e,name:\"is-value\",exclusive:!0,params:{value:\"true\"},test(t){return(0,bre.default)(t)||t===!0}})}isFalse(e=Bre.boolean.isValue){return this.test({message:e,name:\"is-value\",exclusive:!0,params:{value:\"false\"},test(t){return(0,bre.default)(t)||t===!1}})}};wm.default=ym;Sre.prototype=ym.prototype});var Dre=w(bm=>{\"use strict\";Object.defineProperty(bm,\"__esModule\",{value:!0});bm.create=Pre;bm.default=void 0;var ia=iA(),oA=xre(Lh()),WHe=xre(sA());function xre(r){return r&&r.__esModule?r:{default:r}}var zHe=/^((([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,VHe=/^((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,XHe=/^(?:[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,ZHe=r=>(0,oA.default)(r)||r===r.trim(),_He={}.toString();function Pre(){return new Bm}var Bm=class extends WHe.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===_He?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,oA.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,oA.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,oA.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,oA.default)(o)||o===\"\"&&i||o.search(e)!==-1})}email(e=ia.string.email){return this.matches(zHe,{name:\"email\",message:e,excludeEmptyString:!0})}url(e=ia.string.url){return this.matches(VHe,{name:\"url\",message:e,excludeEmptyString:!0})}uuid(e=ia.string.uuid){return this.matches(XHe,{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:ZHe})}lowercase(e=ia.string.lowercase){return this.transform(t=>(0,oA.default)(t)?t:t.toLowerCase()).test({message:e,name:\"string_case\",exclusive:!0,test:t=>(0,oA.default)(t)||t===t.toLowerCase()})}uppercase(e=ia.string.uppercase){return this.transform(t=>(0,oA.default)(t)?t:t.toUpperCase()).test({message:e,name:\"string_case\",exclusive:!0,test:t=>(0,oA.default)(t)||t===t.toUpperCase()})}};bm.default=Bm;Pre.prototype=Bm.prototype});var Fre=w(Sm=>{\"use strict\";Object.defineProperty(Sm,\"__esModule\",{value:!0});Sm.create=Rre;Sm.default=void 0;var ru=iA(),iu=kre(Lh()),$He=kre(sA());function kre(r){return r&&r.__esModule?r:{default:r}}var eGe=r=>r!=+r;function Rre(){return new Qm}var Qm=class extends $He.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\"&&!eGe(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=Qm;Rre.prototype=Qm.prototype});var Nre=w(OT=>{\"use strict\";Object.defineProperty(OT,\"__esModule\",{value:!0});OT.default=rGe;var tGe=/^(\\d{4}|[+\\-]\\d{6})(?:-?(\\d{2})(?:-?(\\d{2}))?)?(?:[ T]?(\\d{2}):?(\\d{2})(?::?(\\d{2})(?:[,\\.](\\d{1,}))?)?(?:(Z)|([+\\-])(\\d{2})(?::?(\\d{2}))?)?)?$/;function rGe(r){var e=[1,4,5,6,7,10,11],t=0,i,n;if(n=tGe.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 Ore=w(vm=>{\"use strict\";Object.defineProperty(vm,\"__esModule\",{value:!0});vm.create=KT;vm.default=void 0;var iGe=Eb(Nre()),Tre=iA(),Lre=Eb(Lh()),nGe=Eb(tu()),sGe=Eb(sA());function Eb(r){return r&&r.__esModule?r:{default:r}}var MT=new Date(\"\"),oGe=r=>Object.prototype.toString.call(r)===\"[object Date]\";function KT(){return new Oh}var Oh=class extends sGe.default{constructor(){super({type:\"date\"}),this.withMutation(()=>{this.transform(function(e){return this.isType(e)?e:(e=(0,iGe.default)(e),isNaN(e)?MT:new Date(e))})})}_typeCheck(e){return oGe(e)&&!isNaN(e.getTime())}prepareParam(e,t){let i;if(nGe.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=Tre.date.min){let i=this.prepareParam(e,\"min\");return this.test({message:t,name:\"min\",exclusive:!0,params:{min:e},test(n){return(0,Lre.default)(n)||n>=this.resolve(i)}})}max(e,t=Tre.date.max){var i=this.prepareParam(e,\"max\");return this.test({message:t,name:\"max\",exclusive:!0,params:{max:e},test(n){return(0,Lre.default)(n)||n<=this.resolve(i)}})}};vm.default=Oh;Oh.INVALID_DATE=MT;KT.prototype=Oh.prototype;KT.INVALID_DATE=MT});var Kre=w((Yut,Mre)=>{function aGe(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}Mre.exports=aGe});var Hre=w((jut,Ure)=>{function AGe(r){return function(e){return r==null?void 0:r[e]}}Ure.exports=AGe});var Yre=w((qut,Gre)=>{var lGe=Hre(),cGe={\\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\"},uGe=lGe(cGe);Gre.exports=uGe});var qre=w((Jut,jre)=>{var gGe=Yre(),fGe=Vf(),hGe=/[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g,pGe=\"\\\\u0300-\\\\u036f\",dGe=\"\\\\ufe20-\\\\ufe2f\",CGe=\"\\\\u20d0-\\\\u20ff\",mGe=pGe+dGe+CGe,EGe=\"[\"+mGe+\"]\",IGe=RegExp(EGe,\"g\");function yGe(r){return r=fGe(r),r&&r.replace(hGe,gGe).replace(IGe,\"\")}jre.exports=yGe});var Wre=w((Wut,Jre)=>{var wGe=/[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;function BGe(r){return r.match(wGe)||[]}Jre.exports=BGe});var Vre=w((zut,zre)=>{var bGe=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;function QGe(r){return bGe.test(r)}zre.exports=QGe});var hie=w((Vut,fie)=>{var eie=\"\\\\ud800-\\\\udfff\",SGe=\"\\\\u0300-\\\\u036f\",vGe=\"\\\\ufe20-\\\\ufe2f\",xGe=\"\\\\u20d0-\\\\u20ff\",PGe=SGe+vGe+xGe,tie=\"\\\\u2700-\\\\u27bf\",rie=\"a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff\",DGe=\"\\\\xac\\\\xb1\\\\xd7\\\\xf7\",kGe=\"\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\",RGe=\"\\\\u2000-\\\\u206f\",FGe=\" \\\\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\",iie=\"A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde\",NGe=\"\\\\ufe0e\\\\ufe0f\",nie=DGe+kGe+RGe+FGe,sie=\"['\\u2019]\",Xre=\"[\"+nie+\"]\",TGe=\"[\"+PGe+\"]\",oie=\"\\\\d+\",LGe=\"[\"+tie+\"]\",aie=\"[\"+rie+\"]\",Aie=\"[^\"+eie+nie+oie+tie+rie+iie+\"]\",OGe=\"\\\\ud83c[\\\\udffb-\\\\udfff]\",MGe=\"(?:\"+TGe+\"|\"+OGe+\")\",KGe=\"[^\"+eie+\"]\",lie=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",cie=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",Mh=\"[\"+iie+\"]\",UGe=\"\\\\u200d\",Zre=\"(?:\"+aie+\"|\"+Aie+\")\",HGe=\"(?:\"+Mh+\"|\"+Aie+\")\",_re=\"(?:\"+sie+\"(?:d|ll|m|re|s|t|ve))?\",$re=\"(?:\"+sie+\"(?:D|LL|M|RE|S|T|VE))?\",uie=MGe+\"?\",gie=\"[\"+NGe+\"]?\",GGe=\"(?:\"+UGe+\"(?:\"+[KGe,lie,cie].join(\"|\")+\")\"+gie+uie+\")*\",YGe=\"\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])\",jGe=\"\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])\",qGe=gie+uie+GGe,JGe=\"(?:\"+[LGe,lie,cie].join(\"|\")+\")\"+qGe,WGe=RegExp([Mh+\"?\"+aie+\"+\"+_re+\"(?=\"+[Xre,Mh,\"$\"].join(\"|\")+\")\",HGe+\"+\"+$re+\"(?=\"+[Xre,Mh+Zre,\"$\"].join(\"|\")+\")\",Mh+\"?\"+Zre+\"+\"+_re,Mh+\"+\"+$re,jGe,YGe,oie,JGe].join(\"|\"),\"g\");function zGe(r){return r.match(WGe)||[]}fie.exports=zGe});var die=w((Xut,pie)=>{var VGe=Wre(),XGe=Vre(),ZGe=Vf(),_Ge=hie();function $Ge(r,e,t){return r=ZGe(r),e=t?void 0:e,e===void 0?XGe(r)?_Ge(r):VGe(r):r.match(e)||[]}pie.exports=$Ge});var UT=w((Zut,Cie)=>{var eYe=Kre(),tYe=qre(),rYe=die(),iYe=\"['\\u2019]\",nYe=RegExp(iYe,\"g\");function sYe(r){return function(e){return eYe(rYe(tYe(e).replace(nYe,\"\")),r,\"\")}}Cie.exports=sYe});var Eie=w((_ut,mie)=>{var oYe=UT(),aYe=oYe(function(r,e,t){return r+(t?\"_\":\"\")+e.toLowerCase()});mie.exports=aYe});var yie=w(($ut,Iie)=>{var AYe=PB(),lYe=UT(),cYe=lYe(function(r,e,t){return e=e.toLowerCase(),r+(t?AYe(e):e)});Iie.exports=cYe});var Bie=w((egt,wie)=>{var uYe=bh(),gYe=uT(),fYe=vT();function hYe(r,e){var t={};return e=fYe(e,3),gYe(r,function(i,n,s){uYe(t,e(i,n,s),i)}),t}wie.exports=hYe});var Qie=w((tgt,HT)=>{HT.exports=function(r){return bie(pYe(r),r)};HT.exports.array=bie;function bie(r,e){var t=r.length,i=new Array(t),n={},s=t,o=dYe(e),a=CYe(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 pYe(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 dYe(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 CYe(r){for(var e=new Map,t=0,i=r.length;t<i;t++)e.set(r[t],t);return e}});var Sie=w(GT=>{\"use strict\";Object.defineProperty(GT,\"__esModule\",{value:!0});GT.default=BYe;var mYe=Ib(am()),EYe=Ib(Qie()),IYe=pm(),yYe=Ib(tu()),wYe=Ib(xh());function Ib(r){return r&&r.__esModule?r:{default:r}}function BYe(r,e=[]){let t=[],i=[];function n(s,o){var a=(0,IYe.split)(s)[0];~i.indexOf(a)||i.push(a),~e.indexOf(`${o}-${a}`)||t.push([o,a])}for(let s in r)if((0,mYe.default)(r,s)){let o=r[s];~i.indexOf(s)||i.push(s),yYe.default.isRef(o)&&o.isSibling?n(o.path,s):(0,wYe.default)(o)&&\"deps\"in o&&o.deps.forEach(a=>n(a,s))}return EYe.default.array(i,t).reverse()}});var xie=w(YT=>{\"use strict\";Object.defineProperty(YT,\"__esModule\",{value:!0});YT.default=bYe;function vie(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 bYe(r){return(e,t)=>vie(r,e)-vie(r,t)}});var Tie=w(Pm=>{\"use strict\";Object.defineProperty(Pm,\"__esModule\",{value:!0});Pm.create=Nie;Pm.default=void 0;var Pie=na(am()),Die=na(Eie()),QYe=na(yie()),SYe=na(Bie()),vYe=na(xT()),xYe=pm(),kie=iA(),PYe=na(Sie()),Fie=na(xie()),DYe=na(ib()),kYe=na(_c()),jT=na(sA());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 Rie=r=>Object.prototype.toString.call(r)===\"[object Object]\";function RYe(r,e){let t=Object.keys(r.fields);return Object.keys(e).filter(i=>t.indexOf(i)===-1)}var FYe=(0,Fie.default)([]),xm=class extends jT.default{constructor(e){super({type:\"object\"}),this.fields=Object.create(null),this._sortErrors=FYe,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 Rie(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,Pie.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(!kYe.default.isError(u)||l)return void i(u,g);n.push(u)}if(!c||!Rie(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,DYe.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 jT.default&&s instanceof jT.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,Fie.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,PYe.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,xYe.getter)(e,!0);return this.transform(s=>{if(s==null)return s;let o=s;return(0,Pie.default)(s,e)&&(o=Kh({},s),i||delete o[e],o[t]=n(s)),o})}noUnknown(e=!0,t=kie.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=RYe(this.schema,n);return!e||s.length===0||this.createError({params:{unknown:s.join(\", \")}})}});return i.spec.noUnknown=e,i}unknown(e=!0,t=kie.object.noUnknown){return this.noUnknown(!e,t)}transformKeys(e){return this.transform(t=>t&&(0,SYe.default)(t,(i,n)=>e(n)))}camelCase(){return this.transformKeys(QYe.default)}snakeCase(){return this.transformKeys(Die.default)}constantCase(){return this.transformKeys(e=>(0,Die.default)(e).toUpperCase())}describe(){let e=super.describe();return e.fields=(0,vYe.default)(this.fields,t=>t.describe()),e}};Pm.default=xm;function Nie(r){return new xm(r)}Nie.prototype=xm.prototype});var Oie=w(km=>{\"use strict\";Object.defineProperty(km,\"__esModule\",{value:!0});km.create=Lie;km.default=void 0;var qT=Uh(Lh()),NYe=Uh(xh()),TYe=Uh(om()),JT=iA(),LYe=Uh(ib()),OYe=Uh(_c()),MYe=Uh(sA());function Uh(r){return r&&r.__esModule?r:{default:r}}function yb(){return yb=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},yb.apply(this,arguments)}function Lie(r){return new Dm(r)}var Dm=class extends MYe.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,yb({},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(!OYe.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=yb({},t,{path:v,strict:!0,parent:p,index:y,originalValue:f[y]});C[y]=(T,H)=>c.validate(B,D,H)}(0,LYe.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,NYe.default)(e))throw new TypeError(\"`array.of()` sub-schema must be a valid yup schema not: \"+(0,TYe.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,qT.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,qT.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,qT.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;Lie.prototype=Dm.prototype});var Mie=w(Rm=>{\"use strict\";Object.defineProperty(Rm,\"__esModule\",{value:!0});Rm.create=HYe;Rm.default=void 0;var KYe=UYe(xh());function UYe(r){return r&&r.__esModule?r:{default:r}}function HYe(r){return new wb(r)}var wb=class{constructor(e){this.type=\"lazy\",this.__isYupSchema__=!0,this._resolve=(t,i={})=>{let n=this.builder(t,i);if(!(0,KYe.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)}},GYe=wb;Rm.default=GYe});var Kie=w(WT=>{\"use strict\";Object.defineProperty(WT,\"__esModule\",{value:!0});WT.default=qYe;var YYe=jYe(iA());function jYe(r){return r&&r.__esModule?r:{default:r}}function qYe(r){Object.keys(r).forEach(e=>{Object.keys(r[e]).forEach(t=>{YYe.default[e][t]=r[e][t]})})}});var VT=w(yr=>{\"use strict\";Object.defineProperty(yr,\"__esModule\",{value:!0});yr.addMethod=_Ye;Object.defineProperty(yr,\"MixedSchema\",{enumerable:!0,get:function(){return Uie.default}});Object.defineProperty(yr,\"mixed\",{enumerable:!0,get:function(){return Uie.create}});Object.defineProperty(yr,\"BooleanSchema\",{enumerable:!0,get:function(){return zT.default}});Object.defineProperty(yr,\"bool\",{enumerable:!0,get:function(){return zT.create}});Object.defineProperty(yr,\"boolean\",{enumerable:!0,get:function(){return zT.create}});Object.defineProperty(yr,\"StringSchema\",{enumerable:!0,get:function(){return Hie.default}});Object.defineProperty(yr,\"string\",{enumerable:!0,get:function(){return Hie.create}});Object.defineProperty(yr,\"NumberSchema\",{enumerable:!0,get:function(){return Gie.default}});Object.defineProperty(yr,\"number\",{enumerable:!0,get:function(){return Gie.create}});Object.defineProperty(yr,\"DateSchema\",{enumerable:!0,get:function(){return Yie.default}});Object.defineProperty(yr,\"date\",{enumerable:!0,get:function(){return Yie.create}});Object.defineProperty(yr,\"ObjectSchema\",{enumerable:!0,get:function(){return jie.default}});Object.defineProperty(yr,\"object\",{enumerable:!0,get:function(){return jie.create}});Object.defineProperty(yr,\"ArraySchema\",{enumerable:!0,get:function(){return qie.default}});Object.defineProperty(yr,\"array\",{enumerable:!0,get:function(){return qie.create}});Object.defineProperty(yr,\"ref\",{enumerable:!0,get:function(){return JYe.create}});Object.defineProperty(yr,\"lazy\",{enumerable:!0,get:function(){return WYe.create}});Object.defineProperty(yr,\"ValidationError\",{enumerable:!0,get:function(){return zYe.default}});Object.defineProperty(yr,\"reach\",{enumerable:!0,get:function(){return VYe.default}});Object.defineProperty(yr,\"isSchema\",{enumerable:!0,get:function(){return Jie.default}});Object.defineProperty(yr,\"setLocale\",{enumerable:!0,get:function(){return XYe.default}});Object.defineProperty(yr,\"BaseSchema\",{enumerable:!0,get:function(){return ZYe.default}});var Uie=nu(wre()),zT=nu(vre()),Hie=nu(Dre()),Gie=nu(Fre()),Yie=nu(Ore()),jie=nu(Tie()),qie=nu(Oie()),JYe=tu(),WYe=Mie(),zYe=Fm(_c()),VYe=Fm(TT()),Jie=Fm(xh()),XYe=Fm(Kie()),ZYe=Fm(sA());function Fm(r){return r&&r.__esModule?r:{default:r}}function Wie(){if(typeof WeakMap!=\"function\")return null;var r=new WeakMap;return Wie=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=Wie();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 _Ye(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 _ie=w((ygt,Tm)=>{\"use strict\";var tje=process.env.TERM_PROGRAM===\"Hyper\",rje=process.platform===\"win32\",Vie=process.platform===\"linux\",XT={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\"},Xie=Object.assign({},XT,{check:\"\\u221A\",cross:\"\\xD7\",ellipsisLarge:\"...\",ellipsis:\"...\",info:\"i\",question:\"?\",questionSmall:\"?\",pointer:\">\",pointerSmall:\"\\xBB\",radioOff:\"( )\",radioOn:\"(*)\",warning:\"\\u203C\"}),Zie=Object.assign({},XT,{ballotCross:\"\\u2718\",check:\"\\u2714\",cross:\"\\u2716\",ellipsisLarge:\"\\u22EF\",ellipsis:\"\\u2026\",info:\"\\u2139\",question:\"?\",questionFull:\"\\uFF1F\",questionSmall:\"\\uFE56\",pointer:Vie?\"\\u25B8\":\"\\u276F\",pointerSmall:Vie?\"\\u2023\":\"\\u203A\",radioOff:\"\\u25EF\",radioOn:\"\\u25C9\",warning:\"\\u26A0\"});Tm.exports=rje&&!tje?Xie:Zie;Reflect.defineProperty(Tm.exports,\"common\",{enumerable:!1,value:XT});Reflect.defineProperty(Tm.exports,\"windows\",{enumerable:!1,value:Xie});Reflect.defineProperty(Tm.exports,\"other\",{enumerable:!1,value:Zie})});var go=w((wgt,ZT)=>{\"use strict\";var ije=r=>r!==null&&typeof r==\"object\"&&!Array.isArray(r),nje=/[\\u001b\\u009b][[\\]#;?()]*(?:(?:(?:[^\\W_]*;?[^\\W_]*)\\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,$ie=()=>{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=nje,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(!ije(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=_ie(),r.define=n,r};ZT.exports=$ie();ZT.exports.create=$ie});var ji=w(Tt=>{\"use strict\";var sje=Object.prototype.toString,Ns=go(),ene=!1,_T=[],tne={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 bb=Tt.isObject=r=>r!==null&&typeof r==\"object\"&&!Array.isArray(r);Tt.nativeType=r=>sje.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[tne[e]||e];if(t){let i=t.slice(2).toLowerCase(),n=tne[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(!bb(r))return e;if(!bb(e))return r;for(let t of Object.keys(e)){let i=Object.getOwnPropertyDescriptor(e,t);if(i.hasOwnProperty(\"value\"))if(r.hasOwnProperty(t)&&bb(i.value)){let n=Object.getOwnPropertyDescriptor(r,t);bb(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)=>{ene||(ene=!0,_T.forEach(n=>n()),t===!0&&process.exit(128+i))};_T.length===0&&(process.once(\"SIGTERM\",e.bind(null,!0,15)),process.once(\"SIGINT\",e.bind(null,!0,2)),process.once(\"exit\",e)),_T.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 rne=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 sne=w((Qgt,nne)=>{\"use strict\";var ine=J(\"readline\"),oje=rne(),aje=/^(?:\\x1b)([a-zA-Z0-9])$/,Aje=/^(?:\\x1b+)(O|N|\\[|\\[\\[)(?:(\\d+)(?:;(\\d+))?([~^$])|(?:1;)?(\\d+)?([a-zA-Z]))/,lje={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 cje(r){return[\"[a\",\"[b\",\"[c\",\"[d\",\"[e\",\"[2$\",\"[3$\",\"[5$\",\"[6$\",\"[7$\",\"[8$\",\"[Z\"].includes(r)}function uje(r){return[\"Oa\",\"Ob\",\"Oc\",\"Od\",\"Oe\",\"[2^\",\"[3^\",\"[5^\",\"[6^\",\"[7^\",\"[8^\"].includes(r)}var Qb=(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=aje.exec(r))i.meta=!0,i.shift=/^[A-Z]$/.test(t[1]);else if(t=Aje.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=lje[s],i.shift=cje(s)||i.shift,i.ctrl=uje(s)||i.ctrl}return i};Qb.listen=(r={},e)=>{let{stdin:t}=r;if(!t||t!==process.stdin&&!t.isTTY)throw new Error(\"Invalid stream passed\");let i=ine.createInterface({terminal:!0,input:t});ine.emitKeypressEvents(t,i);let n=(a,l)=>e(a,Qb(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()}};Qb.action=(r,e,t)=>{let i={...oje,...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)};nne.exports=Qb});var ane=w((Sgt,one)=>{\"use strict\";one.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}),gje(r,t,i)}};function gje(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 lne=w((vgt,Ane)=>{\"use strict\";var{define:fje,width:hje}=ji(),$T=class{constructor(e){let t=e.options;fje(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=hje(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\"}};Ane.exports=$T});var une=w((xgt,cne)=>{\"use strict\";var eL=ji(),Di=go(),tL={default:Di.noop,noop:Di.noop,set inverse(r){this._inverse=r},get inverse(){return this._inverse||eL.inverse(this.primary)},set complement(r){this._complement=r},get complement(){return this._complement||eL.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}};tL.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=eL.merge({},tL,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};cne.exports=tL});var fne=w((Pgt,gne)=>{\"use strict\";var rL=process.platform===\"win32\",aA=go(),pje=ji(),iL={...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:rL?\"( )\":\"\\u25EF\",on:rL?\"(*)\":\"\\u25C9\",disabled:rL?\"(|)\":\"\\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\"]};iL.merge=r=>{let e=pje.merge({},aA.symbols,iL,r.symbols);return delete e.merge,e};gne.exports=iL});var pne=w((Dgt,hne)=>{\"use strict\";var dje=une(),Cje=fne(),mje=ji();hne.exports=r=>{r.options=mje.merge({},r.options.theme,r.options),r.symbols=Cje.merge(r.options),r.styles=dje.merge(r.options)}});var Ine=w((mne,Ene)=>{\"use strict\";var dne=process.env.TERM_PROGRAM===\"Apple_Terminal\",Eje=go(),nL=ji(),fo=Ene.exports=mne,Dr=\"\\x1B[\",Cne=\"\\x07\",sL=!1,dl=fo.code={bell:Cne,beep:Cne,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+(dne?\"8\":\"u\"),savePosition:Dr+(dne?\"7\":\"s\"),screen:`${Dr}2J`,show:`${Dr}?25h`,up:`${Dr}1J`},su=fo.cursor={get hidden(){return sL},hide(){return sL=!0,dl.hide},show(){return sL=!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=nL.isPrimitive(i)?String(i):\"\",n=nL.isPrimitive(n)?String(n):\"\",a=nL.isPrimitive(a)?String(a):\"\",o){let l=fo.cursor.up(o)+fo.cursor.to(s.length),c=n.length-t;return c>0&&(l+=fo.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),fo.cursor.move(l)}}},oL=fo.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+=fo.erase.line+(t<r-1?fo.cursor.up(1):\"\");return r&&(e+=fo.code.beginning),e}};fo.clear=(r=\"\",e=process.stdout.columns)=>{if(!e)return oL.line+su.to(0);let t=s=>[...Eje.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(oL.line+su.prevLine()).repeat(n-1)+oL.line+su.to(0)}});var Yh=w((kgt,wne)=>{\"use strict\";var Ije=J(\"events\"),yne=go(),aL=sne(),yje=ane(),wje=lne(),Bje=pne(),kn=ji(),ou=Ine(),Lm=class extends Ije{constructor(e={}){super(),this.name=e.name,this.type=e.type,this.options=e,Bje(this),yje(this),this.state=new wje(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=Qje(this.options.margin),this.setMaxListeners(0),bje(this)}async keypress(e,t={}){this.keypressed=!0;let i=aL.action(e,aL(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=yne.unstyle(i);let n=yne.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=aL.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 bje(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 Qje(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}wne.exports=Lm});var Qne=w((Rgt,bne)=>{\"use strict\";var Sje=ji(),Bne={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 Bne.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}};bne.exports=(r,e={})=>{let t=Sje.merge({},Bne,e.roles);return t[r]||t.default}});var Om=w((Fgt,xne)=>{\"use strict\";var vje=go(),xje=Yh(),Pje=Qne(),Sb=ji(),{reorder:AL,scrollUp:Dje,scrollDown:kje,isObject:Sne,swap:Rje}=Sb,lL=class extends xje{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\");Sne(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=Pje(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,Sb.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,vje.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 vne(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=AL(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=AL(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,t=AL(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=Dje(this.choices),this.index=e,this.isDisabled()?this.up():this.render()}scrollDown(e=this.visible.length-1){return this.choices=kje(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){Rje(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(Sne(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=Sb.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 vne(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 vne(r,e){if(e instanceof Promise)return e;if(typeof e==\"function\"){if(Sb.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}xne.exports=lL});var Cl=w((Ngt,Pne)=>{\"use strict\";var Fje=Om(),cL=ji(),uL=class extends Fje{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\"&&!cL.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&&!cL.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?(cL.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()}};Pne.exports=uL});var kne=w((Tgt,Dne)=>{\"use strict\";var Nje=Cl(),Tje=(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}},gL=class extends Nje{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=Tje(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()}};Dne.exports=gL});var hL=w((Lgt,Rne)=>{\"use strict\";var fL=ji();Rne.exports=(r,e={})=>{r.cursorHide();let{input:t=\"\",initial:i=\"\",pos:n,showCursor:s=!0,color:o}=e,a=o||r.styles.placeholder,l=fL.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=fL.isPrimitive(i)?`${i}`:\"\",t=fL.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 vb=w((Ogt,Fne)=>{\"use strict\";var Lje=go(),Oje=Cl(),Mje=hL(),pL=class extends Oje{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=Lje.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=Mje(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)}};Fne.exports=pL});var dL=w((Mgt,Tne)=>{\"use strict\";var Kje=vb(),Uje=()=>{throw new Error(\"expected prompt to have a custom authenticate method\")},Nne=(r=Uje)=>{class e extends Kje{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 Nne(i)}}return e};Tne.exports=Nne()});var Mne=w((Kgt,One)=>{\"use strict\";var Hje=dL();function Gje(r,e){return r.username===this.options.username&&r.password===this.options.password}var Lne=(r=Gje)=>{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 Hje.create(r){constructor(n){super({...n,choices:e})}static create(n){return Lne(n)}}return t};One.exports=Lne()});var xb=w((Ugt,Kne)=>{\"use strict\";var Yje=Yh(),{isPrimitive:jje,hasColor:qje}=ji(),CL=class extends Yje{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 jje(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status===\"pending\"){let e=await this.element(\"hint\");return qje(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)}};Kne.exports=CL});var Hne=w((Hgt,Une)=>{\"use strict\";var Jje=xb(),mL=class extends Jje{constructor(e){super(e),this.default=this.options.default||(this.initial?\"(Y/n)\":\"(y/N)\")}};Une.exports=mL});var Yne=w((Ggt,Gne)=>{\"use strict\";var Wje=Cl(),zje=vb(),jh=zje.prototype,EL=class extends Wje{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)}};Gne.exports=EL});var au=w((Ygt,jne)=>{\"use strict\";var Vje=Yh(),Xje=hL(),{isPrimitive:Zje}=ji(),IL=class extends Vje{constructor(e){super(e),this.initial=Zje(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):Xje(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()}};jne.exports=IL});var Jne=w((jgt,qne)=>{\"use strict\";var _je=r=>r.filter((e,t)=>r.lastIndexOf(e)===t),Pb=r=>_je(r).filter(Boolean);qne.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:Pb([t,...s]),present:o};case\"next\":case\"redo\":return s=i.slice(1),o=i[0]||\"\",{past:Pb([...s,t]),present:o};case\"save\":return{past:Pb([...i,t]),present:\"\"};case\"remove\":return o=Pb(i.filter(a=>a!==t)),n=\"\",o.length&&(n=o.pop()),{past:o,present:n};default:throw new Error(`Invalid action: \"${r}\"`)}}});var wL=w((qgt,zne)=>{\"use strict\";var $je=au(),Wne=Jne(),yL=class extends $je{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=Wne(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=Wne(\"save\",this.data,this.input),this.store.set(\"values\",this.data))}submit(){return this.store&&this.autosave===!0&&this.save(),super.submit()}};zne.exports=yL});var Xne=w((Jgt,Vne)=>{\"use strict\";var eqe=au(),BL=class extends eqe{format(){return\"\"}};Vne.exports=BL});var _ne=w((Wgt,Zne)=>{\"use strict\";var tqe=au(),bL=class extends tqe{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()}};Zne.exports=bL});var ese=w((zgt,$ne)=>{\"use strict\";var rqe=Cl(),QL=class extends rqe{constructor(e){super({...e,multiple:!0})}};$ne.exports=QL});var vL=w((Vgt,tse)=>{\"use strict\";var iqe=au(),SL=class extends iqe{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()}};tse.exports=SL});var ise=w((Xgt,rse)=>{rse.exports=vL()});var sse=w((Zgt,nse)=>{\"use strict\";var nqe=au(),xL=class extends nqe{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)):\"\"}};nse.exports=xL});var Ase=w((_gt,ase)=>{\"use strict\";var sqe=go(),oqe=Om(),ose=ji(),PL=class extends oqe{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&&!ose.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=sqe.unstyle(u).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-g.length);let h=ose.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)}};ase.exports=PL});var use=w(($gt,cse)=>{\"use strict\";var lse=go(),aqe=(r=\"\")=>typeof r==\"string\"?r.replace(/^['\"]|['\"]$/g,\"\"):\"\",kL=class{constructor(e){this.name=e.key,this.field=e.field||{},this.value=aqe(e.initial||this.field.initial||\"\"),this.message=e.message||this.name,this.cursor=0,this.input=\"\",this.lines=[]}},Aqe=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 kL(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}};cse.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 Aqe(e,i),a=DL(\"result\",r,e),l=DL(\"format\",r,e),c=DL(\"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+=lse.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(lse.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 DL(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 fse=w((eft,gse)=>{\"use strict\";var lqe=go(),cqe=use(),uqe=Yh(),RL=class extends uqe{constructor(e){super(e),this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await cqe(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=lqe.unstyle(i).split(`\n`).map(a=>a.slice(1)).join(`\n`);return this.value={values:n,result:o},super.submit()}};gse.exports=RL});var pse=w((tft,hse)=>{\"use strict\";var gqe=\"(Use <shift>+<up/down> to sort)\",fqe=Cl(),FL=class extends fqe{constructor(e){super({...e,reorder:!1,sort:!0,multiple:!0}),this.state.hint=[this.options.hint,gqe].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()}};hse.exports=FL});var Cse=w((rft,dse)=>{\"use strict\";var hqe=Om(),NL=class extends hqe{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=pqe(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 pqe(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}dse.exports=NL});var Ese=w((ift,mse)=>{mse.exports=wL()});var yse=w((nft,Ise)=>{\"use strict\";var dqe=xb(),TL=class extends dqe{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()}};Ise.exports=TL});var Bse=w((sft,wse)=>{\"use strict\";var Cqe=Cl(),LL=class extends Cqe{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)}}};wse.exports=LL});var Qse=w(OL=>{\"use strict\";var bse=ji(),ui=(r,e)=>{bse.defineExport(OL,r,e),bse.defineExport(OL,r.toLowerCase(),e)};ui(\"AutoComplete\",()=>kne());ui(\"BasicAuth\",()=>Mne());ui(\"Confirm\",()=>Hne());ui(\"Editable\",()=>Yne());ui(\"Form\",()=>vb());ui(\"Input\",()=>wL());ui(\"Invisible\",()=>Xne());ui(\"List\",()=>_ne());ui(\"MultiSelect\",()=>ese());ui(\"Numeral\",()=>ise());ui(\"Password\",()=>sse());ui(\"Scale\",()=>Ase());ui(\"Select\",()=>Cl());ui(\"Snippet\",()=>fse());ui(\"Sort\",()=>pse());ui(\"Survey\",()=>Cse());ui(\"Text\",()=>Ese());ui(\"Toggle\",()=>yse());ui(\"Quiz\",()=>Bse())});var vse=w((aft,Sse)=>{Sse.exports={ArrayPrompt:Om(),AuthPrompt:dL(),BooleanPrompt:xb(),NumberPrompt:vL(),StringPrompt:au()}});var Km=w((Aft,Pse)=>{\"use strict\";var xse=J(\"assert\"),KL=J(\"events\"),ml=ji(),ho=class extends KL{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}xse.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];xse(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 Qse()}static get types(){return vse()}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 KL),e}};ml.mixinEmitter(ho,new KL);var ML=ho.prompts;for(let r of Object.keys(ML)){let e=r.toLowerCase(),t=i=>new ML[r](i).run();ho.prompt[e]=t,ho[e]=t,ho[r]||Reflect.defineProperty(ho,r,{get:()=>ML[r]})}var Mm=r=>{ml.defineExport(ho,r,()=>ho.types[r])};Mm(\"ArrayPrompt\");Mm(\"AuthPrompt\");Mm(\"BooleanPrompt\");Mm(\"NumberPrompt\");Mm(\"StringPrompt\");Pse.exports=ho});var Kse=w((Vft,Mse)=>{function wqe(r,e){for(var t=-1,i=r==null?0:r.length;++t<i&&e(r[t],t,r)!==!1;);return r}Mse.exports=wqe});var Jh=w((Xft,Use)=>{var Bqe=Y0(),bqe=bh();function Qqe(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?bqe(t,a,l):Bqe(t,a,l)}return t}Use.exports=Qqe});var Gse=w((Zft,Hse)=>{var Sqe=Jh(),vqe=Rh();function xqe(r,e){return r&&Sqe(e,vqe(e),r)}Hse.exports=xqe});var jse=w((_ft,Yse)=>{function Pqe(r){var e=[];if(r!=null)for(var t in Object(r))e.push(t);return e}Yse.exports=Pqe});var Jse=w(($ft,qse)=>{var Dqe=vn(),kqe=ab(),Rqe=jse(),Fqe=Object.prototype,Nqe=Fqe.hasOwnProperty;function Tqe(r){if(!Dqe(r))return Rqe(r);var e=kqe(r),t=[];for(var i in r)i==\"constructor\"&&(e||!Nqe.call(r,i))||t.push(i);return t}qse.exports=Tqe});var Wh=w((eht,Wse)=>{var Lqe=lT(),Oqe=Jse(),Mqe=gm();function Kqe(r){return Mqe(r)?Lqe(r,!0):Oqe(r)}Wse.exports=Kqe});var Vse=w((tht,zse)=>{var Uqe=Jh(),Hqe=Wh();function Gqe(r,e){return r&&Uqe(e,Hqe(e),r)}zse.exports=Gqe});var qL=w((Ym,zh)=>{var Yqe=ys(),$se=typeof Ym==\"object\"&&Ym&&!Ym.nodeType&&Ym,Xse=$se&&typeof zh==\"object\"&&zh&&!zh.nodeType&&zh,jqe=Xse&&Xse.exports===$se,Zse=jqe?Yqe.Buffer:void 0,_se=Zse?Zse.allocUnsafe:void 0;function qqe(r,e){if(e)return r.slice();var t=r.length,i=_se?_se(t):new r.constructor(t);return r.copy(i),i}zh.exports=qqe});var JL=w((rht,eoe)=>{function Jqe(r,e){var t=-1,i=r.length;for(e||(e=Array(i));++t<i;)e[t]=r[t];return e}eoe.exports=Jqe});var roe=w((iht,toe)=>{var Wqe=Jh(),zqe=lb();function Vqe(r,e){return Wqe(r,zqe(r),e)}toe.exports=Vqe});var kb=w((nht,ioe)=>{var Xqe=cT(),Zqe=Xqe(Object.getPrototypeOf,Object);ioe.exports=Zqe});var WL=w((sht,noe)=>{var _qe=q0(),$qe=kb(),eJe=lb(),tJe=dT(),rJe=Object.getOwnPropertySymbols,iJe=rJe?function(r){for(var e=[];r;)_qe(e,eJe(r)),r=$qe(r);return e}:tJe;noe.exports=iJe});var ooe=w((oht,soe)=>{var nJe=Jh(),sJe=WL();function oJe(r,e){return nJe(r,sJe(r),e)}soe.exports=oJe});var Aoe=w((aht,aoe)=>{var aJe=pT(),AJe=WL(),lJe=Wh();function cJe(r){return aJe(r,lJe,AJe)}aoe.exports=cJe});var coe=w((Aht,loe)=>{var uJe=Object.prototype,gJe=uJe.hasOwnProperty;function fJe(r){var e=r.length,t=new r.constructor(e);return e&&typeof r[0]==\"string\"&&gJe.call(r,\"index\")&&(t.index=r.index,t.input=r.input),t}loe.exports=fJe});var Rb=w((lht,goe)=>{var uoe=fT();function hJe(r){var e=new r.constructor(r.byteLength);return new uoe(e).set(new uoe(r)),e}goe.exports=hJe});var hoe=w((cht,foe)=>{var pJe=Rb();function dJe(r,e){var t=e?pJe(r.buffer):r.buffer;return new r.constructor(t,r.byteOffset,r.byteLength)}foe.exports=dJe});var doe=w((uht,poe)=>{var CJe=/\\w*$/;function mJe(r){var e=new r.constructor(r.source,CJe.exec(r));return e.lastIndex=r.lastIndex,e}poe.exports=mJe});var yoe=w((ght,Ioe)=>{var Coe=Rc(),moe=Coe?Coe.prototype:void 0,Eoe=moe?moe.valueOf:void 0;function EJe(r){return Eoe?Object(Eoe.call(r)):{}}Ioe.exports=EJe});var zL=w((fht,woe)=>{var IJe=Rb();function yJe(r,e){var t=e?IJe(r.buffer):r.buffer;return new r.constructor(t,r.byteOffset,r.length)}woe.exports=yJe});var boe=w((hht,Boe)=>{var wJe=Rb(),BJe=hoe(),bJe=doe(),QJe=yoe(),SJe=zL(),vJe=\"[object Boolean]\",xJe=\"[object Date]\",PJe=\"[object Map]\",DJe=\"[object Number]\",kJe=\"[object RegExp]\",RJe=\"[object Set]\",FJe=\"[object String]\",NJe=\"[object Symbol]\",TJe=\"[object ArrayBuffer]\",LJe=\"[object DataView]\",OJe=\"[object Float32Array]\",MJe=\"[object Float64Array]\",KJe=\"[object Int8Array]\",UJe=\"[object Int16Array]\",HJe=\"[object Int32Array]\",GJe=\"[object Uint8Array]\",YJe=\"[object Uint8ClampedArray]\",jJe=\"[object Uint16Array]\",qJe=\"[object Uint32Array]\";function JJe(r,e,t){var i=r.constructor;switch(e){case TJe:return wJe(r);case vJe:case xJe:return new i(+r);case LJe:return BJe(r,t);case OJe:case MJe:case KJe:case UJe:case HJe:case GJe:case YJe:case jJe:case qJe:return SJe(r,t);case PJe:return new i;case DJe:case FJe:return new i(r);case kJe:return bJe(r);case RJe:return new i;case NJe:return QJe(r)}}Boe.exports=JJe});var voe=w((pht,Soe)=>{var WJe=vn(),Qoe=Object.create,zJe=function(){function r(){}return function(e){if(!WJe(e))return{};if(Qoe)return Qoe(e);r.prototype=e;var t=new r;return r.prototype=void 0,t}}();Soe.exports=zJe});var VL=w((dht,xoe)=>{var VJe=voe(),XJe=kb(),ZJe=ab();function _Je(r){return typeof r.constructor==\"function\"&&!ZJe(r)?VJe(XJe(r)):{}}xoe.exports=_Je});var Doe=w((Cht,Poe)=>{var $Je=hm(),e3e=Wo(),t3e=\"[object Map]\";function r3e(r){return e3e(r)&&$Je(r)==t3e}Poe.exports=r3e});var Noe=w((mht,Foe)=>{var i3e=Doe(),n3e=nb(),koe=sb(),Roe=koe&&koe.isMap,s3e=Roe?n3e(Roe):i3e;Foe.exports=s3e});var Loe=w((Eht,Toe)=>{var o3e=hm(),a3e=Wo(),A3e=\"[object Set]\";function l3e(r){return a3e(r)&&o3e(r)==A3e}Toe.exports=l3e});var Uoe=w((Iht,Koe)=>{var c3e=Loe(),u3e=nb(),Ooe=sb(),Moe=Ooe&&Ooe.isSet,g3e=Moe?u3e(Moe):c3e;Koe.exports=g3e});var qoe=w((yht,joe)=>{var f3e=fm(),h3e=Kse(),p3e=Y0(),d3e=Gse(),C3e=Vse(),m3e=qL(),E3e=JL(),I3e=roe(),y3e=ooe(),w3e=CT(),B3e=Aoe(),b3e=hm(),Q3e=coe(),S3e=boe(),v3e=VL(),x3e=vs(),P3e=lm(),D3e=Noe(),k3e=vn(),R3e=Uoe(),F3e=Rh(),N3e=Wh(),T3e=1,L3e=2,O3e=4,Hoe=\"[object Arguments]\",M3e=\"[object Array]\",K3e=\"[object Boolean]\",U3e=\"[object Date]\",H3e=\"[object Error]\",Goe=\"[object Function]\",G3e=\"[object GeneratorFunction]\",Y3e=\"[object Map]\",j3e=\"[object Number]\",Yoe=\"[object Object]\",q3e=\"[object RegExp]\",J3e=\"[object Set]\",W3e=\"[object String]\",z3e=\"[object Symbol]\",V3e=\"[object WeakMap]\",X3e=\"[object ArrayBuffer]\",Z3e=\"[object DataView]\",_3e=\"[object Float32Array]\",$3e=\"[object Float64Array]\",eWe=\"[object Int8Array]\",tWe=\"[object Int16Array]\",rWe=\"[object Int32Array]\",iWe=\"[object Uint8Array]\",nWe=\"[object Uint8ClampedArray]\",sWe=\"[object Uint16Array]\",oWe=\"[object Uint32Array]\",ur={};ur[Hoe]=ur[M3e]=ur[X3e]=ur[Z3e]=ur[K3e]=ur[U3e]=ur[_3e]=ur[$3e]=ur[eWe]=ur[tWe]=ur[rWe]=ur[Y3e]=ur[j3e]=ur[Yoe]=ur[q3e]=ur[J3e]=ur[W3e]=ur[z3e]=ur[iWe]=ur[nWe]=ur[sWe]=ur[oWe]=!0;ur[H3e]=ur[Goe]=ur[V3e]=!1;function Fb(r,e,t,i,n,s){var o,a=e&T3e,l=e&L3e,c=e&O3e;if(t&&(o=n?t(r,i,n,s):t(r)),o!==void 0)return o;if(!k3e(r))return r;var u=x3e(r);if(u){if(o=Q3e(r),!a)return E3e(r,o)}else{var g=b3e(r),f=g==Goe||g==G3e;if(P3e(r))return m3e(r,a);if(g==Yoe||g==Hoe||f&&!n){if(o=l||f?{}:v3e(r),!a)return l?y3e(r,C3e(o,r)):I3e(r,d3e(o,r))}else{if(!ur[g])return n?r:{};o=S3e(r,g,a)}}s||(s=new f3e);var h=s.get(r);if(h)return h;s.set(r,o),R3e(r)?r.forEach(function(y){o.add(Fb(y,e,t,y,r,s))}):D3e(r)&&r.forEach(function(y,B){o.set(B,Fb(y,e,t,B,r,s))});var p=c?l?B3e:w3e:l?N3e:F3e,C=u?void 0:p(r);return h3e(C||r,function(y,B){C&&(B=y,y=r[B]),p3e(o,B,Fb(y,e,t,B,r,s))}),o}joe.exports=Fb});var XL=w((wht,Joe)=>{var aWe=qoe(),AWe=1,lWe=4;function cWe(r){return aWe(r,AWe|lWe)}Joe.exports=cWe});var zoe=w((Bht,Woe)=>{var uWe=HN();function gWe(r,e,t){return r==null?r:uWe(r,e,t)}Woe.exports=gWe});var $oe=w((Pht,_oe)=>{function fWe(r){var e=r==null?0:r.length;return e?r[e-1]:void 0}_oe.exports=fWe});var tae=w((Dht,eae)=>{var hWe=rm(),pWe=HR();function dWe(r,e){return e.length<2?r:hWe(r,pWe(e,0,-1))}eae.exports=dWe});var iae=w((kht,rae)=>{var CWe=Bh(),mWe=$oe(),EWe=tae(),IWe=Zc();function yWe(r,e){return e=CWe(e,r),r=EWe(r,e),r==null||delete r[IWe(mWe(e))]}rae.exports=yWe});var sae=w((Rht,nae)=>{var wWe=iae();function BWe(r,e){return r==null?!0:wWe(r,e)}nae.exports=BWe});var cae=w((opt,SWe)=>{SWe.exports={name:\"@yarnpkg/cli\",version:\"3.6.4\",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 oO=w((kmt,bae)=>{\"use strict\";bae.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 Sae=w((Rmt,Qae)=>{\"use strict\";var qWe=oO();function JWe(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=qWe(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}Qae.exports=JWe});var Pae=w((Fmt,xae)=>{\"use strict\";var WWe=Sae();function zWe(r){return r&&typeof r==\"object\"&&\"default\"in r?r:{default:r}}var VWe=zWe(WWe),XWe=\"text/plain\",ZWe=\"us-ascii\",vae=(r,e)=>e.some(t=>t instanceof RegExp?t.test(r):t===r),_We=(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===ZWe)?\"\":`${f}${h?`=${h}`:\"\"}`}).filter(Boolean)];return a&&u.push(\"base64\"),(u.length>0||l&&l!==XWe)&&u.unshift(l),`data:${u.join(\";\")},${a?n.trim():n}${s?`#${s}`:\"\"}`};function $We(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 _We(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];vae(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()])vae(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 aO=(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>aO.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=$We(r,e));let n=VWe.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};aO.MAX_INPUT_LENGTH=2048;xae.exports=aO});var Rae=w((Nmt,kae)=>{\"use strict\";var e4e=oO();function Dae(r){if(Array.isArray(r))return r.indexOf(\"ssh\")!==-1||r.indexOf(\"rsync\")!==-1;if(typeof r!=\"string\")return!1;var e=e4e(r);if(r=r.substring(r.indexOf(\"://\")+3),Dae(e))return!0;var t=new RegExp(\".([a-zA-Z\\\\d]+):(\\\\d+)/\");return!r.match(t)&&r.indexOf(\"@\")<r.indexOf(\":\")}kae.exports=Dae});var Tae=w((Tmt,Nae)=>{\"use strict\";var t4e=Pae(),Fae=Rae();function r4e(r){var e=t4e(r);return e.token=\"\",e.password===\"x-oauth-basic\"?e.token=e.user:e.user===\"x-token-auth\"&&(e.token=e.password),Fae(e.protocols)||e.protocols.length===0&&Fae(r)?e.protocol=\"ssh\":e.protocols.length?e.protocol=e.protocols[0]:(e.protocol=\"file\",e.protocols=[\"file\"]),e.href=e.href.replace(/\\/$/,\"\"),e}Nae.exports=r4e});var Oae=w((Lmt,Lae)=>{\"use strict\";var i4e=Tae();function AO(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=i4e(r),i=t.resource.split(\".\"),n=null;switch(t.toString=function(y){return AO.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}AO.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?n4e(r):r.user&&(r.protocols.includes(\"http\")||r.protocols.includes(\"https\"))?r.user+\"@\":\"\";return e+\"://\"+s+r.resource+t+\"/\"+s4e(r)+n;default:return r.href}};function n4e(r){switch(r.source){case\"bitbucket.org\":return\"x-token-auth:\"+r.token+\"@\";default:return r.token+\"@\"}}function s4e(r){switch(r.source){case\"bitbucket-server\":return\"scm/\"+r.full_name;default:return\"\"+r.full_name}}Lae.exports=AO});var DO=w((Syt,iAe)=>{var S4e=bh(),v4e=Ih();function x4e(r,e,t){(t!==void 0&&!v4e(r[e],t)||t===void 0&&!(e in r))&&S4e(r,e,t)}iAe.exports=x4e});var sAe=w((vyt,nAe)=>{var P4e=gm(),D4e=Wo();function k4e(r){return D4e(r)&&P4e(r)}nAe.exports=k4e});var AAe=w((xyt,aAe)=>{var R4e=Fc(),F4e=kb(),N4e=Wo(),T4e=\"[object Object]\",L4e=Function.prototype,O4e=Object.prototype,oAe=L4e.toString,M4e=O4e.hasOwnProperty,K4e=oAe.call(Object);function U4e(r){if(!N4e(r)||R4e(r)!=T4e)return!1;var e=F4e(r);if(e===null)return!0;var t=M4e.call(e,\"constructor\")&&e.constructor;return typeof t==\"function\"&&t instanceof t&&oAe.call(t)==K4e}aAe.exports=U4e});var kO=w((Pyt,lAe)=>{function H4e(r,e){if(!(e===\"constructor\"&&typeof r[e]==\"function\")&&e!=\"__proto__\")return r[e]}lAe.exports=H4e});var uAe=w((Dyt,cAe)=>{var G4e=Jh(),Y4e=Wh();function j4e(r){return G4e(r,Y4e(r))}cAe.exports=j4e});var CAe=w((kyt,dAe)=>{var gAe=DO(),q4e=qL(),J4e=zL(),W4e=JL(),z4e=VL(),fAe=nm(),hAe=vs(),V4e=sAe(),X4e=lm(),Z4e=U0(),_4e=vn(),$4e=AAe(),e8e=ob(),pAe=kO(),t8e=uAe();function r8e(r,e,t,i,n,s,o){var a=pAe(r,t),l=pAe(e,t),c=o.get(l);if(c){gAe(r,t,c);return}var u=s?s(a,l,t+\"\",r,e,o):void 0,g=u===void 0;if(g){var f=hAe(l),h=!f&&X4e(l),p=!f&&!h&&e8e(l);u=l,f||h||p?hAe(a)?u=a:V4e(a)?u=W4e(a):h?(g=!1,u=q4e(l,!0)):p?(g=!1,u=J4e(l,!0)):u=[]:$4e(l)||fAe(l)?(u=a,fAe(a)?u=t8e(a):(!_4e(a)||Z4e(a))&&(u=z4e(l))):g=!1}g&&(o.set(l,u),n(u,l,i,s,o),o.delete(l)),gAe(r,t,u)}dAe.exports=r8e});var IAe=w((Ryt,EAe)=>{var i8e=fm(),n8e=DO(),s8e=aT(),o8e=CAe(),a8e=vn(),A8e=Wh(),l8e=kO();function mAe(r,e,t,i,n){r!==e&&s8e(e,function(s,o){if(n||(n=new i8e),a8e(s))o8e(r,e,o,t,mAe,i,n);else{var a=i?i(l8e(r,o),s,o+\"\",r,e,n):void 0;a===void 0&&(a=s),n8e(r,o,a)}},A8e)}EAe.exports=mAe});var wAe=w((Fyt,yAe)=>{var c8e=J0(),u8e=jN(),g8e=qN();function f8e(r,e){return g8e(u8e(r,e,c8e),r+\"\")}yAe.exports=f8e});var bAe=w((Nyt,BAe)=>{var h8e=Ih(),p8e=gm(),d8e=im(),C8e=vn();function m8e(r,e,t){if(!C8e(t))return!1;var i=typeof e;return(i==\"number\"?p8e(t)&&d8e(e,t.length):i==\"string\"&&e in t)?h8e(t[e],r):!1}BAe.exports=m8e});var SAe=w((Tyt,QAe)=>{var E8e=wAe(),I8e=bAe();function y8e(r){return E8e(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&&I8e(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})}QAe.exports=y8e});var xAe=w((Lyt,vAe)=>{var w8e=IAe(),B8e=SAe(),b8e=B8e(function(r,e,t){w8e(r,e,t)});vAe.exports=b8e});var GAe=w((Twt,HAe)=>{var HO;HAe.exports=()=>(typeof HO>\"u\"&&(HO=J(\"zlib\").brotliDecompressSync(Buffer.from(\"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\",\"base64\")).toString()),HO)});var lle=w((sBt,Ale)=>{var XO=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[XO]===!0}else if(typeof l==\"function\")c=l===Boolean||l[XO]===!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[XO]=!0,r);uE.COUNT=uE.flag((r,e,t)=>(t||0)+1);uE.ArgError=Rn;Ale.exports=uE});var Ile=w((LBt,Ele)=>{var eM;Ele.exports=()=>(typeof eM>\"u\"&&(eM=J(\"zlib\").brotliDecompressSync(Buffer.from(\"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\",\"base64\")).toString()),eM)});var vle=w((oM,aM)=>{(function(r){oM&&typeof oM==\"object\"&&typeof aM<\"u\"?aM.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 kle=w((T0t,Dle)=>{\"use strict\";AM.ifExists=wze;var np=J(\"util\"),Ts=J(\"path\"),xle=vle(),Eze=/^#!\\s*(?:\\/usr\\/bin\\/env)?\\s*([^ \\t]+)(.*)$/,Ize={createPwshFile:!0,createCmdFile:xle(),fs:J(\"fs\")},yze=new Map([[\".js\",\"node\"],[\".cjs\",\"node\"],[\".mjs\",\"node\"],[\".cmd\",\"cmd\"],[\".bat\",\"cmd\"],[\".ps1\",\"pwsh\"],[\".sh\",\"sh\"]]);function Ple(r){let e={...Ize,...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 AM(r,e,t){let i=Ple(t);await i.fs_.stat(r),await bze(r,e,i)}function wze(r,e,t){return AM(r,e,t).catch(()=>{})}function Bze(r,e){return e.fs_.unlink(r).catch(()=>{})}async function bze(r,e,t){let i=await Pze(r,t);return await Qze(e,t),Sze(r,e,i,t)}function Qze(r,e){return e.fs_.mkdir(Ts.dirname(r),{recursive:!0})}function Sze(r,e,t,i){let n=Ple(i),s=[{generator:Rze,extension:\"\"}];return n.createCmdFile&&s.push({generator:kze,extension:\".cmd\"}),n.createPwshFile&&s.push({generator:Fze,extension:\".ps1\"}),Promise.all(s.map(o=>Dze(r,e+o.extension,t,o.generator,n)))}function vze(r,e){return Bze(r,e)}function xze(r,e){return Nze(r,e)}async function Pze(r,e){let n=(await e.fs_.readFile(r,\"utf8\")).trim().split(/\\r*\\n/)[0].match(Eze);if(!n){let s=Ts.extname(r).toLowerCase();return{program:yze.get(s)||null,additionalArgs:\"\"}}return{program:n[1],additionalArgs:n[2]}}async function Dze(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 vze(e,n),await n.fs_.writeFile(e,i(r,e,n),\"utf8\"),xze(e,n)}function kze(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=lM(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 Rze(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=lM(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 Fze(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=lM(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 Nze(r,e){return e.fs_.chmod(r,493)}function lM(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=xle()?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}Dle.exports=AM});var yM=w(($bt,Zle)=>{Zle.exports=J(\"stream\")});var tce=w((eQt,ece)=>{\"use strict\";function _le(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 e5e(r){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?arguments[e]:{};e%2?_le(Object(t),!0).forEach(function(i){t5e(r,i,t[i])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(t)):_le(Object(t)).forEach(function(i){Object.defineProperty(r,i,Object.getOwnPropertyDescriptor(t,i))})}return r}function t5e(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}function r5e(r,e){if(!(r instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function $le(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 i5e(r,e,t){return e&&$le(r.prototype,e),t&&$le(r,t),r}var n5e=J(\"buffer\"),pQ=n5e.Buffer,s5e=J(\"util\"),wM=s5e.inspect,o5e=wM&&wM.custom||\"inspect\";function a5e(r,e,t){pQ.prototype.copy.call(r,e,t)}ece.exports=function(){function r(){r5e(this,r),this.head=null,this.tail=null,this.length=0}return i5e(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 pQ.alloc(0);for(var i=pQ.allocUnsafe(t>>>0),n=this.head,s=0;n;)a5e(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=pQ.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:o5e,value:function(t,i){return wM(this,e5e({},i,{depth:0,customInspect:!1}))}}]),r}()});var bM=w((tQt,ice)=>{\"use strict\";function A5e(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(BM,this,r)):process.nextTick(BM,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(dQ,t):(t._writableState.errorEmitted=!0,process.nextTick(rce,t,s)):process.nextTick(rce,t,s):e?(process.nextTick(dQ,t),e(s)):process.nextTick(dQ,t)}),this)}function rce(r,e){BM(r,e),dQ(r)}function dQ(r){r._writableState&&!r._writableState.emitClose||r._readableState&&!r._readableState.emitClose||r.emit(\"close\")}function l5e(){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 BM(r,e){r.emit(\"error\",e)}function c5e(r,e){var t=r._readableState,i=r._writableState;t&&t.autoDestroy||i&&i.autoDestroy?r.destroy(e):r.emit(\"error\",e)}ice.exports={destroy:A5e,undestroy:l5e,errorOrDestroy:c5e}});var Sl=w((rQt,oce)=>{\"use strict\";var sce={};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,sce[r]=n}function nce(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 u5e(r,e,t){return r.substr(!t||t<0?0:+t,e.length)===e}function g5e(r,e,t){return(t===void 0||t>r.length)&&(t=r.length),r.substring(t-e.length,t)===e}function f5e(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\"&&u5e(e,\"not \")?(i=\"must not be\",e=e.replace(/^not /,\"\")):i=\"must be\";let n;if(g5e(r,\" argument\"))n=`The ${r} ${i} ${nce(e,\"type\")}`;else{let s=f5e(r,\".\")?\"property\":\"argument\";n=`The \"${r}\" ${s} ${i} ${nce(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\");oce.exports.codes=sce});var QM=w((iQt,ace)=>{\"use strict\";var h5e=Sl().codes.ERR_INVALID_OPT_VALUE;function p5e(r,e,t){return r.highWaterMark!=null?r.highWaterMark:e?r[t]:null}function d5e(r,e,t,i){var n=p5e(e,i,t);if(n!=null){if(!(isFinite(n)&&Math.floor(n)===n)||n<0){var s=i?t:\"highWaterMark\";throw new h5e(s,n)}return Math.floor(n)}return r.objectMode?16:16*1024}ace.exports={getHighWaterMark:d5e}});var Ace=w((nQt,SM)=>{typeof Object.create==\"function\"?SM.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:SM.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((sQt,xM)=>{try{if(vM=J(\"util\"),typeof vM.inherits!=\"function\")throw\"\";xM.exports=vM.inherits}catch{xM.exports=Ace()}var vM});var cce=w((oQt,lce)=>{lce.exports=J(\"util\").deprecate});var kM=w((aQt,dce)=>{\"use strict\";dce.exports=Lr;function gce(r){var e=this;this.next=null,this.entry=null,this.finish=function(){Y5e(e,r)}}var ap;Lr.WritableState=dE;var C5e={deprecate:cce()},fce=yM(),mQ=J(\"buffer\").Buffer,m5e=global.Uint8Array||function(){};function E5e(r){return mQ.from(r)}function I5e(r){return mQ.isBuffer(r)||r instanceof m5e}var DM=bM(),y5e=QM(),w5e=y5e.getHighWaterMark,xl=Sl().codes,B5e=xl.ERR_INVALID_ARG_TYPE,b5e=xl.ERR_METHOD_NOT_IMPLEMENTED,Q5e=xl.ERR_MULTIPLE_CALLBACK,S5e=xl.ERR_STREAM_CANNOT_PIPE,v5e=xl.ERR_STREAM_DESTROYED,x5e=xl.ERR_STREAM_NULL_VALUES,P5e=xl.ERR_STREAM_WRITE_AFTER_END,D5e=xl.ERR_UNKNOWN_ENCODING,Ap=DM.errorOrDestroy;vl()(Lr,fce);function k5e(){}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=w5e(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){M5e(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 gce(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:C5e.deprecate(function(){return this.getBuffer()},\"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.\",\"DEP0003\")})}catch{}})();var CQ;typeof Symbol==\"function\"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]==\"function\"?(CQ=Function.prototype[Symbol.hasInstance],Object.defineProperty(Lr,Symbol.hasInstance,{value:function(e){return CQ.call(this,e)?!0:this!==Lr?!1:e&&e._writableState instanceof dE}})):CQ=function(e){return e instanceof this};function Lr(r){ap=ap||qu();var e=this instanceof ap;if(!e&&!CQ.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)),fce.call(this)}Lr.prototype.pipe=function(){Ap(this,new S5e)};function R5e(r,e){var t=new P5e;Ap(r,t),process.nextTick(e,t)}function F5e(r,e,t,i){var n;return t===null?n=new x5e:typeof t!=\"string\"&&!e.objectMode&&(n=new B5e(\"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&&I5e(r);return s&&!mQ.isBuffer(r)&&(r=E5e(r)),typeof e==\"function\"&&(t=e,e=null),s?e=\"buffer\":e||(e=i.defaultEncoding),typeof t!=\"function\"&&(t=k5e),i.ending?R5e(this,t):(s||F5e(this,i,r,t))&&(i.pendingcb++,n=T5e(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&&hce(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 D5e(e);return this._writableState.defaultEncoding=e,this};Object.defineProperty(Lr.prototype,\"writableBuffer\",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function N5e(r,e,t){return!r.objectMode&&r.decodeStrings!==!1&&typeof e==\"string\"&&(e=mQ.from(e,t)),e}Object.defineProperty(Lr.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function T5e(r,e,t,i,n,s){if(!t){var o=N5e(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 PM(r,e,!1,a,i,n,s);return l}function PM(r,e,t,i,n,s,o){e.writelen=i,e.writecb=o,e.writing=!0,e.sync=!0,e.destroyed?e.onwrite(new v5e(\"write\")):t?r._writev(n,e.onwrite):r._write(n,s,e.onwrite),e.sync=!1}function L5e(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 O5e(r){r.writing=!1,r.writecb=null,r.length-=r.writelen,r.writelen=0}function M5e(r,e){var t=r._writableState,i=t.sync,n=t.writecb;if(typeof n!=\"function\")throw new Q5e;if(O5e(t),e)L5e(r,t,i,e,n);else{var s=pce(t)||r.destroyed;!s&&!t.corked&&!t.bufferProcessing&&t.bufferedRequest&&hce(r,t),i?process.nextTick(uce,r,t,s,n):uce(r,t,s,n)}}function uce(r,e,t,i){t||K5e(r,e),e.pendingcb--,i(),pE(r,e)}function K5e(r,e){e.length===0&&e.needDrain&&(e.needDrain=!1,r.emit(\"drain\"))}function hce(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,PM(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 gce(e),e.bufferedRequestCount=0}else{for(;t;){var l=t.chunk,c=t.encoding,u=t.callback,g=e.objectMode?1:l.length;if(PM(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 b5e(\"_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||G5e(this,i,t),this};Object.defineProperty(Lr.prototype,\"writableLength\",{enumerable:!1,get:function(){return this._writableState.length}});function pce(r){return r.ending&&r.length===0&&r.bufferedRequest===null&&!r.finished&&!r.writing}function U5e(r,e){r._final(function(t){e.pendingcb--,t&&Ap(r,t),e.prefinished=!0,r.emit(\"prefinish\"),pE(r,e)})}function H5e(r,e){!e.prefinished&&!e.finalCalled&&(typeof r._final==\"function\"&&!e.destroyed?(e.pendingcb++,e.finalCalled=!0,process.nextTick(U5e,r,e)):(e.prefinished=!0,r.emit(\"prefinish\")))}function pE(r,e){var t=pce(e);if(t&&(H5e(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 G5e(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 Y5e(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=DM.destroy;Lr.prototype._undestroy=DM.undestroy;Lr.prototype._destroy=function(r,e){e(r)}});var qu=w((AQt,mce)=>{\"use strict\";var j5e=Object.keys||function(r){var e=[];for(var t in r)e.push(t);return e};mce.exports=Aa;var Cce=NM(),FM=kM();vl()(Aa,Cce);for(RM=j5e(FM.prototype),EQ=0;EQ<RM.length;EQ++)IQ=RM[EQ],Aa.prototype[IQ]||(Aa.prototype[IQ]=FM.prototype[IQ]);var RM,IQ,EQ;function Aa(r){if(!(this instanceof Aa))return new Aa(r);Cce.call(this,r),FM.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\",q5e)))}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 q5e(){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 yce=w((TM,Ice)=>{var yQ=J(\"buffer\"),fA=yQ.Buffer;function Ece(r,e){for(var t in r)e[t]=r[t]}fA.from&&fA.alloc&&fA.allocUnsafe&&fA.allocUnsafeSlow?Ice.exports=yQ:(Ece(yQ,TM),TM.Buffer=lp);function lp(r,e,t){return fA(r,e,t)}Ece(fA,lp);lp.from=function(r,e,t){if(typeof r==\"number\")throw new TypeError(\"Argument must not be a number\");return fA(r,e,t)};lp.alloc=function(r,e,t){if(typeof r!=\"number\")throw new TypeError(\"Argument must be a number\");var i=fA(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 fA(r)};lp.allocUnsafeSlow=function(r){if(typeof r!=\"number\")throw new TypeError(\"Argument must be a number\");return yQ.SlowBuffer(r)}});var MM=w(Bce=>{\"use strict\";var OM=yce().Buffer,wce=OM.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 W5e(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 z5e(r){var e=W5e(r);if(typeof e!=\"string\"&&(OM.isEncoding===wce||!wce(r)))throw new Error(\"Unknown encoding: \"+r);return e||r}Bce.StringDecoder=CE;function CE(r){this.encoding=z5e(r);var e;switch(this.encoding){case\"utf16le\":this.text=e6e,this.end=t6e,e=4;break;case\"utf8\":this.fillLast=Z5e,e=4;break;case\"base64\":this.text=r6e,this.end=i6e,e=3;break;default:this.write=n6e,this.end=s6e;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=OM.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=$5e;CE.prototype.text=_5e;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 LM(r){return r<=127?0:r>>5===6?2:r>>4===14?3:r>>3===30?4:r>>6===2?-1:-2}function V5e(r,e,t){var i=e.length-1;if(i<t)return 0;var n=LM(e[i]);return n>=0?(n>0&&(r.lastNeed=n-1),n):--i<t||n===-2?0:(n=LM(e[i]),n>=0?(n>0&&(r.lastNeed=n-2),n):--i<t||n===-2?0:(n=LM(e[i]),n>=0?(n>0&&(n===2?n=0:r.lastNeed=n-3),n):0))}function X5e(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 Z5e(r){var e=this.lastTotal-this.lastNeed,t=X5e(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 _5e(r,e){var t=V5e(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 $5e(r){var e=r&&r.length?this.write(r):\"\";return this.lastNeed?e+\"\\uFFFD\":e}function e6e(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 t6e(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 r6e(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 i6e(r){var e=r&&r.length?this.write(r):\"\";return this.lastNeed?e+this.lastChar.toString(\"base64\",0,3-this.lastNeed):e}function n6e(r){return r.toString(this.encoding)}function s6e(r){return r&&r.length?this.write(r):\"\"}});var wQ=w((cQt,Sce)=>{\"use strict\";var bce=Sl().codes.ERR_STREAM_PREMATURE_CLOSE;function o6e(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 a6e(){}function A6e(r){return r.setHeader&&typeof r.abort==\"function\"}function Qce(r,e,t){if(typeof e==\"function\")return Qce(r,null,e);e||(e={}),t=o6e(t||a6e);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 bce),t.call(r,p);if(n&&!o)return(!r._writableState||!r._writableState.ended)&&(p=new bce),t.call(r,p)},f=function(){r.req.on(\"finish\",a)};return A6e(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)}}Sce.exports=Qce});var xce=w((uQt,vce)=>{\"use strict\";var BQ;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 l6e=wQ(),Dl=Symbol(\"lastResolve\"),Ju=Symbol(\"lastReject\"),mE=Symbol(\"error\"),bQ=Symbol(\"ended\"),Wu=Symbol(\"lastPromise\"),KM=Symbol(\"handlePromise\"),zu=Symbol(\"stream\");function kl(r,e){return{value:r,done:e}}function c6e(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 u6e(r){process.nextTick(c6e,r)}function g6e(r,e){return function(t,i){r.then(function(){if(e[bQ]){t(kl(void 0,!0));return}e[KM](t,i)},i)}}var f6e=Object.getPrototypeOf(function(){}),h6e=Object.setPrototypeOf((BQ={get stream(){return this[zu]},next:function(){var e=this,t=this[mE];if(t!==null)return Promise.reject(t);if(this[bQ])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(g6e(i,this));else{var s=this[zu].read();if(s!==null)return Promise.resolve(kl(s,!1));n=new Promise(this[KM])}return this[Wu]=n,n}},Pl(BQ,Symbol.asyncIterator,function(){return this}),Pl(BQ,\"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))})})}),BQ),f6e),p6e=function(e){var t,i=Object.create(h6e,(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,bQ,{value:e._readableState.endEmitted,writable:!0}),Pl(t,KM,{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,l6e(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[bQ]=!0}),e.on(\"readable\",u6e.bind(null,i)),i};vce.exports=p6e});var Rce=w((gQt,kce)=>{\"use strict\";function Pce(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 d6e(r){return function(){var e=this,t=arguments;return new Promise(function(i,n){var s=r.apply(e,t);function o(l){Pce(s,i,n,o,a,\"next\",l)}function a(l){Pce(s,i,n,o,a,\"throw\",l)}o(void 0)})}}function Dce(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 C6e(r){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?arguments[e]:{};e%2?Dce(Object(t),!0).forEach(function(i){m6e(r,i,t[i])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(t)):Dce(Object(t)).forEach(function(i){Object.defineProperty(r,i,Object.getOwnPropertyDescriptor(t,i))})}return r}function m6e(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var E6e=Sl().codes.ERR_INVALID_ARG_TYPE;function I6e(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 E6e(\"iterable\",[\"Iterable\"],e);var n=new r(C6e({objectMode:!0},t)),s=!1;n._read=function(){s||(s=!0,o())};function o(){return a.apply(this,arguments)}function a(){return a=d6e(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}kce.exports=I6e});var NM=w((hQt,Gce)=>{\"use strict\";Gce.exports=Ut;var cp;Ut.ReadableState=Lce;var fQt=J(\"events\").EventEmitter,Tce=function(e,t){return e.listeners(t).length},IE=yM(),QQ=J(\"buffer\").Buffer,y6e=global.Uint8Array||function(){};function w6e(r){return QQ.from(r)}function B6e(r){return QQ.isBuffer(r)||r instanceof y6e}var UM=J(\"util\"),Dt;UM&&UM.debuglog?Dt=UM.debuglog(\"stream\"):Dt=function(){};var b6e=tce(),WM=bM(),Q6e=QM(),S6e=Q6e.getHighWaterMark,SQ=Sl().codes,v6e=SQ.ERR_INVALID_ARG_TYPE,x6e=SQ.ERR_STREAM_PUSH_AFTER_EOF,P6e=SQ.ERR_METHOD_NOT_IMPLEMENTED,D6e=SQ.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,up,HM,GM;vl()(Ut,IE);var EE=WM.errorOrDestroy,YM=[\"error\",\"close\",\"destroy\",\"pause\",\"resume\"];function k6e(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 Lce(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=S6e(this,r,\"readableHighWaterMark\",t),this.buffer=new b6e,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=MM().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 Lce(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=WM.destroy;Ut.prototype._undestroy=WM.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=QQ.from(r,e),e=\"\"),i=!0),Oce(this,r,e,!1,i)};Ut.prototype.unshift=function(r){return Oce(this,r,null,!0,!1)};function Oce(r,e,t,i,n){Dt(\"readableAddChunk\",e);var s=r._readableState;if(e===null)s.reading=!1,N6e(r,s);else{var o;if(n||(o=R6e(s,e)),o)EE(r,o);else if(s.objectMode||e&&e.length>0)if(typeof e!=\"string\"&&!s.objectMode&&Object.getPrototypeOf(e)!==QQ.prototype&&(e=w6e(e)),i)s.endEmitted?EE(r,new D6e):jM(r,s,e,!0);else if(s.ended)EE(r,new x6e);else{if(s.destroyed)return!1;s.reading=!1,s.decoder&&!t?(e=s.decoder.write(e),s.objectMode||e.length!==0?jM(r,s,e,!1):JM(r,s)):jM(r,s,e,!1)}else i||(s.reading=!1,JM(r,s))}return!s.ended&&(s.length<s.highWaterMark||s.length===0)}function jM(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&&vQ(r)),JM(r,e)}function R6e(r,e){var t;return!B6e(e)&&typeof e!=\"string\"&&e!==void 0&&!r.objectMode&&(t=new v6e(\"chunk\",[\"string\",\"Buffer\",\"Uint8Array\"],e)),t}Ut.prototype.isPaused=function(){return this._readableState.flowing===!1};Ut.prototype.setEncoding=function(r){up||(up=MM().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 Fce=1073741824;function F6e(r){return r>=Fce?r=Fce:(r--,r|=r>>>1,r|=r>>>2,r|=r>>>4,r|=r>>>8,r|=r>>>16,r++),r}function Nce(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=F6e(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?qM(this):vQ(this),null;if(r=Nce(r,e),r===0&&e.ended)return e.length===0&&qM(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=Nce(t,e)));var n;return r>0?n=Uce(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&&qM(this)),n!==null&&this.emit(\"data\",n),n};function N6e(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?vQ(r):(e.needReadable=!1,e.emittedReadable||(e.emittedReadable=!0,Mce(r)))}}function vQ(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(Mce,r))}function Mce(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,zM(r)}function JM(r,e){e.readingMore||(e.readingMore=!0,process.nextTick(T6e,r,e))}function T6e(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 P6e(\"_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=L6e(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&&Hce(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),Tce(r,\"error\")===0&&EE(r,y)}k6e(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 L6e(r){return function(){var t=r._readableState;Dt(\"pipeOnDrain\",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,t.awaitDrain===0&&Tce(r,\"data\")&&(t.flowing=!0,zM(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=Hce(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?vQ(this):i.reading||process.nextTick(O6e,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(Kce,this),t};Ut.prototype.removeAllListeners=function(r){var e=IE.prototype.removeAllListeners.apply(this,arguments);return(r===\"readable\"||r===void 0)&&process.nextTick(Kce,this),e};function Kce(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 O6e(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,M6e(this,r)),r.paused=!1,this};function M6e(r,e){e.resumeScheduled||(e.resumeScheduled=!0,process.nextTick(K6e,r,e))}function K6e(r,e){Dt(\"resume\",e.reading),e.reading||r.read(0),e.resumeScheduled=!1,r.emit(\"resume\"),zM(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 zM(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<YM.length;s++)r.on(YM[s],this.emit.bind(this,YM[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 HM===void 0&&(HM=xce()),HM(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=Uce;Object.defineProperty(Ut.prototype,\"readableLength\",{enumerable:!1,get:function(){return this._readableState.length}});function Uce(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 qM(r){var e=r._readableState;Dt(\"endReadable\",e.endEmitted),e.endEmitted||(e.ended=!0,process.nextTick(U6e,e,r))}function U6e(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 GM===void 0&&(GM=Rce()),GM(Ut,r,e)});function Hce(r,e){for(var t=0,i=r.length;t<i;t++)if(r[t]===e)return t;return-1}});var VM=w((pQt,jce)=>{\"use strict\";jce.exports=hA;var xQ=Sl().codes,H6e=xQ.ERR_METHOD_NOT_IMPLEMENTED,G6e=xQ.ERR_MULTIPLE_CALLBACK,Y6e=xQ.ERR_TRANSFORM_ALREADY_TRANSFORMING,j6e=xQ.ERR_TRANSFORM_WITH_LENGTH_0,PQ=qu();vl()(hA,PQ);function q6e(r,e){var t=this._transformState;t.transforming=!1;var i=t.writecb;if(i===null)return this.emit(\"error\",new G6e);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 hA(r){if(!(this instanceof hA))return new hA(r);PQ.call(this,r),this._transformState={afterTransform:q6e.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){Yce(r,e,t)}):Yce(this,null,null)}hA.prototype.push=function(r,e){return this._transformState.needTransform=!1,PQ.prototype.push.call(this,r,e)};hA.prototype._transform=function(r,e,t){t(new H6e(\"_transform()\"))};hA.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)}};hA.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};hA.prototype._destroy=function(r,e){PQ.prototype._destroy.call(this,r,function(t){e(t)})};function Yce(r,e,t){if(e)return r.emit(\"error\",e);if(t!=null&&r.push(t),r._writableState.length)throw new j6e;if(r._transformState.transforming)throw new Y6e;return r.push(null)}});var Wce=w((dQt,Jce)=>{\"use strict\";Jce.exports=yE;var qce=VM();vl()(yE,qce);function yE(r){if(!(this instanceof yE))return new yE(r);qce.call(this,r)}yE.prototype._transform=function(r,e,t){t(null,r)}});var _ce=w((CQt,Zce)=>{\"use strict\";var XM;function W6e(r){var e=!1;return function(){e||(e=!0,r.apply(void 0,arguments))}}var Xce=Sl().codes,z6e=Xce.ERR_MISSING_ARGS,V6e=Xce.ERR_STREAM_DESTROYED;function zce(r){if(r)throw r}function X6e(r){return r.setHeader&&typeof r.abort==\"function\"}function Z6e(r,e,t,i){i=W6e(i);var n=!1;r.on(\"close\",function(){n=!0}),XM===void 0&&(XM=wQ()),XM(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,X6e(r))return r.abort();if(typeof r.destroy==\"function\")return r.destroy();i(o||new V6e(\"pipe\"))}}}function Vce(r){r()}function _6e(r,e){return r.pipe(e)}function $6e(r){return!r.length||typeof r[r.length-1]!=\"function\"?zce:r.pop()}function eVe(){for(var r=arguments.length,e=new Array(r),t=0;t<r;t++)e[t]=arguments[t];var i=$6e(e);if(Array.isArray(e[0])&&(e=e[0]),e.length<2)throw new z6e(\"streams\");var n,s=e.map(function(o,a){var l=a<e.length-1,c=a>0;return Z6e(o,l,c,function(u){n||(n=u),u&&s.forEach(Vce),!l&&(s.forEach(Vce),i(n))})});return e.reduce(_6e)}Zce.exports=eVe});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=NM(),Ms.Stream=wE||Ms,Ms.Readable=Ms,Ms.Writable=kM(),Ms.Duplex=qu(),Ms.Transform=VM(),Ms.PassThrough=Wce(),Ms.finished=wQ(),Ms.pipeline=_ce())});var tue=w((mQt,eue)=>{\"use strict\";var{Buffer:Io}=J(\"buffer\"),$ce=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,$ce,{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||Io.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]:Io.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=Io.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(Io.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(Io.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=Io.from([r]):typeof r==\"string\"?r=Io.from(r,t):this._isBufferList(r)?r=r.slice():Array.isArray(r.buffer)?r=Io.from(r.buffer,r.byteOffset,r.byteLength):Io.isBuffer(r)||(r=Io.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[$ce]};eue.exports=fr});var rue=w((EQt,DQ)=>{\"use strict\";var ZM=gp().Duplex,tVe=vl(),bE=tue();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}bE._init.call(this,r),ZM.call(this)}tVe(Wi,ZM);Object.assign(Wi.prototype,bE.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){ZM.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 bE||Wi.isBufferList(e)};Wi.isBufferList=bE.isBufferList;DQ.exports=Wi;DQ.exports.BufferListStream=Wi;DQ.exports.BufferList=bE});var e1=w(hp=>{var rVe=Buffer.alloc,iVe=\"0000000000000000000\",nVe=\"7777777777777777777\",iue=\"0\".charCodeAt(0),nue=Buffer.from(\"ustar\\0\",\"binary\"),sVe=Buffer.from(\"00\",\"binary\"),oVe=Buffer.from(\"ustar \",\"binary\"),aVe=Buffer.from(\" \\0\",\"binary\"),AVe=parseInt(\"7777\",8),QE=257,$M=263,lVe=function(r,e,t){return typeof r!=\"number\"?t:(r=~~r,r>=e?e:r>=0||(r+=e,r>=0)?r:0)},cVe=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},uVe=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},sue=function(r,e,t,i){for(;t<i;t++)if(r[t]===e)return t;return i},oue=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?nVe.slice(0,e)+\" \":iVe.slice(0,e-r.length)+r+\" \"};function gVe(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 gVe(r);for(;e<r.length&&r[e]===32;)e++;for(var i=lVe(sue(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,sue(r,0,e,e+t)).toString(i)},_M=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+=_M(\" path=\"+r.name+`\n`)),r.linkname&&(e+=_M(\" linkpath=\"+r.linkname+`\n`));var t=r.pax;if(t)for(var i in t)e+=_M(\" \"+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=rVe(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&AVe,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]=iue+uVe(r.type),r.linkname&&e.write(r.linkname,157),nue.copy(e,QE),sVe.copy(e,$M),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(oue(e),6),148),e)};hp.decode=function(r,e,t){var i=r[156]===0?0:r[156]-iue,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=cVe(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=oue(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(nue.compare(r,QE,QE+6)===0)r[345]&&(n=fp(r,345,155,e)+\"/\"+n);else if(!(oVe.compare(r,QE,QE+6)===0&&aVe.compare(r,$M,$M+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 fue=w((yQt,gue)=>{var Aue=J(\"util\"),fVe=rue(),SE=e1(),lue=gp().Writable,cue=gp().PassThrough,uue=function(){},aue=function(r){return r&=511,r&&512-r},hVe=function(r,e){var t=new kQ(r,e);return t.end(),t},pVe=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},kQ=function(r,e){this._parent=r,this.offset=e,cue.call(this,{autoDestroy:!1})};Aue.inherits(kQ,cue);kQ.prototype.destroy=function(r){this._parent.destroy(r)};var pA=function(r){if(!(this instanceof pA))return new pA(r);lue.call(this,r),r=r||{},this._offset=0,this._buffer=fVe(),this._missing=0,this._partial=!1,this._onparse=uue,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=aue(e._header.size);f?e._parse(f,o):e._parse(512,g),e._locked||i()},o=function(){e._buffer.consume(aue(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=pVe(h,e._pax),e._pax=null),e._locked=!0,!h.size||h.type===\"directory\"){e._parse(512,g),e.emit(\"entry\",h,hVe(e,f),n);return}e._stream=new kQ(e,f),e.emit(\"entry\",h,e._stream,n),e._parse(h.size,s),i()};this._onheader=g,this._parse(512,g)};Aue.inherits(pA,lue);pA.prototype.destroy=function(r){this._destroyed||(this._destroyed=!0,r&&this.emit(\"error\",r),this.emit(\"close\"),this._stream&&this._stream.emit(\"close\"))};pA.prototype._parse=function(r,e){this._destroyed||(this._offset+=r,this._missing=r,e===this._onheader&&(this._partial=!1),this._onparse=e)};pA.prototype._continue=function(){if(!this._destroyed){var r=this._cb;this._cb=uue,this._overflow?this._write(this._overflow,void 0,r):r()}};pA.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()}};pA.prototype._final=function(r){if(this._partial)return this.destroy(new Error(\"Unexpected end of data\"));r()};gue.exports=pA});var pue=w((wQt,hue)=>{hue.exports=J(\"fs\").constants||J(\"constants\")});var Iue=w((BQt,Eue)=>{var pp=pue(),due=Pk(),FQ=vl(),dVe=Buffer.alloc,Cue=gp().Readable,dp=gp().Writable,CVe=J(\"string_decoder\").StringDecoder,RQ=e1(),mVe=parseInt(\"755\",8),EVe=parseInt(\"644\",8),mue=dVe(1024),r1=function(){},t1=function(r,e){e&=511,e&&r.push(mue.slice(0,512-e))};function IVe(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 NQ=function(r){dp.call(this),this.written=0,this._to=r,this._destroyed=!1};FQ(NQ,dp);NQ.prototype._write=function(r,e,t){if(this.written+=r.length,this._to.push(r))return t();this._to._drain=t};NQ.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit(\"close\"))};var TQ=function(){dp.call(this),this.linkname=\"\",this._decoder=new CVe(\"utf-8\"),this._destroyed=!1};FQ(TQ,dp);TQ.prototype._write=function(r,e,t){this.linkname+=this._decoder.write(r),t()};TQ.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit(\"close\"))};var vE=function(){dp.call(this),this._destroyed=!1};FQ(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);Cue.call(this,r),this._drain=r1,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};FQ(la,Cue);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=r1);var i=this;if((!r.size||r.type===\"symlink\")&&(r.size=0),r.type||(r.type=IVe(r.mode)),r.mode||(r.mode=r.type===\"directory\"?mVe:EVe),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 t1(i,r.size),n?process.nextTick(t):this._drain=t,new vE}if(r.type===\"symlink\"&&!r.linkname){var s=new TQ;return due(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 NQ(this);return this._stream=o,due(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\"));t1(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(mue),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=RQ.encode(r);if(e){this.push(e);return}}this._encodePax(r)};la.prototype._encodePax=function(r){var e=RQ.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(RQ.encode(t)),this.push(e),t1(this,e.length),t.size=r.size,t.type=r.type,this.push(RQ.encode(t))};la.prototype._read=function(r){var e=this._drain;this._drain=r1,e()};Eue.exports=la});var yue=w(i1=>{i1.extract=fue();i1.pack=Iue()});var Fue=w((qQt,Rue)=>{\"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=Due(i.filter(n=>n!=null&&typeof n==\"object\")),this.__isFiggyPudding=!0}get(e){return l1(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):TVe(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,Due(this.__providers).concat(e)),kue)}};try{let r=J(\"util\");Xu.prototype[r.inspect.custom]=function(e,t){return this[Symbol.toStringTag]+\" \"+r.inspect(this.toJSON(),t)}}catch{}function FVe(r){throw Object.assign(new Error(`invalid config key requested: ${r}`),{code:\"EBADKEY\"})}function l1(r,e,t){let i=r.__specs[e];if(t&&!i&&(!r.__opts.other||!r.__opts.other(e)))FVe(e);else{i||(i={});let n;for(let s of r.__providers){if(n=Pue(e,s),n===void 0&&i.aliases&&i.aliases.length){for(let o of i.aliases)if(o!==e&&(n=Pue(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 Pue(r,e){let t;return e.__isFiggyPudding?t=l1(e,r,!1):typeof e.get==\"function\"?t=e.get(r):t=e[r],t}var kue={has(r,e){return e in r.__specs&&l1(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.\")}};Rue.exports=NVe;function NVe(r,e){function t(...i){return new Proxy(new Xu(r,e,i),kue)}return t}function Due(r){let e=[];return r.forEach(t=>e.unshift(t)),e}function TVe(r){return Object.keys(r).map(e=>[e,r[e]])}});var Lue=w((JQt,ga)=>{\"use strict\";var PE=J(\"crypto\"),LVe=Fue(),OVe=J(\"stream\").Transform,Nue=[\"sha256\",\"sha384\",\"sha512\"],MVe=/^[a-z0-9+/]+(?:=?=?)$/i,KVe=/^([^-]+)-([^?]+)([?\\S*]*)$/,UVe=/^([^-]+)-([A-Za-z0-9+/=]{44,88})(\\?[\\x21-\\x7E]*)*$/,HVe=/^[\\x21-\\x7E]+$/,An=LVe({algorithms:{default:[\"sha512\"]},error:{default:!1},integrity:{},options:{default:[]},pickAlgorithm:{default:()=>VVe},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?UVe:KVe);if(!n||i&&!Nue.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&&!(Nue.some(i=>i===this.algorithm)&&this.digest.match(MVe)&&(this.options||[]).every(i=>i.match(HVe))))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 c1(r,e);if(r.algorithm&&r.digest){let t=new Zu;return t[r.algorithm]=[r],c1(xE(t,e),e)}else return c1(xE(r,e),e)}function c1(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=GVe;function GVe(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=YVe;function YVe(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=jVe;function jVe(r,e){e=An(e);let t=e.Promise||Promise,i=u1(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=qVe;function qVe(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=u1(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=u1;function u1(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 OVe({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=WVe;function WVe(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 zVe=new Set(PE.getHashes()),Tue=[\"md5\",\"whirlpool\",\"sha1\",\"sha224\",\"sha256\",\"sha384\",\"sha512\",\"sha3\",\"sha3-256\",\"sha3-384\",\"sha3-512\",\"sha3_256\",\"sha3_384\",\"sha3_512\"].filter(r=>zVe.has(r));function VVe(r,e){return Tue.indexOf(r.toLowerCase())>=Tue.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:()=>Qh,WorkspaceFetcher:()=>Tf,WorkspaceResolver:()=>Yr,YarnVersion:()=>Tr,execUtils:()=>Cr,folderUtils:()=>Tw,formatUtils:()=>ee,hashUtils:()=>li,httpUtils:()=>Xt,miscUtils:()=>Ie,nodeUtils:()=>ws,parseMessageName:()=>LI,scriptUtils:()=>Wt,semverUtils:()=>vt,stringifyMessageName:()=>FA,structUtils:()=>P,tgzUtils:()=>mi,treeUtils:()=>es});var Cr={};ut(Cr,{EndStrategy:()=>hk,ExecError:()=>Yw,PipeError:()=>dC,execvp:()=>tk,pipevp:()=>oo});var Wp={};ut(Wp,{AliasFS:()=>So,CustomDir:()=>Hp,CwdFS:()=>qt,DEFAULT_COMPRESSION_LEVEL:()=>Xl,FakeFS:()=>ya,Filename:()=>xt,JailFS:()=>vo,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:()=>bS,ppath:()=>x,statUtils:()=>Op,toFilename:()=>Jr,xfs:()=>M});var xr={};ut(xr,{SAFE_TIME:()=>sK,S_IFDIR:()=>Jl,S_IFLNK:()=>zl,S_IFMT:()=>qs,S_IFREG:()=>Wl});var qs=61440,Jl=16384,Wl=32768,zl=40960,sK=456789e3;var Op={};ut(Op,{BigIntStatsEntry:()=>Bg,DEFAULT_MODE:()=>Tp,DirEntry:()=>cS,StatEntry:()=>Ia,areStatsEqual:()=>gS,clearStats:()=>WE,convertToBigIntStats:()=>zE,makeDefaultStats:()=>Lp,makeEmptyStats:()=>Oge});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 Oge(){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 oK=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=aK;K.toPortablePath=fS;K.contains=(r,e)=>oK(K,r,e);x.contains=(r,e)=>oK(x,r,e);var Mge=/^([a-zA-Z]:.*)$/,Kge=/^\\/\\/(\\.\\/)?(.*)$/,Uge=/^\\/([a-zA-Z]:.*)$/,Hge=/^\\/unc\\/(\\.dot\\/)?(.*)$/;function aK(r){if(process.platform!==\"win32\")return r;let e,t;if(e=r.match(Uge))r=e[1];else if(t=r.match(Hge))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(Mge))?r=`/${e[1]}`:(t=r.match(Kge))&&(r=`/unc/${t[1]?\".dot/\":\"\"}${t[2]}`),r}function VE(r,e){return r===K?aK(e):fS(e)}function Jr(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 AK(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 Gge(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 Yge(r,e,t,i,n,l,s,o,c,a);break;case c.isFile():f=await qge(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 Gge(r,e){try{return await r.lstatPromise(e)}catch{return null}}async function Yge(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 jge(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 qge(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?jge(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 vA(r){return As(\"EINVAL\",`invalid argument, ${r}`)}function Ur(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 lK(r){return As(\"ENOTEMPTY\",`directory not empty, ${r}`)}function cK(r){return As(\"EOPNOTSUPP\",`operation not supported, ${r}`)}function uK(){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 uK()}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 gK=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 AK(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)}},xA=class extends ya{constructor(){super(x)}};function Wge(r){let e=r.match(/\\r?\\n/g);if(e===null)return gK.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,Wge(r))}var Qg=J(\"fs\"),IS=J(\"stream\"),dK=J(\"util\"),yS=Pe(J(\"zlib\"));var fK=Pe(J(\"fs\"));var $t=class extends xA{constructor(t=fK.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 pK=J(\"events\");function hK(r,e){if(r!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${r}'`)}var bg=class extends pK.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 bg(t,i,n);return s.start(),s}start(){hK(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(){hK(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=bg.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 zge(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(dK.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 xA{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 Ur(\"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\"?Ur(\"read\"):new Error(\"Unimplemented\")}async closePromise(t){return this.closeSync(t)}closeSync(t){if(typeof this.fds.get(t)>\"u\")throw Ur(\"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=Qg.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&Qg.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 Ur(\"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&Qg.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 vA(`copyfile '${t}' -> '${i}'`);let a=this.resolveFilename(`copyfile '${t}' -> ${i}'`,i),l=this.entries.get(a);if((n&(Qg.constants.COPYFILE_EXCL|Qg.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 Ur(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 vA(`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,zge(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 lK(`rmdir '${t}'`);let o=this.entries.get(n);if(typeof o>\"u\")throw vA(`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 cK(`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 vA(`readlink '${t}'`);let n=this.entries.get(i);if(n===void 0)throw new Error(\"Unreachable\");if(!this.isSymbolicLink(n))throw vA(`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 vA(`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 vA(`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 So=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 CK=Oe.root,vo=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(CK,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(CK,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 Vge=/^[0-9]+$/,BS=/^(\\/(?:[^/]+\\/)*?(?:\\$\\$virtual|__virtual__))((?:\\/((?:[^/]+-)?[a-f0-9]+)(?:\\/([^/]+))?)?((?:\\/.*)?))$/,Xge=/^([^/]+-)?[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(Xge))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(!Vge.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,mK=(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 xA{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 Ur(\"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 Ur(\"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 Ur(\"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 Ur(\"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 Ur(\"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 Ur(\"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 Ur(\"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 Ur(\"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 Ur(\"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 Ur(\"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 Ur(\"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 Ur(\"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 Ur(\"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 Ur(\"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=mK(n,\".zip\");else for(let o of this.fileExtensions)if(s=mK(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\"),EK=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,EK.inspect)(t)}`)}};var IK=J(\"readline\"),Fi=Symbol(\"kBaseFs\"),wa=Symbol(\"kFd\"),PA=Symbol(\"kClosePromise\"),oI=Symbol(\"kCloseResolve\"),aI=Symbol(\"kCloseReject\"),xg=Symbol(\"kRefs\"),Ws=Symbol(\"kRef\"),zs=Symbol(\"kUnref\"),Zge,_ge,$ge,efe,Jp=class{constructor(e,t){this[Zge]=1;this[_ge]=void 0;this[$ge]=void 0;this[efe]=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,IK.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[PA])return this[PA];if(this[xg]--,this[xg]===0){let e=this[wa];this[wa]=-1,this[PA]=this[Fi].closePromise(e).finally(()=>{this[PA]=void 0})}else this[PA]=new Promise((e,t)=>{this[oI]=e,this[aI]=t}).finally(()=>{this[PA]=void 0,this[aI]=void 0,this[oI]=void 0});return this[PA]}[(Fi,wa,Zge=xg,_ge=PA,$ge=oI,efe=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 tfe=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\"]),yK=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 bS(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 yK){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 tfe){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 yK){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 bS(t,e),t}var bK=Pe(J(\"os\"));function wK(r){let e=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,\"0\");return`${r}${e}`}var Vs=new Set,QS=null;function BK(){if(QS)return QS;let r=K.toPortablePath(bK.default.tmpdir()),e=M.realpathSync(r);return process.once(\"exit\",()=>{M.rmtempSync()}),QS={tmpdir:r,realTmpdir:e}}var M=Object.assign(new $t,{detachTemp(r){Vs.delete(r)},mktempSync(r){let{tmpdir:e,realTmpdir:t}=BK();for(;;){let i=wK(\"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}=BK();for(;;){let i=wK(\"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:()=>ba,stringifyValueArgument:()=>_l});var hU=Pe(fU());function uI(r,e={isGlobPattern:()=>!1}){try{return(0,hU.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 CU=Pe(dU());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,CU.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(aH()),gH=Pe(lH()),cde=/^(?![-?:,\\][{}#&*!|>'\"%@` \\t\\r\\n]).([ \\t]*(?![,\\][{}:# \\t\\r\\n]).)*$/,cH=[\"__metadata\",\"version\",\"resolution\",\"dependencies\",\"peerDependencies\",\"dependenciesMeta\",\"peerDependenciesMeta\",\"binaries\"],SI=class{constructor(e){this.data=e}};function uH(r){return r.match(cde)?r:JSON.stringify(r)}function fH(r){return typeof r>\"u\"?!0:typeof r==\"object\"&&r!==null?Object.keys(r).every(e=>fH(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`${uH(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=cH.indexOf(l),g=cH.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=>!fH(i[l])).map((l,c)=>{let u=i[l],g=uH(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 ba(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}}ba.PreserveOrdering=SI;function ude(r){return r.endsWith(`\n`)||(r+=`\n`),(0,gH.parse)(r)}var gde=/^(#.*(\\r?\\n))*?#\\s+yarn\\s+lockfile\\s+v1\\r?\\n/i;function fde(r){if(gde.test(r))return ude(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 fde(r)}var mz=Pe(pH()),Kw=Pe(Ac());var ud={};ut(ud,{Builtins:()=>hv,Cli:()=>Gn,Command:()=>ve,Option:()=>z,UsageError:()=>Qe,formatMarkdownish:()=>Ti});var tv=\"\u0001\",wi=\"\\0\";var rv=/^(-h|--help)(?:=([0-9]+))?$/,xI=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,EH=/^-[a-zA-Z]{2,}$/,iv=/^([^=]+)=([\\s\\S]*)$/,nv=process.env.DEBUG_CLI===\"1\";var Qe=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 Do(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 Qe(`${r}: ${DI(e[0],!0)}`):new Qe(`${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`},PH={header:r=>r,bold:r=>r,error:r=>r,code:r=>r};function Xde(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=Xde(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 DH={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:-1};function kH(){return{nodes:[_i(),_i(),_i()]}}function Zde(r){let e=kH(),t=[],i=e.nodes.length;for(let n of r){t.push(i);for(let s=0;s<n.nodes.length;++s)NH(s)||e.nodes.push(oCe(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 _de(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 $de(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 RH(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}}];$de(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:DH}];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=iCe(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 eCe(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 tCe(r,e,t){let i=t&&e.length>0?[\"\"]:[],n=RH(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=eCe(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=aCe(f,c);if(p!==null)for(let C of p)a([...i,C],l)}}return[...s].sort()}function rCe(r,e){let t=RH(r,[...e,wi]);return nCe(e,t.map(({state:i})=>i))}function iCe(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 nCe(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=sCe(c);if(u.length>1)throw new PI(r,u.map(g=>g.candidateUsage));return u[0]}function sCe(r){let e=[],t=[];for(let i of r)i.selectedIndex===-1?t.push(i):e.push(i);return t.length>0&&e.push({...DH,path:FH(...t.map(i=>i.path)),options:t.reduce((i,n)=>i.concat(n.options),[])}),e}function FH(r,e,...t){return e===void 0?Array.from(r):FH(r.filter((i,n)=>i===e[n]),...t)}function _i(){return{dynamics:[],shortcuts:[],statics:{}}}function NH(r){return r===1||r===2}function cv(r,e=0){return{to:NH(r.to)?r.to:r.to>2?r.to+e-2:r.to+e,reducer:r.reducer}}function oCe(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 Qa(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 aCe(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&&EH.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=kH(),t=0,i=this.usage().usage,n=this.options.filter(a=>a.required).map(a=>a.names);t=Xs(e,_i()),Qa(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());Qa(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]),Qa(e,f,wi,1,[\"setSelectedIndex\",-1]),this.registerOptions(e,l)}this.arity.leading.length>0&&Qa(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)&&Qa(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&&Qa(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&&Qa(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\"]),Qa(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());Qa(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=Zde(e);return _de(i),{machine:i,contexts:t,process:n=>rCe(i,n),suggest:(n,s)=>tCe(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 TH=Symbol(\"clipanion/errorCommand\");function ACe(){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[TH]=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?lCe(s):OH,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[TH])!==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:PH}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():ACe()};var LH;function lCe(r){let e=LH;if(typeof e>\"u\"){if(r.stdout===process.stdout&&r.stderr===process.stderr)return OH;let{AsyncLocalStorage:t}=J(\"async_hooks\");e=LH=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 OH(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:()=>MH,Boolean:()=>KH,Counter:()=>UH,Proxy:()=>HH,Rest:()=>GH,String:()=>YH,applyValidator:()=>nd,cleanValidationError:()=>DI,formatError:()=>id,isOptionSymbol:()=>rd,makeCommandOption:()=>Xi,rerouteArguments:()=>Do});function MH(r,e,t){let[i,n]=Do(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 KH(r,e,t){let[i,n]=Do(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 UH(r,e,t){let[i,n]=Do(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 HH(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 GH(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 cCe(r,e,t){let[i,n]=Do(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 uCe(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 YH(r,...e){return typeof r==\"string\"?cCe(r,...e):uCe(r)}var Ez=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 FA(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:()=>S8,areIdentsEqual:()=>sC,areLocatorsEqual:()=>oC,areVirtualPackagesEquivalent:()=>LSe,bindDescriptor:()=>NSe,bindLocator:()=>TSe,convertDescriptorToLocator:()=>Sw,convertLocatorToDescriptor:()=>HD,convertPackageToLocator:()=>FSe,convertToIdent:()=>RSe,convertToManifestRange:()=>KSe,copyPackage:()=>rC,devirtualizeDescriptor:()=>iC,devirtualizeLocator:()=>nC,getIdentVendorPath:()=>qD,isPackageCompatible:()=>kw,isVirtualDescriptor:()=>JA,isVirtualLocator:()=>qo,makeDescriptor:()=>_t,makeIdent:()=>Jo,makeLocator:()=>nn,makeRange:()=>xw,parseDescriptor:()=>WA,parseFileStyleRange:()=>OSe,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:()=>v8,tryParseLocator:()=>vw,virtualizeDescriptor:()=>GD,virtualizePackage:()=>YD});var Sf=Pe(J(\"querystring\")),B8=Pe(Xr()),b8=Pe(mJ());var ee={};ut(ee,{LogLevel:()=>Xy,Style:()=>_x,Type:()=>Ue,addLogFilterSupport:()=>Xd,applyColor:()=>Qn,applyHyperlink:()=>If,applyStyle:()=>Vy,json:()=>Bc,jsonOrPretty:()=>h0e,mark:()=>rP,pretty:()=>$e,prettyField:()=>Go,prettyList:()=>tP,supportsColor:()=>zy,supportsHyperlinks:()=>eP,tuple:()=>no});var Vd=Pe(wx()),zd=Pe(Ac());var pW=Pe(Bn()),dW=Pe(nW());var Ie={};ut(Ie,{AsyncActions:()=>Gx,BufferStream:()=>Hx,CachingStrategy:()=>fW,DefaultStream:()=>Yx,allSettledSafe:()=>io,assertNever:()=>qx,bufferStream:()=>Cf,buildIgnorePattern:()=>c0e,convertMapsToIndexableObjects:()=>Jy,dynamicRequire:()=>mf,escapeRegExp:()=>n0e,getArrayWithDefault:()=>hf,getFactoryWithDefault:()=>Ta,getMapWithDefault:()=>pf,getSetWithDefault:()=>wc,isIndexableObject:()=>Ux,isPathLike:()=>u0e,isTaggedYarnVersion:()=>i0e,mapAndFilter:()=>Ho,mapAndFind:()=>Jd,overrideType:()=>s0e,parseBoolean:()=>Wd,parseOptionalBoolean:()=>hW,prettifyAsyncErrors:()=>df,prettifySyncErrors:()=>Jx,releaseAfterUseAsync:()=>a0e,replaceEnvVariables:()=>Wx,sortMap:()=>bn,tryParseOptionalBoolean:()=>zx,validateEnum:()=>o0e});var oW=Pe(Bn()),aW=Pe(Jg()),AW=Pe(Xr()),jx=J(\"stream\");function i0e(r){return!!(AW.default.valid(r)&&r.match(/^[^-]+(-rc\\.[0-9]+)?$/))}function n0e(r){return r.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}function s0e(r){}function qx(r){throw new Error(`Assertion failed: Unexpected object '${r}'`)}function o0e(r,e){let t=Object.values(r);if(!t.includes(e))throw new Qe(`Invalid value for enumeration: ${JSON.stringify(e)} (expected one of ${t.map(i=>JSON.stringify(i)).join(\", \")})`);return e}function Ho(r,e){let t=[];for(let i of r){let n=e(i);n!==lW&&t.push(n)}return t}var lW=Symbol();Ho.skip=lW;function Jd(r,e){for(let t of r){let i=e(t);if(i!==cW)return i}}var cW=Symbol();Jd.skip=cW;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 a0e(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 A0e(){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,aW.default)(e)}set(e,t){let i=this.deferred.get(e);typeof i>\"u\"&&this.deferred.set(e,i=A0e());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 uW(r){return qd(K.fromPortablePath(r))}function gW(path){let physicalPath=K.fromPortablePath(path),currentCacheEntry=qd.cache[physicalPath];delete qd.cache[physicalPath];let result;try{result=uW(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 sW=new Map;function l0e(r){let e=sW.get(r),t=M.statSync(r);if((e==null?void 0:e.mtime)===t.mtimeMs)return e.instance;let i=gW(r);return sW.set(r,{mtime:t.mtimeMs,instance:i}),i}var fW=(i=>(i[i.NoCache=0]=\"NoCache\",i[i.FsTime=1]=\"FsTime\",i[i.Node=2]=\"Node\",i))(fW||{});function mf(r,{cachingStrategy:e=2}={}){switch(e){case 0:return gW(r);case 1:return l0e(r);case 2:return uW(r);default:throw new Error(\"Unsupported caching strategy\")}}function bn(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 c0e(r){return r.length===0?null:r.map(e=>`(${oW.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 Qe(`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 hW(r){return typeof r>\"u\"?r:Wd(r)}function zx(r){try{return hW(r)}catch{return null}}function u0e(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),g0e=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)=>Qn(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 ${Qn(r,\"dependencies\",Ue.CODE)} \\u27A4 ${Ai(r,e.descriptor)}`;case\"PeerDependency\":return`${Ai(r,e.parentDescriptor)} \\u27A4 ${Qn(r,\"peerDependencies\",Ue.CODE)} \\u27A4 ${Ai(r,e.descriptor)}`;case\"PeerDependencyMeta\":return`${Ai(r,e.parentDescriptor)} \\u27A4 ${Qn(r,\"peerDependenciesMeta\",Ue.CODE)} \\u27A4 ${Ai(r,tn(e.selector))} \\u27A4 ${Qn(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,Qn(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 Qn(r,`${s} ${t[i-1]}`,Ue.NUMBER)},json:r=>r}),[Ue.PATH]:ms({pretty:(r,e)=>Qn(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 Qn(r,e,t){if(!r.get(\"enableColors\"))return e;let i=g0e.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 f0e=!!process.env.KONSOLE_VERSION;function If(r,e,t){return r.get(\"enableHyperlinks\")?f0e?`\\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 Qn(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 Qn(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 h0e(r,e,[t,i]){return r?Bc(t,i):$e(e,t,i)}function rP(r){return{Check:Qn(r,\"\\u2713\",\"green\"),Cross:Qn(r,\"\\u2718\",\"red\"),Question:Qn(r,\"?\",\"cyan\")}}function Go(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([pW.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,dW.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(FA(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:()=>bw,checksumPattern:()=>Qw,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 bw(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 Qw(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:\",DSe=5,Q8=/(os|cpu|libc)=([a-z0-9_-]+)/,kSe=(0,b8.makeParser)(Q8);function Jo(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 RSe(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 FSe(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 JA(r){return r.range.startsWith(eC)}function qo(r){return r.reference.startsWith(eC)}function iC(r){if(!JA(r))throw new Error(\"Not a virtual descriptor\");return _t(r,r.range.replace(/^[^#]*#/,\"\"))}function nC(r){if(!qo(r))throw new Error(\"Not a virtual descriptor\");return nn(r,r.reference.replace(/^[^#]*#/,\"\"))}function NSe(r,e){return r.range.includes(\"::\")?r:_t(r,`${r.range}::${Sf.default.stringify(e)}`)}function TSe(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 S8(r,e){return r.descriptorHash===e.descriptorHash}function oC(r,e){return r.locatorHash===e.locatorHash}function LSe(r,e){if(!qo(r))throw new Error(\"Invalid package type\");if(!qo(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||!S8(t,i))return!1}return!0}function tn(r){let e=v8(r);if(!e)throw new Error(`Invalid ident (${r})`);return e}function v8(r){let e=r.match(/^(?:@([^/]+?)\\/)?([^/]+)$/);if(!e)return null;let[,t,i]=e;return Jo(typeof t<\"u\"?t:null,i)}function WA(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(Jo(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(Jo(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 OSe(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 w8(r){return r=r.replace(/%/g,\"%25\"),r=r.replace(/:/g,\"%3A\"),r=r.replace(/#/g,\"%23\"),r}function MSe(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+=`${w8(e)}#`),n+=w8(t),MSe(i)&&(n+=`::${Sf.default.stringify(i)}`),n}function KSe(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=B8.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 Jr(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+DSe);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 bn(r,[e=>Ot(e),e=>e.range])}function lC(r,e){return Ai(r,e.locator)}function iP(r,e,t){let i=JA(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?kSe(r.conditions,t=>{let[,i,n]=t.match(Q8),s=e[i];return s?s.includes(n):!0}):!0}var x8={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 T8=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}}},Yr=cC;Yr.protocol=\"workspace:\";var vt={};ut(vt,{SemVer:()=>k8.SemVer,clean:()=>HSe,satisfiesWithPrereleases:()=>kc,validRange:()=>so});var Rw=Pe(Xr()),k8=Pe(Xr()),P8=new Map;function kc(r,e,t=!1){if(!r)return!1;let i=`${e}${t}`,n=P8.get(i);if(typeof n>\"u\")try{n=new Rw.default.Range(e,{includePrerelease:!0,loose:t})}catch{return!1}finally{P8.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 D8=new Map;function so(r){if(r.indexOf(\":\")!==-1)return null;let e=D8.get(r);if(typeof e<\"u\")return e;try{e=new Rw.default.Range(r)}catch{e=null}return D8.set(r,e),e}var USe=/^(?:[\\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 HSe(r){let e=USe.exec(r);return e?e[1]:null}var zA=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 zA.fromFile(i,{baseFs:t})}catch(n){if(n.code===\"ENOENT\")return null;throw n}}static async find(e,{baseFs:t}={}){let i=await zA.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 zA;return await i.loadFile(e,{baseFs:t}),i}static fromText(e){let t=new zA;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(F8(e)||\"{}\")}catch(i){throw i.message+=` (when parsing ${e})`,i}this.load(t),this.indent=R8(e)}async loadFile(e,{baseFs:t=new $t}){let i=await t.readFilePromise(e,\"utf8\"),n;try{n=JSON.parse(F8(i)||\"{}\")}catch(s){throw s.message+=` (when parsing ${e})`,s}this.load(n),this.indent=R8(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\")e.bin.trim()===\"\"?i.push(new Error(\"Invalid bin field\")):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\"||o.trim()===\"\"){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(Yr.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=WA(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=WA(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 zA.isManifestFieldCompatible(this.os,e)}isCompatibleWithCPU(e){return zA.isManifestFieldCompatible(this.cpu,e)}ensureDependencyMeta(e){if(e.range!==\"unknown\"&&!T8.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 bn(this.dependenciesMeta.entries(),([l,c])=>l))for(let[l,c]of bn(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({},...bn(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=zA;ot.fileName=\"package.json\",ot.allDependencies=[\"dependencies\",\"devDependencies\",\"peerDependencies\"],ot.hardDependencies=[\"dependencies\",\"devDependencies\"];function R8(r){let e=r.match(/^[ \\t]+/m);return e?e[0]:\"  \"}function F8(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 N8(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?N8(r,e[0]):`(${e.map(t=>N8(r,t)).join(\" | \")})`}var gz=Pe(uz()),fz=J(\"stream\"),hz=J(\"string_decoder\");var Nve=15,at=class extends Error{constructor(t,i,n){super(i);this.reportExtra=n;this.reportCode=t}};function Tve(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,gz.default)(o=>{let a=t;i=new Promise(l=>{t=l}),e=o,a()},1e3/Nve),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){Tve(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 fz.PassThrough,i=new hz.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 pz=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!!(pz.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 So(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(Yr.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(Yr.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:()=>Mve,getArchitectureSet:()=>$D,openUrl:()=>Lve});var Cz=Pe(J(\"module\")),Mw=Pe(J(\"os\"));var dz=new Map([[\"darwin\",\"open\"],[\"linux\",\"xdg-open\"],[\"win32\",\"explorer.exe\"]]).get(process.platform),Lve=typeof dz<\"u\"?async r=>{try{return await tk(dz,[r],{cwd:x.cwd()}),!0}catch{return!1}}:void 0;function _D(){return new Set(Cz.default.builtinModules||Object.keys(process.binding(\"natives\")))}function Ove(){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:Ove()}}function Mve(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 Kve=new Set([\"isTestEnv\",\"injectNpmUser\",\"injectNpmPassword\",\"injectNpm2FaToken\",\"binFolder\",\"version\",\"flags\",\"profile\",\"gpg\",\"ignoreNode\",\"wrapOutput\",\"home\",\"confDir\",\"registry\"]),Gw=\"yarn_\",sk=\".yarnrc.yml\",ok=\"yarn.lock\",Uve=\"********\",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 Hve(r,e,t,i,n);case\"MAP\":return Gve(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 Hve(r,e,t,i,n){if(typeof t!=\"object\"||Array.isArray(t))throw new Qe(`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 Qe(`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 Gve(r,e,t,i,n){let s=new Map;if(typeof t!=\"object\"||Array.isArray(t))throw new Qe(`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 Uve;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 Yve(){let r={};for(let[e,t]of Object.entries(process.env))e=e.toLowerCase(),e.startsWith(Gw)&&(e=(0,mz.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=Yve();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\",x8]]),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 Qe(`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 Qe(`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,ba(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>\"&&Kve.has(o))continue;if(o===\"rcFilename\")throw new Qe(`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 Qe(`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 Qe(`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 Yr,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=Ho(s,o=>{var a;return o===\"current\"?(a=e.libc)!=null?a:Ho.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(WA(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=Jo(\"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(bn(t.dependencies,([,s])=>Sn(s))),t.peerDependencies=new Map(bn(t.peerDependencies,([,s])=>Sn(s))),t}getLimit(e){return Ta(this.limits,e,()=>(0,Ez.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=>{qve(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 oo(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,`  ${Go(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 jve=new Map([[\"SIGINT\",2],[\"SIGQUIT\",3],[\"SIGKILL\",9],[\"SIGTERM\",15]]);function pk(r,e){let t=jve.get(e);return typeof t<\"u\"?128+t:r!=null?r:1}function qve(r,e,{configuration:t,report:i}){i.reportError(1,`  ${Go(t,r!==null?{label:\"Exit Code\",value:no(Ue.NUMBER,r)}:{label:\"Exit Signal\",value:no(Ue.CODE,e)})}`)}var Xt={};ut(Xt,{Method:()=>eV,RequestError:()=>tV.RequestError,del:()=>nke,get:()=>rke,getNetworkSettings:()=>$6,post:()=>kR,put:()=>ike,request:()=>vC});var X6=Pe(CB()),Z6=J(\"https\"),_6=J(\"http\"),DR=Pe(Bn()),PR=Pe(J6()),mB=J(\"url\");var tV=Pe(CB()),W6=new Map,z6=new Map,$De=new _6.Agent({keepAlive:!0}),eke=new Z6.Agent({keepAlive:!0});function V6(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(z6,r,()=>M.readFilePromise(r).then(e=>(z6.set(r,e),e)))}function tke({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 X6.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,`  ${Go(e,{label:\"Response Code\",value:no(Ue.NO_HINT,tke(s.response,e))})}`),s.request&&(l.reportError(35,`  ${Go(e,{label:\"Request Method\",value:no(Ue.NO_HINT,s.request.options.method)})}`),l.reportError(35,`  ${Go(e,{label:\"Request URL\",value:no(Ue.URL,s.request.requestUrl)})}`)),s.request.redirects.length>0&&l.reportError(35,`  ${Go(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,`  ${Go(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 $6(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 eV=(n=>(n.GET=\"GET\",n.PUT=\"PUT\",n.POST=\"POST\",n.DELETE=\"DELETE\",n))(eV||{});async function vC(r,e,{configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o=\"GET\"}){let a=async()=>await ske(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 rke(r,{configuration:e,jsonResponse:t,...i}){let n=Ta(W6,r,()=>EB(vC(r,null,{configuration:e,...i}),{configuration:e}).then(s=>(W6.set(r,s.body),s.body)));return Buffer.isBuffer(n)===!1&&(n=await n),t?JSON.parse(n.toString()):n}async function ike(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 nke(r,{customErrorMessage:e,...t}){return(await EB(vC(r,null,{...t,method:\"DELETE\"}),t)).body}async function ske(r,e,{configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o=\"GET\"}){let a=typeof r==\"string\"?new mB.URL(r):r,l=$6(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(V6(l.httpProxy)):$De,https:l.httpsProxy?PR.default.httpsOverHttp(V6(l.httpsProxy)):eke},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:()=>f9,detectPackageManager:()=>h9,executePackageAccessibleBinary:()=>E9,executePackageScript:()=>TB,executePackageShellcode:()=>JR,executeWorkspaceAccessibleBinary:()=>bRe,executeWorkspaceLifecycleScript:()=>C9,executeWorkspaceScript:()=>d9,getPackageAccessibleBinaries:()=>LB,getWorkspaceAccessibleBinaries:()=>m9,hasPackageScript:()=>yRe,hasWorkspaceScript:()=>WR,isNodeScript:()=>zR,makeScriptEnv:()=>FC,maybeExecuteWorkspaceLifecycleScript:()=>BRe,prepareExternalProject:()=>IRe});var xC={};ut(xC,{getLibzipPromise:()=>an,getLibzipSync:()=>aV});var oV=Pe(iV());var Ja=[\"number\",\"number\"],nV=(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))(nV||{}),sV=r=>({get HEAP8(){return r.HEAP8},get HEAPU8(){return r.HEAPU8},errors:nV,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 aV(){return NR===null&&(NR=sV((0,oV.default)())),NR}async function an(){return aV()}var RC={};ut(RC,{ShellError:()=>zn,execute:()=>xB,globUtils:()=>BB});var yV=Pe(wx()),wV=J(\"os\"),Vn=J(\"stream\"),BV=J(\"util\");var zn=class extends Error{constructor(e){super(e),this.name=\"ShellError\"}};var BB={};ut(BB,{fastGlobOptions:()=>cV,isBraceExpansion:()=>TR,isGlobPattern:()=>oke,match:()=>ake,micromatchOptions:()=>wB});var AV=Pe(dw()),lV=Pe(J(\"fs\")),yB=Pe(Bn()),wB={strictBrackets:!0},cV={onlyDirectories:!1,onlyFiles:!1};function oke(r){if(!yB.default.scan(r,wB).isGlob)return!1;try{yB.default.parse(r,wB)}catch{return!1}return!0}function ake(r,{cwd:e,baseFs:t}){return(0,AV.default)(r,{...cV,cwd:K.fromPortablePath(e),fs:AI(lV.default,new vg(t))})}function TR(r){return yB.default.scan(r,wB).isBrace}var gV=Pe(TS()),Vo=J(\"stream\"),fV=J(\"string_decoder\");var Mc=new Set;function LR(){}function OR(){for(let r of Mc)r.kill()}function hV(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,gV.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 pV(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 bB(r,e){return zf.start(r,e)}function uV(r,e=null){let t=new Vo.PassThrough,i=new fV.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 dV(r,{prefix:e}){return{stdout:uV(t=>r.stdout.write(`${t}\n`),r.stdout.isTTY?e:null),stderr:uV(t=>r.stderr.write(`${t}\n`),r.stderr.isTTY?e:null)}}var Ake=(0,BV.promisify)(setTimeout);function CV(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 lke=new Map([[\"cd\",async([r=(0,wV.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 Ake(1e3*i,0)}],[\"__ysh_run_procedure\",async(r,e,t)=>{let i=t.procedures[r[0]];return await bB(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(()=>CV(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(CV(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 bB(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 cke(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 mV(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 QB(r){return r.match(/[^ \\r\\n\\t]+/g)||[]}async function bV(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=QB(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 QB(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=QB(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 uke={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 bV({...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 uke[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 cke(f.shell,e,t);if(f.quoted)o(h);else{let p=QB(h);for(let C=0;C<p.length-1;++C)l(p[C]);o(p[p.length-1])}}break;case\"variable\":await bV(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 hV(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 pV(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 gke(r,e,t){return i=>{let n=new Vn.PassThrough,s=vB(r,e,SB(t,{stdin:n}));return{stdin:n,promise:s}}}function fke(r,e,t){return i=>{let n=new Vn.PassThrough,s=vB(r,e,t);return{stdin:n,promise:s}}}function EV(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 IV(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 mV(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=gke(i.subshell,e,o);a=EV(c,l,e,o)}break;case\"group\":{let l=await Kc(i.args,e,t),c=fke(i.group,e,o);a=EV(c,l,e,o)}break;case\"envs\":{let l=await mV(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=bB(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 hke(r,e,t,{background:i=!1}={}){function n(s){let o=[\"#2E86AB\",\"#A23B72\",\"#F18F01\",\"#C73E1D\",\"#CCE2A3\"],a=o[s%o.length];return yV.default.hex(a)}if(i){let s=t.nextBackgroundJobIndex++,o=n(s),a=`[${s}]`,l=o(a),{stdout:c,stderr:u}=dV(t,{prefix:l});return t.backgroundJobs.push(IV(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 IV(r,e,t)}async function pke(r,e,t,{background:i=!1}={}){let n,s=a=>{n=a,t.variables[\"?\"]=String(a)},o=async a=>{try{return await hke(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 pke(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 QV(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=>QV(e));default:throw new Error(`Assertion failed: Unsupported argument type: \"${r.type}\"`)}}function KR(r){switch(r.type){case\"variable\":return QV(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(lke);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 u9=Pe(PB()),g9=Pe(Jg()),tl=J(\"stream\");var l9=Pe(s9()),FB=Pe(Ac());var o9=[\"\\u280B\",\"\\u2819\",\"\\u2839\",\"\\u2838\",\"\\u283C\",\"\\u2834\",\"\\u2826\",\"\\u2827\",\"\\u2807\",\"\\u280F\"],a9=80,fRe=new Set([13,19]),hRe=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,A9=new Date,pRe=[\"iTerm.app\",\"Apple_Terminal\",\"WarpTerminal\",\"vscode\"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,dRe=r=>r,NB=dRe({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}}),CRe=pRe&&Object.keys(NB).find(r=>{let e=NB[r];return!(e.date&&(e.date[0]!==A9.getDate()||e.date[1]!==A9.getMonth()+1))})||\"default\";function c9(r,{configuration:e,json:t}){if(!e.get(\"enableMessageNames\"))return\"\";let n=FA(r===null?0:r);return!t&&r===null?$e(e,n,\"grey\"):n}function qR(r,{configuration:e,json:t}){let i=c9(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=hRe,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,...fRe]),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\")||CRe;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>a9&&(this.progressFrame=(this.progressFrame+1)%o9.length,this.progressTime=t);let i=o9[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})},a9)}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,l9.default)(t,0,this.stdout.columns-1)),t}formatName(t){return c9(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.4\";var f9=(n=>(n.Yarn1=\"Yarn Classic\",n.Yarn2=\"Yarn\",n.Npm=\"npm\",n.Pnpm=\"pnpm\",n))(f9||{});async function el(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 h9(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([el(t,\"node\",process.execPath),...Tr!==null?[el(t,\"run\",process.execPath,[a,\"run\"]),el(t,\"yarn\",process.execPath,[a]),el(t,\"yarnpkg\",process.execPath,[a]),el(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 el(t,Jr(g),f,h)),s}var mRe=2,ERe=(0,g9.default)(mRe);async function IRe(r,e,{configuration:t,report:i,workspace:n=null,locator:s=null}){await ERe(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&&qo(s)?nC(s):s,f=g?Es(g):\"an external project\";c.write(`Packing ${f} from sources\n`);let h=await h9(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 oo(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 oo(\"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 oo(\"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 oo(\"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 oo(\"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=Jo(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 oo(\"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 oo(\"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 yRe(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 p9(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 p9(r,{project:n,binFolder:l,cwd:i});return await xB(e,t,{cwd:u,env:c,stdin:s,stdout:o,stderr:a})})}async function wRe(r,{binFolder:e,cwd:t,lifecycleScript:i}){let n=await FC({project:r.project,locator:r.anchoredLocator,binFolder:e,lifecycleScript:i});return await VR(e,await m9(r)),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 p9(r,{project:e,binFolder:t,cwd:i,lifecycleScript:n}){let s=e.tryWorkspaceByLocator(r);if(s!==null)return wRe(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 VR(t,await LB(r,{project:e}));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 d9(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 C9(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 d9(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,u9.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 BRe(r,e,t){WR(r,e)&&await C9(r,e,t)}function zR(r){let e=x.extname(r);if(e.match(/\\.[cm]?[jt]sx?$/))return!0;if(e===\".exe\"||e===\".bin\")return!1;let t=Buffer.alloc(4),i;try{i=M.openSync(r,\"r\")}catch{return!0}try{M.readSync(i,t,0,t.length,0)}finally{M.closeSync(i)}let n=t.readUint32BE();return!(n===3405691582||n===3489328638||n===2135247942||(n&4294901760)===1297743872)}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 Ho.skip;let f=o.find(p=>p.supportsPackage(g,a));if(!f)return Ho.skip;let h=null;try{h=await f.findPackageLocation(g,a)}catch(p){if(p.code===\"LOCATOR_NOT_INSTALLED\")return Ho.skip;throw p}return{dependency:g,packageLocation:h}}));for(let u of c){if(u===Ho.skip)continue;let{dependency:g,packageLocation:f}=u;for(let[h,p]of g.bin){let C=x.resolve(f,p);i.set(h,[g,K.fromPortablePath(C),zR(C)])}}return i}async function m9(r){return await LB(r.anchoredLocator,{project:r.project})}async function VR(r,e){await Promise.all(Array.from(e,([t,[,i,n]])=>n?el(r,Jr(t),process.execPath,[i]):el(r,Jr(t),i,[])))}async function E9(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 VR(h.BERRY_BIN_FOLDER,c);let p=zR(K.toPortablePath(f))?oo(process.execPath,[...l,f,...t],{cwd:i,env:h,stdin:s,stdout:o,stderr:a}):oo(f,t,{cwd:i,env:h,stdin:s,stdout:o,stderr:a}),C;try{C=await p}finally{await M.removePromise(h.BERRY_BIN_FOLDER)}return C.code})}async function bRe(r,e,t,{cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a}){return await E9(r.anchoredLocator,e,t,{project:r.project,cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a})}var mi={};ut(mi,{convertToZip:()=>ZNe,extractArchiveTo:()=>$Ne,makeArchiveFromDirectory:()=>XNe});var lZ=J(\"stream\"),cZ=Pe(iZ());var nZ=Pe(Jg()),sZ=J(\"worker_threads\");var hl=Symbol(\"kTaskInfo\"),L0=class{constructor(e){this.source=e;this.workers=[];this.limit=(0,nZ.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 sZ.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 uZ=Pe(aZ());async function XNe(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 AZ;async function ZNe(r,e){let t=await M.mktempPromise(),i=x.join(t,\"archive.zip\");return AZ||(AZ=new L0((0,uZ.getContent)())),await AZ.run({tmpFile:i,tgz:r,opts:e}),new Wr(i,{libzip:await an(),level:e.compressionLevel})}async function*_Ne(r){let e=new cZ.default.Parse,t=new lZ.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 $Ne(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 _Ne(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:()=>eTe,emitTree:()=>CZ,treeNodeToJson:()=>dZ,treeNodeToTreeify:()=>pZ});var hZ=Pe(fZ());function pZ(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 dZ(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 eTe(r,{configuration:e,stdout:t,json:i}){let n=r.map(s=>({value:s}));CZ({children:n},{configuration:e,stdout:t,json:i})}function CZ(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(dZ(l))}\n`);return}let s=(0,hZ.asTree)(pZ(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 mZ=J(\"crypto\"),kN=Pe(J(\"fs\"));var tTe=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,mZ.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=[tTe,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=rTe(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||DN(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 bw(_)}`:t;if(A!==null){let re=!o.skipIntegrityCheck||!t?`${this.cacheKey}/${await bw(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\":DN(t)!==DN(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,kN.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,kN.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 So(y,{baseFs:H,pathUtils:x}),$=()=>{v==null||v.discardAndClose()},V=(W=o.unstablePackages)!=null&&W.has(e.locatorHash)?null:B;return[j,$,V]}};function DN(r){let e=r.indexOf(\"/\");return e!==-1?r.slice(0,e):null}function rTe(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 rA(){}rA.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=nTe(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(iTe(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 iTe(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 nTe(r){return{newPos:r.newPos,components:r.components.slice(0)}}var Mat=new rA;var EZ=/^[A-Za-z\\xC0-\\u02C6\\u02C8-\\u02D7\\u02DE-\\u02FF\\u1E00-\\u1EFF]+$/,IZ=/\\S/,yZ=new rA;yZ.equals=function(r,e){return this.options.ignoreCase&&(r=r.toLowerCase(),e=e.toLowerCase()),r===e||this.options.ignoreWhitespace&&!IZ.test(r)&&!IZ.test(e)};yZ.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]&&EZ.test(e[t])&&EZ.test(e[t+2])&&(e[t]+=e[t+2],e.splice(t+1,2),t--);return e};var LN=new rA;LN.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 sTe(r,e,t){return LN.diff(r,e,t)}var oTe=new rA;oTe.tokenize=function(r){return r.split(/(\\S.+?[.!?])(?=\\s+|$)/)};var aTe=new rA;aTe.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 RN(r){return ATe(r)||lTe(r)||cTe(r)||uTe()}function ATe(r){if(Array.isArray(r))return FN(r)}function lTe(r){if(typeof Symbol<\"u\"&&Symbol.iterator in Object(r))return Array.from(r)}function cTe(r,e){if(!!r){if(typeof r==\"string\")return FN(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 FN(r,e)}}function FN(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 uTe(){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 gTe=Object.prototype.toString,ZC=new rA;ZC.useLongestToken=!0;ZC.tokenize=LN.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(NN(r,null,null,n),n,\"  \")};ZC.equals=function(r,e){return rA.prototype.equals.call(ZC,r.replace(/,([\\r\\n])/g,\"$1\"),e.replace(/,([\\r\\n])/g,\"$1\"))};function NN(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(gTe.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]=NN(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]=NN(r[l],e,t,i,l);e.pop(),t.pop()}else o=r;return o}var TN=new rA;TN.tokenize=function(r){return r.slice()};TN.join=TN.removeEmpty=function(r){return r};function wZ(r,e,t,i,n,s,o){o||(o={}),typeof o.context>\"u\"&&(o.context=4);var a=sTe(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,RN(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($,RN(l(T)))}else{var V,W=Math.min(T.length,o.context);(V=f).push.apply(V,RN(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(x$()),_0=Pe(Jg()),F$=Pe(Xr()),zN=J(\"util\"),WN=Pe(J(\"v8\")),VN=Pe(J(\"zlib\"));var UMe=[[/^(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 UMe){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 P$=Pe(MD());var Qh=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:Jo(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,`${Yr.protocol}${this.relativeCwd}`),this.anchoredLocator=nn(this.locator,`${Yr.protocol}${this.relativeCwd}`);let i=this.manifest.workspaceDefinitions.map(({pattern:o})=>o);if(i.length===0)return;let n=await(0,P$.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===Yr.protocol&&x.normalize(n)===this.relativeCwd||i===Yr.protocol&&(n===\"*\"||n===\"^\"||n===\"~\"))return!0;let s=so(n);return s?i===Yr.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 D$=6,HMe=1,GMe=/ *, */g,k$=/\\/$/,YMe=32,jMe=(0,zN.promisify)(VN.default.gzip),qMe=(0,zN.promisify)(VN.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\"]},R$=r=>rn(`${HMe}`,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 Qe(`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 Qe(`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=R$(n);let s=yi(n);if(s.__metadata){let o=s.__metadata.version,a=s.__metadata.cacheKey;this.lockfileNeedsRefresh=o<D$;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(GMe)){let $=WA(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 Qh(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||(JA(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||(qo(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)JA(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||!F$.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(k$,\"\")!==e.replace(k$,\"\"))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(bn(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)(YMe);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(qo(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),!qo(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=wZ(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=>Qw(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=>Qw(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:D$,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`+ba(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=R$(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=WN.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 jMe(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 qMe(await M.readFilePromise(n));s=WN.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(JA(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),JA(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(bn(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(Yr.protocol)){if(!r.tryWorkspaceByLocator(Fe))return!1;Be=Be.slice(Yr.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 bn(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 XN=J(\"child_process\"),N$=Pe(Ac());var ZN=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 WMe(r){let e=K.fromPortablePath(r);process.on(\"SIGINT\",()=>{}),e?(0,XN.execFileSync)(process.execPath,[e,...process.argv.slice(2)],{stdio:\"inherit\",env:{...process.env,YARN_IGNORE_PATH:\"1\",YARN_IGNORE_CWD:\"1\"}}):(0,XN.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 Qe(`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{WMe(c)}catch(T){process.exitCode=T.code||1}else{u&&delete process.env.YARN_IGNORE_PATH,l.get(\"enableTelemetry\")&&!N$.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,ZN.realpathSync)(process.cwd()),V=(0,ZN.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 T$(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:()=>zie,getPluginConfiguration:()=>Bb,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 Qe{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 $Ye=Pe(Xr());ls();var eje=Pe(VT()),zie=()=>new Map([[\"@yarnpkg/cli\",Nm],[\"@yarnpkg/core\",sm],[\"@yarnpkg/fslib\",Wp],[\"@yarnpkg/libzip\",xC],[\"@yarnpkg/parsers\",td],[\"@yarnpkg/shell\",RC],[\"clipanion\",ud],[\"semver\",$Ye],[\"typanion\",hn],[\"yup\",eje]]);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 P9e=Pe(Xr());ls();var D9e=Pe(VT());var CO={};ut(CO,{dedupeUtils:()=>Nb,default:()=>g4e,suggestUtils:()=>qh});var Wae=Pe(Ac());var Lse=Pe(Km());ls();var qh={};ut(qh,{Modifier:()=>HL,Strategy:()=>Db,Target:()=>Um,WorkspaceModifier:()=>Dse,applyModifier:()=>Rse,extractDescriptorFromPath:()=>GL,extractRangeModifier:()=>kse,fetchDescriptorFrom:()=>YL,findProjectDescriptors:()=>Tse,getModifier:()=>Hm,getSuggestedDescriptors:()=>Gm,makeWorkspaceDescriptor:()=>Nse,toWorkspaceModifier:()=>Fse});var UL=Pe(Xr()),mqe=\"workspace:\",Um=(i=>(i.REGULAR=\"dependencies\",i.DEVELOPMENT=\"devDependencies\",i.PEER=\"peerDependencies\",i))(Um||{}),HL=(i=>(i.CARET=\"^\",i.TILDE=\"~\",i.EXACT=\"\",i))(HL||{}),Dse=(i=>(i.CARET=\"^\",i.TILDE=\"~\",i.EXACT=\"*\",i))(Dse||{}),Db=(s=>(s.KEEP=\"keep\",s.REUSE=\"reuse\",s.PROJECT=\"project\",s.LATEST=\"latest\",s.CACHE=\"cache\",s))(Db||{});function Hm(r,e){return r.exact?\"\":r.caret?\"^\":r.tilde?\"~\":e.configuration.get(\"defaultSemverRangePrefix\")}var Eqe=/^([\\^~]?)[0-9]+(?:\\.[0-9]+){0,2}(?:-\\S+)?$/;function kse(r,{project:e}){let t=r.match(Eqe);return t?t[1]:e.configuration.get(\"defaultSemverRangePrefix\")}function Rse(r,e){let{protocol:t,source:i,params:n,selector:s}=P.parseRange(r.range);return UL.default.valid(s)&&(s=`${e}${r.range}`),P.makeDescriptor(r,P.makeRange({protocol:t,source:i,params:n,selector:s}))}function Fse(r){switch(r){case\"^\":return\"^\";case\"~\":return\"~\";case\"\":return\"*\";default:throw new Error(`Assertion failed: Unknown modifier: \"${r}\"`)}}function Nse(r,e){return P.makeDescriptor(r.anchoredDescriptor,`${mqe}${Fse(e)}`)}async function Tse(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 GL(r,{cwd:e,workspace:t}){return await Iqe(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 YL(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 Tse(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=Nse(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 YL(r,\"latest\",{project:e,cache:i,workspace:t,preserveModifier:!1});h&&(h=Rse(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 YL(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),UL.default.valid(v)&&s!==!1){let D=typeof s==\"string\"?s:o.range;v=kse(D,{project:t})+v}return P.makeDescriptor(p,P.makeRange({protocol:C,source:y,params:B,selector:v}))}async function Iqe(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 GL(B,{cwd:this.context.cwd,workspace:n}):P.tryParseDescriptor(B),D=B.match(/^(https?:|git@github)/);if(D)throw new Qe(`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 Qe(`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=yqe(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,Lse.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 yqe(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 Qe(`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 Qe(`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 Qe(`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 Qe(`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 Qe(`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 Qe(`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 Ose=Pe(ub()),jL=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 Qe(`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,Ose.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();jL.inspect.styles.name=\"cyan\",this.context.stdout.write(`${(0,jL.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 Voe=Pe(XL()),Xoe=Pe(ub()),Zoe=Pe(zoe()),ZL=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 Qe(\"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 Qe(`Couldn't find a configuration settings named \"${n}\"`);if(n===\"enableStrictSettings\")throw new Qe(\"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,Voe.default)(p);return(0,Zoe.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,Xoe.default)(g,s):g;return(await Ge.start({configuration:t,includeFooter:!1,stdout:this.context.stdout},async p=>{ZL.inspect.styles.name=\"cyan\",p.reportInfo(0,`Successfully set ${this.name} to ${(0,ZL.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 oae=Pe(XL()),aae=Pe(am()),Aae=Pe(sae()),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 Qe(\"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 Qe(`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,aae.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,oae.default)(g):{...g};return(0,Aae.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 _L=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,_L.inspect)(t.getSpecial(u,{hideSecrets:!0,getNativePaths:!0}),a)}`)}else for(let l of s)n.reportInfo(null,`${l.padEnd(o,\" \")}   ${(0,_L.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 Nb={};ut(Nb,{Strategy:()=>jm,acceptedStrategies:()=>bWe,dedupe:()=>$L});var lae=Pe(Bn()),jm=(e=>(e.HIGHEST=\"highest\",e))(jm||{}),bWe=new Set(Object.values(jm)),QWe={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&&!lae.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 $L(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=QWe[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 $L(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=cae()[\"@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 vWe(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 vWe(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 uae=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 Qe(\"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 xWe(t,this.version)}/packages/yarnpkg-cli/bin/yarn.js`;else throw new Qe(`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 eO(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 xWe(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 Qe(`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 Qe(`Tag ${ee.pretty(r,e,ee.Type.RANGE)} not found`);return t.latest[e]}async function eO(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(),!uae.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 gae(r){return Ct[LI(r)]}var PWe=/## (?<code>YN[0-9]{4}) - `(?<name>[A-Z_]+)`\\n\\n(?<details>(?:.(?!##))+)/gs;async function DWe(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(PWe),({groups:n})=>{if(!n)throw new Error(\"Assertion failed: Expected the match to have been successful\");let s=gae(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=gae(this.code),n=ee.pretty(t,i,ee.Type.CODE),s=this.cli.format().header(`${this.code} - ${n}`),a=(await DWe(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:FA(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 fae=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=fae.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 Qe(\"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 Tb=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:!Tb.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:!Tb.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:!Tb.default.NETLIFY});if(h!==null)return h}let s=this.mode===\"update-lockfile\";if(s&&(this.immutable||this.immutableCache))throw new Qe(`${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 NWe(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 kWe=\"|||||||\",RWe=\">>>>>>>\",FWe=\"=======\",hae=\"<<<<<<<\";async function NWe(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(hae))return!1;if(e)throw new at(47,\"Cannot autofix a lockfile when running an immutable install\");let[n,s]=TWe(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,ba(l),{automaticNewlines:!0}),!0}function TWe(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(hae)){for(;t.length>0;){let s=t.shift();if(typeof s>\"u\")throw new Error(\"Assertion failed: Some lines should remain\");if(s===FWe){i=!1;break}else if(i||s.startsWith(kWe)){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(RWe))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 Qe(\"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 Qe(\"No workspace found to be linked in the target project\")}else{if(!c.manifest.name)throw new Qe(\"The target workspace doesn't have a name and thus cannot be linked\");if(c.manifest.private&&!this.private)throw new Qe(\"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 Iae=J(\"os\");var pae=J(\"os\");var LWe=\"https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml\";async function Qu(r){let e=await Xt.get(LWe,{configuration:r});return yi(e.toString())}var bu=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 Qu(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()}};bu.paths=[[\"plugin\",\"list\"]],bu.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 OWe=/^[0-9]+$/;function dae(r){return OWe.test(r)?`pull/${r}/head`:r}var MWe=({repository:r,branch:e},t)=>[[\"git\",\"init\",K.fromPortablePath(t)],[\"git\",\"remote\",\"add\",\"origin\",r],[\"git\",\"fetch\",\"origin\",\"--depth=1\",dae(e)],[\"git\",\"reset\",\"--hard\",\"FETCH_HEAD\"]],KWe=({branch:r})=>[[\"git\",\"fetch\",\"origin\",\"--depth=1\",dae(r),\"--force\"],[\"git\",\"reset\",\"--hard\",\"FETCH_HEAD\"],[\"git\",\"clean\",\"-dfx\"]],UWe=({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,pae.tmpdir)()),\"yarnpkg-sources\",li.makeHash(this.repository).slice(0,6));return(await Ge.start({configuration:t,stdout:this.context.stdout},async o=>{await tO(this,{configuration:t,report:o,target:n}),o.reportSeparator(),o.reportInfo(0,\"Building a fresh bundle\"),o.reportSeparator(),await Wm(UWe(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 eO(t,\"sources\",l,{report:o}),this.skipPlugins||await HWe(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 tO(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(KWe(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(MWe(r,i),{configuration:e,context:r.context,target:i}))}async function HWe(r,{project:e,report:t,target:i}){let n=await Qu(e.configuration),s=new Set(Object.keys(n));for(let o of e.configuration.plugins.keys())!s.has(o)||await rO(o,r,{project:e,report:t,target:i})}var Cae=Pe(Xr()),mae=J(\"url\"),Eae=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 mae.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\"&&!Cae.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 Qu(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 iO(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 iO(r,e,{project:t,report:i}){let{configuration:n}=t,s={},o={exports:s};(0,Eae.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 GWe=({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,Iae.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 Qu(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 tO(this,{configuration:t,report:s,target:i}),await rO(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 rO(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(GWe({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 iO(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 Qe(`${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 nO=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,nO.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,nO.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 Qe(`${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 yae=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,yae.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 Qe(`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 Qe(`Couldn't find a script name \"${this.scriptName}\" in the top-level (used by ${P.prettyLocator(t,s)}).`);{if(this.scriptName===\"global\")throw new Qe(\"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 Qe(`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 Qe(`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 wae=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 Qe(\"No workspace found to be unlinked in the target project\")}else{if(!h.manifest.name)throw new Qe(\"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,wae.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 Bae=Pe(Km()),sO=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 Qe(\"Ranges aren't allowed when using --recursive\");for(let f of(0,sO.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,sO.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 Qe(`Patterns ${ee.prettyList(t,u,xi.CODE)} don't match any packages referenced by any workspace`);if(u.length>0)throw new Qe(`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,Bae.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?jWe(i,s,{configuration:t,peers:this.peers}):YWe(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 YWe(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 jWe(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 dO={};ut(dO,{default:()=>c4e,gitUtils:()=>AA});var AA={};ut(AA,{TreeishProtocols:()=>Lb,clone:()=>pO,fetchBase:()=>qae,fetchChangedFiles:()=>Jae,fetchChangedWorkspaces:()=>A4e,fetchRoot:()=>jae,isGitUrl:()=>ep,lsRemote:()=>Yae,normalizeLocator:()=>fO,normalizeRepoUrl:()=>Vm,resolveUrl:()=>hO,splitRepoUrl:()=>zm});var gO=Pe(Oae()),Hae=Pe(PB()),$h=Pe(J(\"querystring\")),cO=Pe(Xr());var Kae=J(\"url\");function lO(r,e,t){let i=r.indexOf(t);return r.lastIndexOf(e,i>-1?i:1/0)}function Mae(r){try{return new Kae.URL(r)}catch{return}}function o4e(r){let e=lO(r,\"@\",\"#\"),t=lO(r,\":\",\"#\");return t>e&&(r=`${r.slice(0,t)}/${r.slice(t+1)}`),lO(r,\":\",\"#\")===-1&&r.indexOf(\"//\")===-1&&(r=`ssh://${r}`),r}function Uae(r){return Mae(r)||Mae(o4e(r))}function Gae(){return{...process.env,GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND||`${process.env.GIT_SSH||\"ssh\"} -o BatchMode=yes`}}var a4e=[/^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\\/(.+)?$/],Lb=(n=>(n.Commit=\"commit\",n.Head=\"head\",n.Tag=\"tag\",n.Semver=\"semver\",n))(Lb||{});function ep(r){return r?a4e.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(Lb).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(Lb))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=Uae(r);t&&(r=t.href),r=r.replace(/^git\\+([^:]+):/,\"$1:\")}return r}function fO(r){return P.makeLocator(r,Vm(r.reference))}async function Yae(r,e){let t=Vm(r,{git:!0});if(!Xt.getNetworkSettings(`https://${(0,gO.default)(t).resource}`,{configuration:e}).enableNetwork)throw new Error(`Request to '${t}' has been blocked because of your configuration settings`);let n=await uO(\"listing refs\",[\"ls-remote\",t],{cwd:e.startingCwd,env:Gae()},{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 hO(r,e){let{repo:t,treeish:{protocol:i,request:n},extra:s}=zm(r),o=await Yae(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])=>[cO.default.parse(p.slice(10)),C]).filter(p=>p[0]!==null)),h=cO.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 pO(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,gO.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:Gae()};return await uO(\"cloning the repository\",[\"clone\",\"-c core.autocrlf=false\",s,K.fromPortablePath(o)],a,{configuration:e,normalizedRepoUrl:s}),await uO(\"switching branch\",[\"checkout\",`${n}`],a,{configuration:e,normalizedRepoUrl:s}),o})}async function jae(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 qae(r,{baseRefs:e}){if(e.length===0)throw new Qe(\"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 Qe(`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 A4e({ref:r,project:e}){if(e.configuration.projectCwd===null)throw new Qe(\"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 jae(e.configuration.projectCwd);if(i==null)throw new Qe(\"This command can only be run on Git repositories\");let n=await qae(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 uO(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,Hae.default)(u)} Error`;l.reportError(1,`  ${ee.prettyField(i,{label:f,value:ee.tuple(ee.Type.NO_HINT,g)})}`)}o==null||o(l)})}}var Ob=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=fO(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 pO(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 Mb=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 hO(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 l4e={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:[Ob],resolvers:[Mb]};var c4e=l4e;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 AA.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 Qe(`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 u4e={configuration:{enableImmutableInstalls:{description:\"If true (the default on CI), prevents the install command from modifying the lockfile\",type:\"BOOLEAN\",default:Wae.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,bu,Du,ku,Ru,_h,Fu,El,Lu,Mu]},g4e=u4e;var wO={};ut(wO,{default:()=>h4e});var Te={optional:!0},mO=[[\"@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 EO;function zae(){return typeof EO>\"u\"&&(EO=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()),EO}var IO;function Vae(){return typeof IO>\"u\"&&(IO=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()),IO}var yO;function Xae(){return typeof yO>\"u\"&&(yO=J(\"zlib\").brotliDecompressSync(Buffer.from(\"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\",\"base64\")).toString()),yO}var Zae=new Map([[P.makeIdent(null,\"fsevents\").identHash,zae],[P.makeIdent(null,\"resolve\").identHash,Vae],[P.makeIdent(null,\"typescript\").identHash,Xae]]),f4e={hooks:{registerPackageExtensions:async(r,e)=>{for(let[t,i]of mO)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=Zae.get(i.identHash))==null?void 0:s();return typeof n<\"u\"?n:null},reduceDependency:async(r,e,t,i)=>typeof Zae.get(r.identHash)>\"u\"?r:P.makeDescriptor(r,P.makeRange({protocol:\"patch:\",source:P.stringifyDescriptor(r),selector:`~builtin<compat/${P.stringifyIdent(r)}>`,params:null}))}},h4e=f4e;var BO={};ut(BO,{default:()=>d4e});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 p4e={commands:[tp,Ku]},d4e=p4e;var vO={};ut(vO,{default:()=>E4e,fileUtils:()=>Zm});var rp=/^(?:[a-zA-Z]:[\\\\/]|\\.{0,2}\\/)/,Xm=/^[^?]*\\.(?:tar\\.gz|tgz)(?:::.*)?$/,jr=\"file:\";var Zm={};ut(Zm,{makeArchiveFromLocator:()=>Kb,makeBufferFromLocator:()=>SO,makeLocator:()=>QO,makeSpec:()=>_ae,parseSpec:()=>bO});function bO(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 _ae({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 QO(r,{parentLocator:e,path:t,folderHash:i,protocol:n}){return P.makeLocator(r,_ae({parentLocator:e,path:t,folderHash:i,protocol:n}))}async function Kb(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 SO(r,{protocol:e,fetchOptions:t}){return(await Kb(r,{protocol:e,fetchOptions:t,inMemory:!0})).getBufferAndClose()}var Ub=class{supports(e,t){return!!e.reference.startsWith(jr)}getLocalPath(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:jr});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 Kb(e,{protocol:jr,fetchOptions:t})}};var C4e=2,Hb=class{supportsDescriptor(e,t){return e.range.match(rp)?!0:!!e.range.startsWith(jr)}supportsLocator(e,t){return!!e.reference.startsWith(jr)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return rp.test(e.range)&&(e=P.makeDescriptor(e,`${jr}${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}=bO(e.range);if(s===null)throw new Error(\"Assertion failed: The descriptor should have been bound\");let o=await SO(P.makeLocator(e,P.makeRange({protocol:jr,source:n,selector:n,params:{locator:P.stringifyLocator(s)}})),{protocol:jr,fetchOptions:i.fetchOptions}),a=li.makeHash(`${C4e}`,o).slice(0,6);return[QO(e,{parentLocator:s,path:n,folderHash:a,protocol:jr})]}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 Gb=class{supports(e,t){return Xm.test(e.reference)?!!e.reference.startsWith(jr):!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:jr}),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 Yb=class{supportsDescriptor(e,t){return Xm.test(e.range)?!!(e.range.startsWith(jr)||rp.test(e.range)):!1}supportsLocator(e,t){return Xm.test(e.reference)?!!e.reference.startsWith(jr):!1}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return rp.test(e.range)&&(e=P.makeDescriptor(e,`${jr}${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(jr)&&(n=n.slice(jr.length)),[P.makeLocator(e,`${jr}${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 m4e={fetchers:[Gb,Ub],resolvers:[Yb,Hb]},E4e=m4e;var xO={};ut(xO,{default:()=>B4e});var $ae=Pe(J(\"querystring\")),eAe=[/^https?:\\/\\/(?:([^/]+?)@)?github.com\\/([^/#]+)\\/([^/#]+)\\/tarball\\/([^/#]+)(?:#(.*))?$/,/^https?:\\/\\/(?:([^/]+?)@)?github.com\\/([^/#]+)\\/([^/#]+?)(?:\\.git)?(?:#(.*))?$/];function tAe(r){return r?eAe.some(e=>!!r.match(e)):!1}function rAe(r){let e;for(let a of eAe)if(e=r.match(a),e)break;if(!e)throw new Error(I4e(r));let[,t,i,n,s=\"master\"]=e,{commit:o}=$ae.default.parse(s);return s=o||s.replace(/[^:]*:/,\"\"),{auth:t,username:i,reponame:n,treeish:s}}function I4e(r){return`Input cannot be parsed as a valid GitHub URL ('${r}').`}var jb=class{supports(e,t){return!!tAe(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=AA.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}=rAe(e.reference);return`https://${i?`${i}@`:\"\"}github.com/${n}/${s}/archive/${o}.tar.gz`}};var w4e={hooks:{async fetchHostedRepository(r,e,t){if(r!==null)return r;let i=new jb;if(!i.supports(e,t))return null;try{return await i.fetch(e,t)}catch{return null}}}},B4e=w4e;var PO={};ut(PO,{default:()=>Q4e});var _m=/^[^?]*\\.(?:tar\\.gz|tgz)(?:\\?.*)?$/,$m=/^https?:/;var qb=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 Jb=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 b4e={fetchers:[qb],resolvers:[Jb]},Q4e=b4e;var FO={};ut(FO,{default:()=>S8e});var PAe=Pe(xAe()),RO=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 Qe(\"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),RO.inspect.styles.name=\"cyan\",this.context.stdout.write(`${(0,RO.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,PAe.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 Q8e={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]},S8e=Q8e;var NO={};ut(NO,{default:()=>x8e});var lA=\"portal:\",cA=\"link:\";var Wb=class{supports(e,t){return!!e.reference.startsWith(lA)}getLocalPath(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:lA});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:lA}),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 vo(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Oe.dot}}};var zb=class{supportsDescriptor(e,t){return!!e.range.startsWith(lA)}supportsLocator(e,t){return!!e.reference.startsWith(lA)}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(lA.length);return[P.makeLocator(e,`${lA}${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 Vb=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,discardFromLookup:!0,localPath:l}:{packageFs:new vo(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Oe.dot,discardFromLookup:!0}}};var Xb=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){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 v8e={fetchers:[Vb,Wb],resolvers:[Xb,zb]},x8e=v8e;var dM={};ut(dM,{default:()=>qze});var LO=(r,e)=>`${r}@${e}`,DAe=(r,e)=>{let t=e.indexOf(\"#\"),i=t>=0?e.substring(t+1):e;return LO(r,i)};var FAe=(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=T8e(r,s),l=!1,c=0;do l=OO(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(OO(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=NAe(a);if(f)throw new Error(`${f}, after hoisting finished:\n${eE(a)}`)}return s.debugLevel>=2&&console.log(eE(a)),L8e(a)},P8e=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},D8e=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},kAe=(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},k8e=(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},TO=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},OO=(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=O8e(o),l=k8e(o,a),c=r==o?new Map:n.fastLookupPossible?P8e(e):D8e(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=N8e(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=OO(r,[...e,C],t,p,n);y.isGraphChanged&&(f=!0),y.anotherRoundNeeded&&(g=!0),t.delete(C.locator)}return{anotherRoundNeeded:g,isGraphChanged:f}},R8e=r=>{for(let[e,t]of r.dependencies)if(!r.peerNames.has(e)&&t.ident!==r.ident)return!0;return!1},F8e=(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=!R8e(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}},Zb=r=>`${r.name}@${r.locator}`,N8e=(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,Zb(T)],$=[...D,Zb(T)],V=new Map,W=new Map;for(let re of TO(T)){let O=F8e(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=NAe(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=TO(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(Zb(re))<0){u.add(T);let ue=kAe(T,re);h([...B,T],j,$,ue,C),u.delete(T)}}},p,C=new Set(TO(c)),y=Array.from(e).map(B=>Zb(B));do{p=C,C=new Set;for(let B of p){if(B.locator===c.locator||B.isHoistBorder)continue;let v=kAe(c,B);h([],Array.from(t),y,v,C)}}while(C.size>0);return{anotherRoundNeeded:g,isGraphChanged:f}},NAe=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`)},T8e=(r,e)=>{let{identName:t,name:i,reference:n,peerNames:s}=r,o={name:i,references:new Set([n]),locator:LO(t,n),ident:DAe(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:LO(p,C),ident:DAe(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},MO=r=>r.substring(0,r.indexOf(\"@\",1)),L8e=r=>{let e={name:r.name,identName:MO(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:MO(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},O8e=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}`},RAe=5e4,eE=r=>{let e=0,t=(n,s,o=\"\")=>{if(e>RAe||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=MO(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>RAe?`\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||{}),TAe=\"node_modules\",Hu=\"$wsroot$\";var rE=(r,e)=>{let{packageTree:t,hoistingLimits:i,errors:n,preserveSymlinksRequired:s}=K8e(r,e),o=null;if(n.length===0){let a=FAe(t,{hoistingLimits:i});o=H8e(r,a,e)}return{tree:o,errors:n,preserveSymlinksRequired:s}},sa=r=>`${r.name}@${r.reference}`,UO=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},LAe=(r,e)=>{let t=P.isVirtualLocator(r)?P.devirtualizeLocator(r):r,i=P.isVirtualLocator(e)?P.devirtualizeLocator(e):e;return P.areLocatorsEqual(t,i)},KO=(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},M8e=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\"&&!KO(C,f,r,i)){let B=OAe(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},K8e=(r,e)=>{let t=[],i=!1,n=new Map,s=M8e(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=KO(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=KO(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}`);LAe(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}`);LAe(_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 OAe(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 U8e(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=OAe(n,r,e),s=n.linkType),{linkType:s,target:o}}var H8e=(r,e,t)=>{let i=new Map,n=(u,g,f)=>{let{linkType:h,target:p}=U8e(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:Jr(g),name:Jr(f)}:{scope:null,name:Jr(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,TAe),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(TAe),re=Ae.length-1;for(;ge>=0&&re>ge;){let O=K.toPortablePath(Ae.slice(0,re).join(x.sep)),F=Jr(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 sM={};ut(sM,{PnpInstaller:()=>Yu,PnpLinker:()=>wl,default:()=>mze,getPnpPath:()=>Bl,jsInstallUtils:()=>Co,pnpUtils:()=>hE,quotePathIfNeeded:()=>Sle});var ble=Pe(Xr()),Qle=J(\"url\");var MAe={[\"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 G8e(r,e,t){let i=\"\";i+=\"[\";for(let n=0,s=r.length;n<s;++n)i+=_b(String(n),r[n],e,t).replace(/^ +/g,\"\"),n+1<s&&(i+=\", \");return i+=\"]\",i}function Y8e(r,e,t){let i=`${t}  `,n=\"\";n+=t,n+=`[\n`;for(let s=0,o=r.length;s<o;++s)n+=i+_b(String(s),r[s],e,i).replace(/^ +/,\"\"),s+1<o&&(n+=\",\"),n+=`\n`;return n+=t,n+=\"]\",n}function j8e(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+=_b(l,c,e,t).replace(/^ +/g,\"\"),a+=1)}return n+=\"}\",n}function q8e(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+=_b(c,u,e,n).replace(/^ +/g,\"\"),o+=1)}return o!==0&&(s+=`\n`),s+=t,s+=\"}\",s}function _b(r,e,t,i){let{next:n}=MAe[t],s=n[r]||n[\"*\"];return KAe(e,s,i)}function KAe(r,e,t){let{collapsed:i}=MAe[e];return Array.isArray(r)?i?G8e(r,e,t):Y8e(r,e,t):typeof r==\"object\"&&r!==null?i?j8e(r,e,t):q8e(r,e,t):JSON.stringify(r)}function UAe(r){return KAe(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 W8e(r){return iE(r.fallbackPool||[],([e])=>e)}function z8e(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:W8e(r),packageRegistryData:z8e(r)}}var YAe=Pe(GAe());function jAe(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,YAe.default)()].join(\"\")}function V8e(r){return JSON.stringify(r,null,2)}function X8e(r){return`'${r.replace(/\\\\/g,\"\\\\\\\\\").replace(/'/g,\"\\\\'\").replace(/\\n/g,`\\\\\n`)}'`}function Z8e(r){return[`return hydrateRuntimeState(JSON.parse(${X8e(UAe(r))}), {basePath: basePath || __dirname});\n`].join(\"\")}function _8e(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 qAe(r){let e=nE(r),t=Z8e(e);return jAe(r.shebang,t)}function JAe(r){let e=nE(r),t=_8e(r.dataLocation),i=jAe(r.shebang,t);return{dataFile:V8e(e),loaderFile:i}}var dle=J(\"fs\");var Cle=J(\"util\");function GO(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\"),uA=J(\"url\"),_O=J(\"util\");var qi=J(\"url\");var XAe=Pe(J(\"assert\"));var YO=Array.isArray,sE=JSON.stringify,oE=Object.getOwnPropertyNames,Gu=(r,e)=>Object.prototype.hasOwnProperty.call(r,e),jO=(r,e)=>RegExp.prototype.exec.call(r,e),qO=(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),WO=(r,...e)=>String.prototype.lastIndexOf.apply(r,e),aE=(r,...e)=>String.prototype.indexOf.apply(r,e),WAe=(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),zAe=Map,VAe=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 ZAe=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),zO=AE(\"ERR_INVALID_MODULE_SPECIFIER\",(r,e,t=void 0)=>`Invalid module \"${r}\" ${e}${t?` imported from ${t}`:\"\"}`,TypeError),_Ae=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,XAe.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),$Ae=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 eQ=J(\"url\");function ele(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 $b=new zAe;function $8e(r,e,t,i){let n=$b.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 $b.set(r,h),h}let o;try{o=VAe(s)}catch(h){throw new lE(r,(t?`\"${e}\" from `:\"\")+(0,eQ.fileURLToPath)(t||e),h.message)}let{imports:a,main:l,name:c,type:u}=ele(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 $b.set(r,f),f}function tle(r,e){let t=new URL(\"./package.json\",r);for(;;){let s=t.pathname;if(Il(s,\"node_modules/package.json\"))break;let o=$8e((0,eQ.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,eQ.fileURLToPath)(t),n={pjsonPath:i,exists:!1,main:void 0,name:void 0,type:\"none\",exports:void 0,imports:void 0};return $b.set(i,n),n}function eze(r,e,t){throw new ZAe(r,e&&(0,qi.fileURLToPath)(new URL(\".\",e)),(0,qi.fileURLToPath)(t))}function tze(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 zO(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 _Ae((0,qi.fileURLToPath)(new URL(\".\",t)),r,e,i,n&&(0,qi.fileURLToPath)(n))}var rle=/(^|\\\\|\\/)((\\.|%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,ile=/\\*/g;function rze(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?qO(ile,r,()=>e):r+e}cE(t,r,i,o,n)}jO(rle,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(jO(rle,e)!==null){let g=s?WAe(t,\"*\",()=>e):t+e;tze(g,i,o,n)}return s?new URL(qO(ile,l.href,()=>e)):new URL(e,l)}function ize(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 rze(e,t,i,r,n,s,o,a);if(YO(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(ize(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 sle(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 nze(r,e,t){if(typeof r==\"string\"||YO(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 VO(r,e,t){throw new $Ae((0,qi.fileURLToPath)(new URL(\".\",e)),r,t&&(0,qi.fileURLToPath)(t))}var nle=new Set;function sze(r,e,t){let i=(0,qi.fileURLToPath)(e);nle.has(i+\"|\"+r)||(nle.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 ole({packageJSONUrl:r,packageSubpath:e,exports:t,base:i,conditions:n}){if(nze(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&&VO(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,\"/\")&&sze(e,r,i);let g=yl(c,u+1);e.length>=c.length&&Il(e,g)&&sle(s,c)===1&&WO(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&&VO(e,r,i),c}VO(e,r,i)}function ale({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 zO(r,o,(0,qi.fileURLToPath)(e))}let n,s=tle(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)&&sle(a,g)===1&&WO(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}}}eze(r,n,e)}var oze=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=oze.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 po(r){return K.normalize(K.fromPortablePath(r))}var ule=Pe(lle());function gle(r){return aze(),ZO[r]}var ZO;function aze(){ZO||(ZO={\"--conditions\":[],...cle(Aze()),...cle(process.execArgv)})}function cle(r){return(0,ule.default)({\"--conditions\":[String],\"-C\":\"--conditions\"},{argv:r,permissive:!0})}function Aze(){let r=[],e=lze(process.env.NODE_OPTIONS||\"\",r);return r.length,e}function lze(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 hle=J(\"module\");var[Ji,aa]=process.versions.node.split(\".\").map(r=>parseInt(r,10)),aBt=Ji>16||Ji===16&&aa>=12,ABt=Ji>17||Ji===17&&aa>=5||Ji===16&&aa>=15,lBt=Ji>17||Ji===17&&aa>=1||Ji===16&&aa>14,fle=Ji>19||Ji===19&&aa>=2||Ji===18&&aa>=13,cBt=Ji>19||Ji===19&&aa>=3,uBt=Ji>18||Ji===18&&aa>=1||Ji===16&&aa>=17;var cze=new Set(hle.Module.builtinModules||Object.keys(process.binding(\"natives\"))),tQ=r=>r.startsWith(\"node:\")||cze.has(r);function ple(r){if(process.env.WATCH_REPORT_DEPENDENCIES&&process.send)if(r=r.map(e=>K.fromPortablePath(Br.resolveVirtual(K.toPortablePath(e)))),fle)process.send({\"watch:require\":r});else for(let e of r)process.send({\"watch:require\":e})}function $O(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,_O.inspect)(_e,{colors:le,compact:!0})}`);oe.result&&(console.error(),console.error(`  ${Be(\"37;1\",\"Out \\u2192\")} ${(0,_O.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\",...gle(\"--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=ole({packageJSONUrl:(0,uA.pathToFileURL)(K.fromPortablePath(qe)),packageSubpath:Y,exports:ne.exports,base:Be?(0,uA.pathToFileURL)(K.fromPortablePath(Be)):null,conditions:le});return K.toPortablePath((0,uA.fileURLToPath)(he))}catch(he){throw ri(\"EXPORTS_RESOLUTION_FAILED\",he.message,{unqualifiedPath:po(oe),locator:fe,pkgJson:ne,subpath:po(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&&tQ(oe))return null;let fe=po(oe),ae=le&&po(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&&tQ(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);{ple(Be.map(he=>K.fromPortablePath(he)));let ne=po(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: ${po(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: ${po(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: ${po(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=ale({name:oe,base:(0,uA.pathToFileURL)(K.fromPortablePath(le)),conditions:(ae=Be.conditions)!=null?ae:D,readFileSyncFn:O});if(fe instanceof uA.URL)return pe(K.toPortablePath((0,uA.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||!tQ(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:po(oe),issuer:le&&po(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 xBt=(0,Cle.promisify)(dle.readFile);var mle=(r,e,t)=>{let i=nE(r),n=GO(i,{basePath:e}),s=K.join(e,xt.pnpCjs);return $O(n,{fakeFs:t,pnpapiResolution:s})};var tM=Pe(Ile());var Co={};ut(Co,{checkAndReportManifestCompatibility:()=>wle,checkManifestCompatibility:()=>yle,extractBuildScripts:()=>rQ,getExtractHint:()=>rM,hasBindingGyp:()=>iM});function yle(r){return P.isPackageCompatible(r,ws.getArchitectureSet())}function wle(r,e,{configuration:t,report:i}){return yle(r)?!0:(i==null||i.reportWarningOnce(76,`${P.prettyLocator(t,r)} The ${ws.getArchitectureName()} architecture is incompatible with this package, ${e} skipped.`),!1)}function rQ(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.`),[]):wle(r,\"build\",{configuration:i,report:n})?s:[]}var gze=new Set([\".exe\",\".bin\",\".h\",\".hh\",\".hpp\",\".c\",\".cc\",\".cpp\",\".java\",\".jar\",\".node\"]);function rM(r){return r.packageFs.getExtractHint({relevantExtensions:gze})}function iM(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 fze=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 Qe(`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 Qe(`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 hze(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?rQ(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=nM(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:nM(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=qAe(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,tM.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:fze.has(e.identHash)||e.conditions!=null?!0:t.manifest.preferUnplugged!==null?t.manifest.preferUnplugged:!!(rQ(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 So(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=nM(this.opts.project.cwd,e);return Ie.getFactoryWithDefault(t,i,()=>({packageLocation:i,packageDependencies:new Map,packagePeers:new Set,linkType:\"SOFT\",discardFromLookup:!1}))}};function nM(r,e){let t=x.relative(r,e);return t.match(/^\\.{0,2}\\//)||(t=`./${t}`),t.replace(/\\/?$/,\"/\")}async function hze(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:rM(r),hasBindingGyp:iM(r)}}}var Ble=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 Qe(\"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 Qe(`The range of the descriptor patterns must be a valid semver range (${P.prettyDescriptor(t,C)})`);return y=>{let B=P.stringifyIdent(y);return!Ble.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 Qe(`Patterns ${ee.prettyList(t,o,ee.Type.CODE)} don't match any packages referenced by ${g}`);if(o.size>0)throw new Qe(`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\")}),Sle=r=>/\\s/.test(r)?JSON.stringify(r):r;async function pze(r,e,t){let i=Bl(r),n=`--require ${Sle(K.fromPortablePath(i.cjs))}`;if(M.existsSync(i.esmLoader)&&(n=`${n} --experimental-loader ${(0,Qle.pathToFileURL)(K.fromPortablePath(i.esmLoader)).href}`),i.cjs.includes(\" \")&&ble.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 dze(r,e){let t=Bl(r);e(t.cjs),e(t.esmLoader),e(r.configuration.get(\"pnpDataPath\")),e(r.configuration.get(\"pnpUnpluggedFolder\"))}var Cze={hooks:{populateYarnPaths:dze,setupScriptEnvironment:pze},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]},mze=Cze;var Nle=Pe(kle());var gM=Pe(J(\"crypto\")),Tle=Pe(J(\"fs\")),Lle=1,kr=\"node_modules\",iQ=\".bin\",Ole=\".yarn-state.yml\",Tze=1e3;var nQ=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 uM(t.project,{unrollAliases:!0}));if(n===null)throw new Qe(\"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 Qe(`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 uM(t.project,{unrollAliases:!0}));if(i===null)return null;let{locationRoot:n,segments:s}=sQ(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 cM(e)}isEnabled(e){return e.project.configuration.get(\"nodeLinker\")===\"node-modules\"}},cM=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 Lze(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 uM(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=UO(a);await Gze(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(Hle(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=Co.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 Lze(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:Co.getExtractHint(e),hasBindingGyp:Co.hasBindingGyp(e)}}}async function Oze(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: ${Lle}\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,Ole);n&&await M.removePromise(c),await M.changeFilePromise(c,s,{automaticNewlines:!0})}async function uM(r,{unrollAliases:e=!1}={}){let t=r.cwd,i=x.join(t,kr,Ole),n;try{n=await M.statPromise(i)}catch{}if(!n)return null;let s=yi(await M.readFilePromise(i,\"utf8\"));if(s.__metadata.version>Lle)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(Jr(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:Mle(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,Jr(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}},Rle=4,sQ=(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}},Mle=(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}=sQ(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},fM=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 Kle(r,e,t){let i=x.join(r,Jr(`${gM.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 Mze({srcPath:r,dstPath:e,entry:t,globalHardlinksStore:i,baseFs:n,nmMode:s}){if(t.kind===Ule.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-Tze))if(await li.checksumFile(a,{baseFs:M,algorithm:\"sha1\"})!==t.digest){let g=x.join(i,Jr(`${gM.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 Kle(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 Ule=(i=>(i.FILE=\"file\",i.DIRECTORY=\"directory\",i.SYMLINK=\"symlink\",i))(Ule||{}),Kze=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 Mze({srcPath:g,dstPath:f,entry:u,nmMode:n,baseFs:t,globalHardlinksStore:i}),u.mtimeMs!==h&&(l=!0)}else u.kind===\"symlink\"&&await fM(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 Kle(i,c,Buffer.from(JSON.stringify(Object.fromEntries(a))))}};function Uze(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,iQ),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 Hle(r){let e=P.parseDescriptor(r);return P.isVirtualDescriptor(e)&&(e=P.devirtualizeDescriptor(e)),e.range.startsWith(\"link:\")}async function Hze(r,e,t,{loadManifest:i}){let n=new Map;for(let[a,{locations:l}]of r){let c=Hle(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(Jr(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 Fle=(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 hM(r){return x.join(r.get(\"globalFolder\"),\"store\")}async function Gze(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}=Uze(r.locationTree,r.binSymlinks,r.mtimeMs,i),f=Mle(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 fM(x.resolve(V),W)):await Kze(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>Rle&&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===iQ)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,Tle.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>Rle&&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(_){Fle(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}=sQ(_,{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=Fle(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}=sQ(_,{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\"?`${hM(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 Hze(e,f,i.cwd,{loadManifest:s});await Yze(c,W,i.cwd),await Oze(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 Yze(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,iQ);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,iQ),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,Jr(`${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,Nle.default)(K.fromPortablePath(l),K.fromPortablePath(u),{createPwshFile:!1}):(await M.removePromise(u),await fM(l,u),x.contains(t,await M.realpathPromise(l))!==null&&await M.chmodPromise(l,493)))}}}var oQ=class extends wl{constructor(){super(...arguments);this.mode=\"loose\"}makeInstaller(t){return new pM(t)}},pM=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=mle(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 jze={hooks:{cleanGlobalArtifacts:async r=>{let e=hM(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:[nQ,oQ]},qze=jze;var f1={};ut(f1,{default:()=>$Ve,npmConfigUtils:()=>or,npmHttpUtils:()=>Mt,npmPublishUtils:()=>Cp});var Wle=Pe(Xr());var gr=\"npm:\";var Mt={};ut(Mt,{AuthType:()=>Jle,customPackageError:()=>Wze,del:()=>Xze,get:()=>Eo,getIdentUrl:()=>Ql,handleInvalidAuthenticationError:()=>bl,post:()=>zze,put:()=>Vze});var EM=Pe(Km()),qle=J(\"url\");var or={};ut(or,{RegistryType:()=>Gle,getAuditRegistry:()=>Jze,getAuthConfiguration:()=>mM,getDefaultRegistry:()=>aQ,getPublishRegistry:()=>Yle,getRegistryConfiguration:()=>jle,getScopeConfiguration:()=>CM,getScopeRegistry:()=>gA,normalizeRegistry:()=>mo});var Gle=(i=>(i.AUDIT_REGISTRY=\"npmAuditRegistry\",i.FETCH_REGISTRY=\"npmRegistryServer\",i.PUBLISH_REGISTRY=\"npmPublishRegistry\",i))(Gle||{});function mo(r){return r.replace(/\\/$/,\"\")}function Jze(r,{configuration:e}){let t=e.get(\"npmAuditRegistry\");return t!==null?mo(t):Yle(r,{configuration:e})}function Yle(r,{configuration:e}){var t;return(t=r.publishConfig)!=null&&t.registry?mo(r.publishConfig.registry):r.name?gA(r.name.scope,{configuration:e,type:\"npmPublishRegistry\"}):aQ({configuration:e,type:\"npmPublishRegistry\"})}function gA(r,{configuration:e,type:t=\"npmRegistryServer\"}){let i=CM(r,{configuration:e});if(i===null)return aQ({configuration:e,type:t});let n=i.get(t);return n===null?aQ({configuration:e,type:t}):mo(n)}function aQ({configuration:r,type:e=\"npmRegistryServer\"}){let t=r.get(e);return mo(t!==null?t:r.get(\"npmRegistryServer\"))}function jle(r,{configuration:e}){let t=e.get(\"npmRegistries\"),i=mo(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 CM(r,{configuration:e}){if(r===null)return null;let i=e.get(\"npmScopes\").get(r);return i||null}function mM(r,{configuration:e,ident:t}){let i=t&&CM(t.scope,{configuration:e});return(i==null?void 0:i.get(\"npmAuthIdent\"))||(i==null?void 0:i.get(\"npmAuthToken\"))?i:jle(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 bl(r,{attemptedAs:e,registry:t,headers:i,configuration:n}){var s,o;if(lQ(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 _ze(t,i,{configuration:n})}`:`attempted as ${e}`})`)}function Wze(r){var e;return((e=r.response)==null?void 0:e.statusCode)===404?\"Package not found\":null}function Ql(r){return r.scope?`/@${r.scope}%2f${r.name}`:`/${r.name}`}async function Eo(r,{configuration:e,headers:t,ident:i,authType:n,registry:s,...o}){if(i&&typeof s>\"u\"&&(s=gA(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 AQ(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 bl(l,{registry:s,configuration:e,headers:t}),l}}async function zze(r,e,{attemptedAs:t,configuration:i,headers:n,ident:s,authType:o=3,registry:a,otp:l,...c}){if(s&&typeof a>\"u\"&&(a=gA(s.scope,{configuration:i})),typeof a!=\"string\")throw new Error(\"Assertion failed: The registry should be a string\");let u=await AQ(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(!lQ(g)||l)throw await bl(g,{attemptedAs:t,registry:a,configuration:i,headers:n}),g;l=await IM(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 bl(h,{attemptedAs:t,registry:a,configuration:i,headers:n}),h}}}async function Vze(r,e,{attemptedAs:t,configuration:i,headers:n,ident:s,authType:o=3,registry:a,otp:l,...c}){if(s&&typeof a>\"u\"&&(a=gA(s.scope,{configuration:i})),typeof a!=\"string\")throw new Error(\"Assertion failed: The registry should be a string\");let u=await AQ(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(!lQ(g))throw await bl(g,{attemptedAs:t,registry:a,configuration:i,headers:n}),g;l=await IM(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 bl(h,{attemptedAs:t,registry:a,configuration:i,headers:n}),h}}}async function Xze(r,{attemptedAs:e,configuration:t,headers:i,ident:n,authType:s=3,registry:o,otp:a,...l}){if(n&&typeof o>\"u\"&&(o=gA(n.scope,{configuration:t})),typeof o!=\"string\")throw new Error(\"Assertion failed: The registry should be a string\");let c=await AQ(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(!lQ(u)||a)throw await bl(u,{attemptedAs:e,registry:o,configuration:t,headers:i}),u;a=await IM(u,{configuration:t});let g={...i,...op(a)};try{return await Xt.del(`${o}${r}`,{configuration:t,headers:g,...l})}catch(f){throw await bl(f,{attemptedAs:e,registry:o,configuration:t,headers:i}),f}}}async function AQ(r,{authType:e=2,configuration:t,ident:i}){let n=mM(r,{configuration:t,ident:i}),s=Zze(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 Zze(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 _ze(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 qle.URL(`${r}/-/whoami`).href,{configuration:t,headers:e,jsonResponse:!0})).username)!=null?i:\"an unknown user\"}catch{return\"an unknown user\"}}async function IM(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,EM.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,EM.prompt)({type:\"password\",name:\"otp\",message:\"One-time password:\",required:!0,onCancel:()=>process.exit(130)});return process.stdout.write(`\n`),i}function lQ(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 cQ=class{supports(e,t){if(!e.reference.startsWith(gr))return!1;let{selector:i,params:n}=P.parseRange(e.reference);return!(!Wle.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 Eo(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 uQ=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 zle=Pe(Xr()),Vle=J(\"url\");var Ls=class{supports(e,t){if(!e.reference.startsWith(gr))return!1;let i=new Vle.URL(e.reference);return!(!zle.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 Eo(Ls.getLocatorUrl(e),{configuration:t.project.configuration,ident:e})}catch{i=await Eo(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=gA(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`${Ql(e)}/-/${e.name}-${t}.tgz`}};var Xle=Pe(Xr());var gQ=P.makeIdent(null,\"node-gyp\"),$ze=/\\b(node-gyp|prebuild-install)\\b/,fQ=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!!Xle.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 Eo(Ql(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 Eo(Ql(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(gQ.identHash)&&!o.peerDependencies.has(gQ.identHash)){for(let a of o.scripts.values())if(a.match($ze)){o.dependencies.set(gQ.identHash,P.makeDescriptor(gQ,\"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 hQ=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 Eo(Ql(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:()=>ZVe,getPublishAccess:()=>Uue,getReadmeContent:()=>Hue,makePublishBody:()=>XVe});var A1={};ut(A1,{default:()=>RVe,packUtils:()=>ca});var ca={};ut(ca,{genPackList:()=>OQ,genPackStream:()=>a1,genPackageManifest:()=>vue,hasPackScripts:()=>s1,prepareForPack:()=>o1});var n1=Pe(Bn()),Que=Pe(yue()),Sue=J(\"zlib\"),yVe=[\"/package.json\",\"/readme\",\"/readme.*\",\"/license\",\"/license.*\",\"/licence\",\"/licence.*\",\"/changelog\",\"/changelog.*\"],wVe=[\"/package.tgz\",\".github\",\".git\",\".hg\",\"node_modules\",\".npmignore\",\".gitignore\",\".#*\",\".DS_Store\"];async function s1(r){return!!(Wt.hasWorkspaceScript(r,\"prepack\")||Wt.hasWorkspaceScript(r,\"postpack\"))}async function o1(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 a1(r,e){var s,o;typeof e>\"u\"&&(e=await OQ(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=Que.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 vue(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,Sue.createGzip)();return i.pipe(n),n}async function vue(r){let e=JSON.parse(JSON.stringify(r.manifest.raw));return await r.project.configuration.triggerHook(t=>t.beforeWorkspacePacking,r,e),e}async function OQ(r){var g,f,h,p,C,y,B,v;let e=r.project,t=e.configuration,i={accept:[],reject:[]};for(let D of wVe)i.reject.push(D);for(let D of yVe)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)xue(s.accept,D,{cwd:Oe.root})}return await BVe(r.cwd,{hasExplicitFileList:u,globalList:i,ignoreList:s})}async function BVe(r,{hasExplicitFileList:e,globalList:t,ignoreList:i}){let n=[],s=new vo(r),o=[[Oe.root,[i]]];for(;o.length>0;){let[a,l]=o.pop(),c=await s.lstatPromise(a);if(!Bue(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 wue(s,a,\".npmignore\"):g?await wue(s,a,\".gitignore\"):null,p=h!==null?[h].concat(l):l;Bue(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 wue(r,e,t){let i={accept:[],reject:[]},n=await r.readFilePromise(x.join(e,t),\"utf8\");for(let s of n.split(/\\n/g))xue(i.reject,s,{cwd:e});return i}function bVe(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 xue(r,e,{cwd:t}){let i=e.trim();i===\"\"||i[0]===\"#\"||r.push(bVe(i,{cwd:t}))}function Bue(r,{globalList:e,ignoreLists:t}){let i=LQ(r,e.accept);if(i!==0)return i===2;let n=LQ(r,e.reject);if(n!==0)return n===1;if(t!==null)for(let s of t){let o=LQ(r,s.accept);if(o!==0)return o===2;let a=LQ(r,s.reject);if(a!==0)return a===1}return!1}function LQ(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 bue(r,i)?2:bue(r,t)?1:0}function bue(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!!(n1.default.isMatch(r,t,{dot:!0,nocase:!0})||n1.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 s1(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,QVe(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 o1(n,{report:c},async()=>{c.reportJson({base:K.fromPortablePath(n.cwd)});let u=await OQ(n);for(let g of u)c.reportInfo(null,K.fromPortablePath(g)),c.reportJson({location:K.fromPortablePath(g)});if(!this.dryRun){let g=await a1(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 QVe(r,{workspace:e}){let t=r.replace(\"%s\",SVe(e)).replace(\"%v\",vVe(e));return K.toPortablePath(t)}function SVe(r){return r.manifest.name!==null?P.slugifyIdent(r.manifest.name):\"package\"}function vVe(r){return r.manifest.version!==null?r.manifest.version:\"unknown\"}var xVe=[\"dependencies\",\"devDependencies\",\"peerDependencies\"],PVe=\"workspace:\",DVe=(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 xVe)for(let o of r.manifest.getForScope(s).values()){let a=t.tryWorkspaceByDescriptor(o),l=P.parseRange(o.range);if(l.protocol===PVe)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}}},kVe={hooks:{beforeWorkspacePacking:DVe},commands:[Vu]},RVe=kVe;var Oue=J(\"crypto\"),Mue=Pe(Lue()),Kue=J(\"url\");async function XVe(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,Oue.createHash)(\"sha1\").update(e).digest(\"hex\"),u=Mue.default.fromData(e).toString(),g=t!=null?t:Uue(r,o),f=await Hue(r),h=await ca.genPackageManifest(r),p=`${l}-${a}.tgz`,C=new Kue.URL(`${mo(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 ZVe(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 Uue(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 Hue(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 g1={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}},Gue={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\"}},_Ve={configuration:{...g1,...Gue,npmScopes:{description:\"Settings per package scope\",type:\"MAP\",valueDefinition:{description:\"\",type:\"SHAPE\",properties:{...g1,...Gue}}},npmRegistries:{description:\"Settings per registry\",type:\"MAP\",normalizeKeys:mo,valueDefinition:{description:\"\",type:\"SHAPE\",properties:{...g1}}}},fetchers:[cQ,Ls],resolvers:[uQ,fQ,hQ]},$Ve=_Ve;var C1={};ut(C1,{default:()=>l9e});var kE=Pe(Bn());ls();var MQ=(i=>(i.All=\"all\",i.Production=\"production\",i.Development=\"development\",i))(MQ||{}),KQ=(s=>(s.Info=\"info\",s.Low=\"low\",s.Moderate=\"moderate\",s.High=\"high\",s.Critical=\"critical\",s))(KQ||{});var DE=[\"info\",\"low\",\"moderate\",\"high\",\"critical\"];function jue(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 e9e(r,e){return new Set([...r].filter(t=>!e.has(t)))}function t9e(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=jue(r,l),g=jue(r,c);return e9e(g,u)}function que(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 r9e(r,e){let t=Jue(e),i={};for(let n of t)i[n]=r[n];return i}function Wue(r,e){var i;let t=r9e(r,e);for(let n of Object.keys(t))if((i=t[n])!=null?i:0>0)return!0;return!1}function zue(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 Vue(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 que([...o,...l].filter(c=>P.parseRange(c.range).protocol===null))}function Xue(r,e,{all:t}){var s;let i=t9e(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:que(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(MQ)});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(KQ)});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=Vue(i,n,{all:this.all,environment:this.environment}),o=Xue(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=Wue(u.metadata.vulnerabilities,this.severity);return!this.json&&h?(es.emitTree(zue(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 h1=Pe(Xr()),p1=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 Qe(`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=d1(await Mt.get(g,{configuration:t,ident:u,jsonResponse:!0,customErrorMessage:Mt.customPackageError})),h=Object.keys(f.versions).sort(h1.default.compareLoose),C=f[\"dist-tags\"].latest||h[h.length-1],y=vt.validRange(u.range);if(y){let T=h1.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)}});p1.inspect.styles.name=\"cyan\";for(let l of s)(l!==s[0]||o)&&this.context.stdout.write(`\n`),this.context.stdout.write(`${(0,p1.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 d1(r){if(Array.isArray(r)){let e=[];for(let t of r)t=d1(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=d1(r[t]);i&&(e[t]=i)}return e}else return r||null}var Zue=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 UQ({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 s9e({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 n9e(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 UQ({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 n9e(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 s9e({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,Zue.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 UQ({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 a9e(),s.reportInfo(0,\"Successfully logged out from everything\")),this.scope){await _ue(\"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 UQ({configuration:t,cwd:this.context.cwd,publish:this.publish});await _ue(\"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 o9e(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 a9e(){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))o9e(i,n)&&(t=!0);if(Object.keys(i).length!==0)return t?i:e};return await ye.updateHomeConfiguration({npmRegistries:r,npmScopes:r})}async function _ue(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 Qe(\"Private workspaces cannot be published\");if(n.manifest.name===null||n.manifest.version===null)throw new Qe(\"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 $ue=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 Qe(`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(!$ue.default.valid(o))throw new Qe(`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 Qe(\"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 Qe(`${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 A9e={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]},l9e=A9e;var S1={};ut(S1,{default:()=>Q9e,patchUtils:()=>ag});var ag={};ut(ag,{applyPatchFile:()=>GQ,diffFolders:()=>b1,ensureUnpatchedDescriptor:()=>E1,extractPackageToDisk:()=>B1,extractPatchFlags:()=>oge,isParentRequired:()=>w1,loadPatchFiles:()=>LE,makeDescriptor:()=>I1,makeLocator:()=>y1,makePatchHash:()=>Q1,parseDescriptor:()=>NE,parseLocator:()=>TE,parsePatchFile:()=>FE});var c9e=/^@@ -(\\d+)(,(\\d+))? \\+(\\d+)(,(\\d+))? @@.*/;function Ep(r){return x.relative(Oe.root,x.resolve(Oe.root,K.toPortablePath(r)))}function u9e(r){let e=r.trim().match(c9e);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 g9e=420,f9e=493;var ege=()=>({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}),h9e=r=>({header:u9e(r),parts:[]}),p9e={[\"@\"]:\"header\",[\"-\"]:\"deletion\",[\"+\"]:\"insertion\",[\" \"]:\"context\",[\"\\\\\"]:\"pragma\",undefined:\"context\"};function d9e(r){let e=[],t=ege(),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=ege()}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=p9e[c[0]]||null;switch(u){case\"header\":o(),n=h9e(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)m9e(c);return e}function C9e(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:HQ(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:HQ(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:HQ(o),newMode:HQ(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 HQ(r){let e=parseInt(r,8)&511;if(e!==g9e&&e!==f9e)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(),C9e(d9e(e))}function m9e(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 GQ(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 y9e(n,{baseFs:e,dryRun:t})});break;case\"mode change\":{let o=(await e.statPromise(n.path)).mode;if(tge(n.newMode)!==tge(o))continue;await yp(e,n.path,async()=>{await e.chmodPromise(n.path,n.newMode)})}break;default:Ie.assertNever(n);break}}function tge(r){return(r&64)>0}function rge(r){return r.replace(/\\s+$/,\"\")}function I9e(r,e){return rge(r)===rge(e)}async function y9e({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=ige(g,o,B),v!==null)){y=-y;break}if(y<=p&&(B=f+y,v=ige(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 ige(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||!I9e(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 B9e=/^builtin<([^>]+)>$/;function m1(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}=m1(r.range,P.parseDescriptor);return{...t,sourceDescriptor:e}}function TE(r){let{sourceItem:e,...t}=m1(r.reference,P.parseLocator);return{...t,sourceLocator:e}}function E1(r){if(!r.range.startsWith(\"patch:\"))return r;let{sourceItem:e}=m1(r.range,P.parseDescriptor);return e}function nge({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 I1(r,{parentLocator:e,sourceDescriptor:t,patchPaths:i}){return P.makeDescriptor(r,nge({parentLocator:e,sourceItem:t,patchPaths:i},P.stringifyDescriptor))}function y1(r,{parentLocator:e,sourcePackage:t,patchPaths:i,patchHash:n}){return P.makeLocator(r,nge({parentLocator:e,sourceItem:t,sourceVersion:t.version,patchPaths:i,patchHash:n},P.stringifyLocator))}function sge({onAbsolute:r,onRelative:e,onBuiltin:t},i){i.startsWith(\"~\")&&(i=i.slice(1));let s=i.match(B9e);return s!==null?t(s[1]):x.isAbsolute(i)?r(i):e(i)}function oge(r){let e=r.startsWith(\"~\");return e&&(r=r.slice(1)),{optional:e}}function w1(r){return sge({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=oge(o),l=await sge({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 B1(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 b1(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 Q1(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 age(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 YQ=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 GQ(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||age(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 jQ=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=>!w1(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=Q1(a,l.version);return[y1(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 Qe(\"The argument folder didn't get created by 'yarn patch'\");let l=await b1(o,s),c=await M.readJsonPromise(a),u=P.parseLocator(c.locator,!0);if(!i.storedPackages.has(u.locatorHash))throw new Qe(\"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=E1(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=I1(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 Qe(\"No package found in the project for the given locator\");if(a.length>1)throw new Qe(`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 Qe(\"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 B1(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 b9e={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:[YQ],resolvers:[jQ]},Q9e=b9e;var D1={};ut(D1,{default:()=>x9e});var qQ=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=x1(),n=t.project.installersCustomData.get(i);if(!n)throw new Qe(`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 Qe(`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=x1(),n=t.project.installersCustomData.get(i);if(!n)throw new Qe(`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 v1(e)}isEnabled(e){return e.project.configuration.get(\"nodeLinker\")===\"pnpm\"}},v1=class{constructor(e){this.opts=e;this.asyncActions=new Ie.AsyncActions(10);this.customData={pathByLocator:new Map,locatorByPath:new Map}}getCustomDataKey(){return x1()}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=S9e(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:Co.hasBindingGyp(t)}},l=this.opts.project.getDependencyMeta(o,e.version),c=Co.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\"&&(!Age(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 lge(s);for(let[l,c]of t){let u=c;Age(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(cge(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=gge(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 lge(f);return h.delete(l.join(x.sep)),cge(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 P1(e),this.opts.project.configuration.get(\"nodeLinker\")!==\"node-modules\"&&await P1(uge(this.opts.project)),{customData:this.customData}}};function x1(){return JSON.stringify({name:\"PnpmInstaller\",version:2})}function uge(r){return x.join(r.cwd,xt.nodeModules)}function gge(r){return x.join(uge(r),\".store\")}function S9e(r,{project:e}){let t=P.slugifyLocator(r),i=P.getIdentVendorPath(r);return x.join(gge(e),t,i)}function Age(r,{project:e}){return!P.isVirtualLocator(r)||!e.tryWorkspaceByLocator(r)}async function lge(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 cge(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=>P1(x.join(r,s)))))}async function P1(r){try{await M.rmdirPromise(r)}catch(e){if(e.code!==\"ENOENT\"&&e.code!==\"ENOTEMPTY\")throw e}}var v9e={linkers:[qQ]},x9e=v9e;var Bb=()=>({modules:new Map([[\"@yarnpkg/cli\",Nm],[\"@yarnpkg/core\",sm],[\"@yarnpkg/fslib\",Wp],[\"@yarnpkg/libzip\",xC],[\"@yarnpkg/parsers\",td],[\"@yarnpkg/shell\",RC],[\"clipanion\",T$(ud)],[\"semver\",P9e],[\"typanion\",hn],[\"yup\",D9e],[\"@yarnpkg/plugin-essentials\",CO],[\"@yarnpkg/plugin-compat\",wO],[\"@yarnpkg/plugin-dlx\",BO],[\"@yarnpkg/plugin-file\",vO],[\"@yarnpkg/plugin-git\",dO],[\"@yarnpkg/plugin-github\",xO],[\"@yarnpkg/plugin-http\",PO],[\"@yarnpkg/plugin-init\",FO],[\"@yarnpkg/plugin-link\",NO],[\"@yarnpkg/plugin-nm\",dM],[\"@yarnpkg/plugin-npm\",f1],[\"@yarnpkg/plugin-npm-cli\",C1],[\"@yarnpkg/plugin-pack\",A1],[\"@yarnpkg/plugin-patch\",S1],[\"@yarnpkg/plugin-pnp\",sM],[\"@yarnpkg/plugin-pnpm\",D1]]),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:Bb()});})();\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": "exercises/practice/yacht/.yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/yacht/babel.config.cjs",
    "content": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],\n  plugins: [],\n}\n"
  },
  {
    "path": "exercises/practice/yacht/eslint.config.mjs",
    "content": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'\n\nexport default [\n  ...tsEslint.config(...config, {\n    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],\n    extends: maintainersConfig,\n  }),\n  {\n    ignores: [\n      // # Protected or generated\n      '.git/**/*',\n      '.vscode/**/*',\n\n      //# When using npm\n      'node_modules/**/*',\n\n      // # Configuration files\n      'babel.config.cjs',\n      'jest.config.cjs',\n    ],\n  },\n]\n"
  },
  {
    "path": "exercises/practice/yacht/jest.config.cjs",
    "content": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**/test/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[jt]s?(x)',\n  ],\n  testPathIgnorePatterns: [\n    '/(?:production_)?node_modules/',\n    '.d.ts$',\n    '<rootDir>/test/fixtures',\n    '<rootDir>/test/helpers',\n    '__mocks__',\n  ],\n  transform: {\n    '^.+\\\\.[jt]sx?$': 'babel-jest',\n  },\n  moduleNameMapper: {\n    '^(\\\\.\\\\/.+)\\\\.js$': '$1',\n  },\n}\n"
  },
  {
    "path": "exercises/practice/yacht/package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-yacht\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"private\": true,\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"tstyche\": \"^2.1.1\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"corepack yarn node test-runner.mjs\",\n    \"test:types\": \"corepack yarn tstyche\",\n    \"test:implementation\": \"corepack yarn jest --no-cache --passWithNoTests\",\n    \"lint\": \"corepack yarn lint:types && corepack yarn lint:ci\",\n    \"lint:types\": \"corepack yarn tsc --noEmit -p .\",\n    \"lint:ci\": \"corepack yarn eslint . --ext .tsx,.ts\"\n  },\n  \"packageManager\": \"yarn@4.5.1\"\n}\n"
  },
  {
    "path": "exercises/practice/yacht/test-runner.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exercism CLI and\n * not the online editor. That's great! The file you are looking at executes\n * the various steps the online test-runner also takes.\n *\n * @see https://github.com/exercism/typescript-test-runner\n *\n * TypeScript track exercises generally consist of at least two out of three\n * types of tests to run.\n *\n * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid\n * 2. tstyche, static analysis tests to see if the types used are expected\n * 3. jest, runtime implementation tests to see if the solution is correct\n *\n * If one of these three fails, this script terminates with -1, -2, or -3\n * respectively. If it succeeds, it terminates with exit code 0.\n *\n * @note you need corepack (bundled with node LTS) enabled in order for this\n *    test runner to work as expected. Follow the installation and test\n *    instructions if you see errors about corepack or pnp.\n */\n\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { exit } from 'node:process'\nimport { URL } from 'node:url'\n\n/**\n * Before executing any tests, the test runner attempts to find the\n * exercise config.json file which has metadata about which types of tests\n * to run for this solution.\n */\nconst metaDirectory = new URL('./.meta/', import.meta.url)\nconst exercismDirectory = new URL('./.exercism/', import.meta.url)\nconst configDirectory = existsSync(metaDirectory)\n  ? metaDirectory\n  : existsSync(exercismDirectory)\n    ? exercismDirectory\n    : null\n\nif (configDirectory === null) {\n  throw new Error(\n    'Expected .meta or .exercism directory to exist, but I cannot find it.'\n  )\n}\n\nconst configFile = new URL('./config.json', configDirectory)\nif (!existsSync(configFile)) {\n  throw new Error('Expected config.json to exist at ' + configFile.toString())\n}\n\n// Experimental: import config from './config.json' with { type: 'json' }\n/** @type {import('./config.json') } */\nconst config = JSON.parse(readFileSync(configFile))\n\nconst jest = !config.custom || config.custom['flag.tests.jest']\nconst tstyche = config.custom?.['flag.tests.tstyche']\nconsole.log(\n  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `\n)\n\n/**\n * 1. tsc: the typescript compiler\n */\ntry {\n  console.log('[tests] tsc (compile)')\n  execSync('corepack yarn lint:types', {\n    stdio: 'inherit',\n    cwd: process.cwd(),\n  })\n} catch {\n  exit(-1)\n}\n\n/**\n * 2. tstyche: type tests\n */\nif (tstyche) {\n  try {\n    console.log('[tests] tstyche (type tests)')\n    execSync('corepack yarn test:types', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-2)\n  }\n}\n\n/**\n * 3. jest: implementation tests\n */\nif (jest) {\n  try {\n    console.log('[tests] tstyche (implementation tests)')\n    execSync('corepack yarn test:implementation', {\n      stdio: 'inherit',\n      cwd: process.cwd(),\n    })\n  } catch {\n    exit(-3)\n  }\n}\n\n/**\n * Done! 🥳\n */\n"
  },
  {
    "path": "exercises/practice/yacht/tsconfig.json",
    "content": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the newest syntax, and have access to console.log\n    // https://www.typescriptlang.org/tsconfig#lib\n    \"lib\": [\"ES2020\", \"dom\"],\n    // Make sure typescript is configured to output ESM\n    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm\n    \"module\": \"Node16\",\n    // Since this project is using babel, TypeScript may target something very\n    // high, and babel will make sure it runs on your local Node version.\n    // https://babeljs.io/docs/en/\n    \"target\": \"ES2020\", // ESLint doesn't support this yet: \"es2022\",\n\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n\n    // Because jest-resolve isn't like node resolve, the absolute path must be .ts\n    \"allowImportingTsExtensions\": true,\n    \"noEmit\": true,\n\n    // Because we'll be using babel: ensure that Babel can safely transpile\n    // files in the TypeScript project.\n    //\n    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats\n    \"isolatedModules\": true\n  },\n  \"include\": [\n    \"*.ts\",\n    \"*.tsx\",\n    \".meta/*.ts\",\n    \".meta/*.tsx\",\n    \"__typetests__/*.tst.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "exercises/practice/yacht/yacht.test.ts",
    "content": "import { describe, expect, it, xit } from '@jest/globals'\nimport { Category, score } from './yacht.ts'\n\ndescribe('Yacht', () => {\n  it('Yacht', () => {\n    expect(score([5, 5, 5, 5, 5], Category.YACHT)).toEqual(50)\n  })\n\n  xit('Not Yacht', () => {\n    expect(score([1, 3, 3, 2, 5], Category.YACHT)).toEqual(0)\n  })\n\n  xit('Ones', () => {\n    expect(score([1, 1, 1, 3, 5], Category.ONES)).toEqual(3)\n  })\n\n  xit('Ones, out of order', () => {\n    expect(score([3, 1, 1, 5, 1], Category.ONES)).toEqual(3)\n  })\n\n  xit('No ones', () => {\n    expect(score([4, 3, 6, 5, 5], Category.ONES)).toEqual(0)\n  })\n\n  xit('Twos', () => {\n    expect(score([2, 3, 4, 5, 6], Category.TWOS)).toEqual(2)\n  })\n\n  xit('Fours', () => {\n    expect(score([1, 4, 1, 4, 1], Category.FOURS)).toEqual(8)\n  })\n\n  xit('Yacht counted as threes', () => {\n    expect(score([3, 3, 3, 3, 3], Category.THREES)).toEqual(15)\n  })\n\n  xit('Yacht of 3s counted as fives', () => {\n    expect(score([3, 3, 3, 3, 3], Category.FIVES)).toEqual(0)\n  })\n\n  xit('Fives', () => {\n    expect(score([1, 5, 3, 5, 3], Category.FIVES)).toEqual(10)\n  })\n\n  xit('Sixes', () => {\n    expect(score([2, 3, 4, 5, 6], Category.SIXES)).toEqual(6)\n  })\n\n  xit('Full house two small, three big', () => {\n    expect(score([2, 2, 4, 4, 4], Category.FULL_HOUSE)).toEqual(16)\n  })\n\n  xit('Full house three small, two big', () => {\n    expect(score([5, 3, 3, 5, 3], Category.FULL_HOUSE)).toEqual(19)\n  })\n\n  xit('Two pair is not a full house', () => {\n    expect(score([2, 2, 4, 4, 5], Category.FULL_HOUSE)).toEqual(0)\n  })\n\n  xit('Four of a kind is not a full house', () => {\n    expect(score([1, 4, 4, 4, 4], Category.FULL_HOUSE)).toEqual(0)\n  })\n\n  xit('Yacht is not a full house', () => {\n    expect(score([2, 2, 2, 2, 2], Category.FULL_HOUSE)).toEqual(0)\n  })\n\n  xit('Four of a Kind', () => {\n    expect(score([6, 6, 4, 6, 6], Category.FOUR_OF_A_KIND)).toEqual(24)\n  })\n\n  xit('Yacht can be scored as Four of a Kind', () => {\n    expect(score([3, 3, 3, 3, 3], Category.FOUR_OF_A_KIND)).toEqual(12)\n  })\n\n  xit('Full house is not Four of a Kind', () => {\n    expect(score([3, 3, 3, 5, 5], Category.FOUR_OF_A_KIND)).toEqual(0)\n  })\n\n  xit('Little Straight', () => {\n    expect(score([3, 5, 4, 1, 2], Category.LITTLE_STRAIGHT)).toEqual(30)\n  })\n\n  xit('Little Straight as Big Straight', () => {\n    expect(score([1, 2, 3, 4, 5], Category.BIG_STRAIGHT)).toEqual(0)\n  })\n\n  xit('Four in order but not a little straight', () => {\n    expect(score([1, 1, 2, 3, 4], Category.LITTLE_STRAIGHT)).toEqual(0)\n  })\n\n  xit('No pairs but not a little straight', () => {\n    expect(score([1, 2, 3, 4, 6], Category.LITTLE_STRAIGHT)).toEqual(0)\n  })\n\n  xit('Minimum is 1, maximum is 5, but not a little straight', () => {\n    expect(score([1, 1, 3, 4, 5], Category.LITTLE_STRAIGHT)).toEqual(0)\n  })\n\n  xit('Big Straight', () => {\n    expect(score([4, 6, 2, 5, 3], Category.BIG_STRAIGHT)).toEqual(30)\n  })\n\n  xit('Big Straight as little straight', () => {\n    expect(score([6, 5, 4, 3, 2], Category.LITTLE_STRAIGHT)).toEqual(0)\n  })\n\n  xit('No pairs but not a big straight', () => {\n    expect(score([6, 5, 4, 3, 1], Category.BIG_STRAIGHT)).toEqual(0)\n  })\n\n  xit('Choice', () => {\n    expect(score([3, 3, 5, 6, 6], Category.CHOICE)).toEqual(23)\n  })\n\n  xit('Yacht as choice', () => {\n    expect(score([2, 2, 2, 2, 2], Category.CHOICE)).toEqual(10)\n  })\n})\n"
  },
  {
    "path": "exercises/practice/yacht/yacht.ts",
    "content": "//\n// This is only a SKELETON file for the 'Yacht' exercise. It's been provided as a\n// convenience to get you started writing code faster.\n//\n\nexport const enum Category {\n  ONES,\n  TWOS,\n  THREES,\n  FOURS,\n  FIVES,\n  SIXES,\n  FULL_HOUSE,\n  FOUR_OF_A_KIND,\n  LITTLE_STRAIGHT,\n  BIG_STRAIGHT,\n  CHOICE,\n  YACHT,\n}\n\nexport const score = (dice: unknown, category: Category): unknown => {\n  throw new Error('Remove this statement and implement this function')\n}\n"
  },
  {
    "path": "exercises/shared/.docs/help.md",
    "content": "# Help\n\nTo get help if you're having trouble, you can use one of the following resources:\n\n- [TypeScript QuickStart](https://www.typescriptlang.org/docs/handbook/release-notes/overview.html)\n- [ECMAScript 2015 Language Specification](https://www.ecma-international.org/wp-content/uploads/ECMA-262_6th_edition_june_2015.pdf) (pdf)\n- [Mozilla JavaScript Reference](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference)\n- [/r/typescript](https://www.reddit.com/r/typescript) is the TypeScript subreddit.\n- [StackOverflow](https://stackoverflow.com/questions/tagged/typescript) can be used to search for your problem and see if it has been answered already. You can also ask and answer questions.\n"
  },
  {
    "path": "exercises/shared/.docs/tests.md",
    "content": "# Tests\n\nBefore trying to execute the tests, ensure the assignment folder is set-up correctly by following the installation steps, namely `corepack yarn install` and the Editor SDK setup.\n\nExecute the tests with:\n\n```bash\n$ corepack yarn test\n```\n\n## Skipped tests\n\nIn the test suites all tests but the first have been skipped.\n\nOnce you get a test passing, you can enable the next one by changing `xit` to `it`.\nAdditionally tests may be grouped using `xdescribe`.\nEnable the group by changing that to `describe`.\nFinally, some exercises may have optional tests `it.skip`.\nRemove `.skip` to execute the optional test.\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"@exercism/typescript-track\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism TypeScript track top-level runner. Not meant for individual exercises.\",\n  \"author\": \"Katrina Owen\",\n  \"contributors\": [\n    \"Derk-Jan Karrenbeld <derk-jan+git@karrenbeld.info> (https://derk-jan.com)\"\n  ],\n  \"private\": true,\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/exercism/typescript\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"^18.16.0 || >=20.0.0\"\n  },\n  \"devDependencies\": {\n    \"@exercism/babel-preset-typescript\": \"^0.6.0\",\n    \"@exercism/eslint-config-typescript\": \"^0.8.0\",\n    \"@jest/globals\": \"^29.7.0\",\n    \"@tsconfig/node20\": \"^20.1.4\",\n    \"@types/node\": \"~22.7.6\",\n    \"babel-jest\": \"^29.7.0\",\n    \"core-js\": \"~3.38.1\",\n    \"eslint\": \"^9.12.0\",\n    \"expect\": \"^29.7.0\",\n    \"globals\": \"^15.11.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"shelljs\": \"^0.8.5\",\n    \"typescript\": \"~5.6.3\",\n    \"typescript-eslint\": \"^8.10.0\"\n  },\n  \"scripts\": {\n    \"ci\": \"corepack yarn node scripts/ci.mjs\",\n    \"ci:check\": \"corepack yarn node scripts/ci-check.mjs\",\n    \"lint\": \"corepack yarn node scripts/lint.mjs\",\n    \"sync\": \"corepack yarn node scripts/sync.mjs\",\n    \"test\": \"corepack yarn node scripts/test.mjs\",\n    \"format\": \"corepack yarn node scripts/format.mjs\"\n  },\n  \"packageManager\": \"yarn@4.5.1\",\n  \"dependencies\": {\n    \"tstyche\": \"^2.1.1\"\n  }\n}\n"
  },
  {
    "path": "reference/implementing-a-concept-exercise.md",
    "content": "# How to implement a TypeScript Concept Exercise\n\nThis document describes how to implement a Concept Exercise for the TypeScript track.\n\n**Please please please read the docs before starting.** Posting PRs without reading these docs will be a lot more frustrating for you during the review cycle, and exhaust Exercism's maintainers' time. So, before diving into the implementation, please read the following documents:\n\n- [The features of v3][docs-features-of-v3].\n- [Rationale for v3][docs-rationale-for-v3].\n- [What are concept exercise and how they are structured?][docs-concept-exercises]\n\nPlease also watch the following video:\n\n- [The Anatomy of a Concept Exercise][anatomy-of-a-concept-exercise].\n\nAs this document is generic, the following placeholders are used:\n\n- `<slug>`: the name of the exercise in snake_case (e.g. `anonymous-methods`).\n- `<concepts>`: the Concepts the exercise is about (e.g. `loops`),\n- `<concept-1>`: a single Concept slug,\n- `<prerequisite-n>`: a single Concept slug,\n- `<uuid>`: a _new_ v4 UUID (random!)\n- `<first-and-last-name>`: your first and last name (e.g. `John Doe`)\n- `<git-email>`: the email address you use for git (e.g. `johndoe@email.com`)\n\nBefore implementing the exercise, please make sure you have a good understanding of what the exercise should be teaching (and what not). This information can be found in the exercise's GitHub issue. Having done this, please read the [TypeScript Concept exercises introduction][concept-exercises]. If you have come up with something completely new, create a new issue _first_ so we can discuss the Concept Exercise.\n\nTo implement a Concept Exercise, the following files must be added:\n\n<pre>\nlanguages\n└── typescript\n    ├── concepts\n    |   └── &lt;concept-1&gt;\n    |       ├── about.md\n    |       └── links.json\n    └── exercises\n        └── concept\n            └── &lt;slug&gt;\n                ├── .docs\n                |   ├── instructions.md\n                |   ├── introduction.md\n                |   ├── hints.md\n                |   └── source.md (required if there are third-party sources)\n                ├── .meta\n                |   ├── config.json\n                |   ├── design.md\n                |   └── exemplar.ts\n                ├── .eslintignore\n                ├── .gitignore\n                ├── .eslintrc.cjs\n                ├── jest.config.cjs\n                ├── &lt;slug&gt;.ts\n                ├── &lt;slug&gt;.spec.ts\n                └── package.json\n</pre>\n\n## Step 1: Add code files\n\nThe configuration files may be copied from another exercise. We aim to keep these in sync:\n\n- `.eslintignore`\n- `.eslintrc.cjs`\n- `jest.config.cjs`\n- `package.json`\n- `tsconfig.json`\n\nThe `package.json` file must be edited:\n\n```diff\n-  \"name\": \"@exercism/typescript-numbers\",\n+  \"name\": \"@exercism/typescript-<slug>\",\n-  \"description\": \"Exercism Concept Exercise on <concepts>\",\n-  \"author\": \"Jane Doe <janedoe@email.info>\",\n+  \"author\": \"<first-and-last-name> <<git-email>>\"\n   \"version\": \"1.0.0\",\n   \"license\": \"MIT\",\n   \"private\": true,\n   \"repository\": {\n     \"type\": \"git\",\n     \"url\": \"https://github.com/exercism/language-concepts.git\",\n-    \"directory\": \"languages/typescript/exercises/concept/numbers\"\n+    \"directory\": \"languages/typescript/exercises/concept/<slug>\"\n   },\n```\n\nNow create the following three files:\n\n- `<slug>.cs`. the stub implementation file, which is the starting point for students to work on the exercise.\n- `<slug>.test.ts`: the test suite.\n- `.meta/exemplar.ts`: an exemplar implementation that passes all the tests.\n\n## Step 2: Add documentation files\n\nHow to create the files common to all tracks is described in the [how to implement a concept exercise document][how-to-implement-a-concept-exercise].\n\n## Step 3: Add analyzer (optional)\n\nSome exercises could benefit from having an exercise-specific [analyzer][analyzer]. If so, specify what analysis rules should be applied to this exercise and why.\n\n_Skip this step if you're not sure what to do._\n\n## Step 4: Add representation (optional)\n\nSome exercises could benefit from having an custom representation as generated by the [TypeScript representer][representer]. If so, specify what changes to the representation should be applied and why.\n\n_Skip this step if you're not sure what to do._\n\n## Inspiration\n\nWhen implementing an exercise, it can be very useful to look at already implemented TypeScript exercises like the [strings][concept-exercise-strings], [numbers][concept-exercise-numbers] or [promises][concept-exercise-promises] exercises. You can also check the exercise's [general concepts documents][reference] to see if other languages have already implemented an exercise for that Concept.\n\n## Help\n\nIf you have any questions regarding implementing the exercise, please post them as comments in the exercise's GitHub issue.\n\n[analyzer]: https://github.com/exercism/typescript-analyzer\n[representer]: https://github.com/exercism/typescript-representer\n[concept-exercises]: ../exercises/concept/README.md\n[how-to-implement-a-concept-exercise]: https://github.com/exercism/v3/blob/main/docs/maintainers/generic-how-to-implement-a-concept-exercise.md\n[docs-concept-exercises]: https://github.com/exercism/v3/blob/main/docs/concept-exercises.md\n[docs-rationale-for-v3]: https://github.com/exercism/v3/blob/main/docs/rationale-for-v3.md\n[docs-features-of-v3]: https://github.com/exercism/v3/blob/main/docs/features-of-v3.md\n[anatomy-of-a-concept-exercise]: https://www.youtube.com/watch?v=gkbBqd7hPrA\n[concept-exercise-strings]: ../exercises/concept/strings.md\n[concept-exercise-numbers]: ../exercises/concept/numbers.md\n[concept-exercise-promises]: ../exercises/concept/promises.md\n[reference]: https://github.com/exercism/v3/blob/main/reference/README.md\n"
  },
  {
    "path": "scripts/checksum.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * Run this script (from root directory):\n *\n * $ corepack yarn node scripts/checksum.mjs\n *\n * This will check root `package.json` matches each exercise's `package.json`.\n * But the catch is there are some dependencies used for build but not served to end users\n * We skip those dependencies while performing checksum.\n * See `SKIP_PACKAGES_FOR_CHECKSUM` in helpers.js for list of skipped packages.\n */\n\nimport shell from 'shelljs'\nimport * as helpers from './helpers.mjs'\nimport path from 'node:path'\n\n/**\n * Compares the file of the assignment with some known value\n *\n * @param filename file to check (local to the assignment directory)\n * @param assignment slug with type, eg. practice/two-fer\n * @param baseFile the file path that {filename} must be compared against\n * @param expectedSha known value of {baseFile}\n */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nasync function checksumAssignment(assignment, filename, baseFile, expectedSha) {\n  if (!assignment) {\n    return\n  }\n\n  const filePath = path.join('exercises', assignment, filename)\n\n  let fileSha\n\n  if (filename === 'package.json') {\n    const packageJson = helpers.prepareExercisePackageJson(filePath, false)\n\n    fileSha = helpers.shaPackageJson(packageJson)\n  } else {\n    const fileContents = shell.cat(filePath).toString()\n    fileSha = helpers.sha(fileContents)\n  }\n\n  if (fileSha !== expectedSha) {\n    // prettier-ignore\n    shell.echo(\n      `\\n`,\n      `[Failure] ${filename} did not match for ${assignment} (${expectedSha} != ${fileSha})\\n`,\n      `! Expected ${baseFile} to match ${filePath}\\n`,\n      `! Did you forget to run ${`yarn sync`}?\\n`\n    );\n\n    if (filename === 'package.json') {\n      shell.echo(helpers.prepareExercisePackageJson(filePath, false))\n    }\n\n    shell.exit(1)\n  }\n}\n\n/**\n * Check all the exercises, or given, {filename} against {rootFileName}\n *\n * @param filename filename in the exercise directory\n * @param rootFileName filename in the root directory\n */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nasync function checkSumAll(filename, rootFileName = filename) {\n  const assignments = [shell.env['ASSIGNMENT']].filter(Boolean)\n\n  let expectedSha\n\n  if (rootFileName === 'exercise-package.json') {\n    expectedSha = shell.cat('exercise-package.json.sha').toString()\n  } else {\n    const fileContents = shell.cat(rootFileName).toString()\n    expectedSha = helpers.sha(fileContents)\n  }\n\n  if (assignments.length > 0) {\n    if (\n      !assignments.every((assignment) => helpers.assertAssignment(assignment))\n    ) {\n      shell.exit()\n    }\n\n    return await Promise.all(\n      assignments.map((assignment) => {\n        shell.echo(`Checking integrity of ${assignment}/${filename}...`)\n        return checksumAssignment(\n          assignment,\n          filename,\n          rootFileName,\n          expectedSha\n        )\n      })\n    )\n  }\n\n  shell.echo(\n    `Checking integrity of ${filename} in all ${helpers.assignments.length} exercises`\n  )\n\n  await Promise.all(\n    helpers.assignments.map((assignment) =>\n      checksumAssignment(assignment, filename, rootFileName, expectedSha)\n    )\n  )\n}\n\nhelpers.registerExitHandler()\nhelpers.createExercisePackageJson(true)\n\ncheckSumAll('package.json', 'exercise-package.json')\n\nPromise.all(\n  helpers.COMMON_FILES.map((file) => {\n    if (file !== 'package.json') {\n      return checkSumAll(file, path.join('common', file))\n    }\n\n    return null\n  })\n).then(() => shell.echo('All files passed the checksum test'))\n"
  },
  {
    "path": "scripts/ci-check.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * Run this script (from root directory):\n *\n * $ yarn ci:check\n *\n * This will run following checks:\n *\n * 1. Check config in all exercises matches\n * 2. Run eslint to check code-style\n * 3. Run tests against sample solutions\n */\n\nimport shell from 'shelljs'\nimport {\n  assignments,\n  assertAssignment,\n  registerExitHandler,\n  envIsThruthy,\n  hasStub,\n  cleanUp,\n  prepare,\n} from './helpers.mjs'\nimport path from 'node:path'\n\nconst exercises = assignments\nif (exercises.length === 0) {\n  shell.echo('[Skip] None of the files are inside an exercise directory.')\n  shell.exit(0)\n}\n\nif (exercises.length === 1) {\n  if (!assertAssignment(exercises[0], true)) {\n    shell.exit(1)\n  }\n}\n\nregisterExitHandler()\n\nif (!envIsThruthy('SKIP_STUB', false)) {\n  shell.echo('\\n==========\\nEnsure stubs are present\\n')\n\n  // Inline the stub check instead of running scripts/stub-check, to save a\n  // few seconds.\n  const noStubs = exercises.filter((assignment) => !hasStub(assignment))\n\n  if (noStubs.length > 0) {\n    shell.echo(`[FAILURE] ${noStubs.length} missing a stub`)\n    noStubs.forEach((stub) => shell.echo(`${stub} is missing a stub file`))\n    shell.exit(-1)\n  } else {\n    shell.echo('[SUCCES] All stubs are present')\n  }\n}\n\nif (!envIsThruthy('SKIP_INTEGRITY', false)) {\n  shell.echo('\\n==========\\nCheck configuration and packages integrity\\n')\n\n  // If > 8 exercises, checksum everything as its faster than subprocessing\n  // TODO: be able to pass in any amount of exercises at once\n  if (exercises.length >= 8) {\n    const checkResult = shell.exec(\n      `corepack yarn node ${path.join('scripts', 'checksum.mjs')}`\n    ).code\n\n    if (checkResult !== 0) {\n      shell.exit(checkResult)\n    }\n\n    const nameCheckResult = shell.exec(\n      `corepack yarn node ${path.join('scripts', 'name-check.mjs')}`\n    ).code\n\n    if (nameCheckResult !== 0) {\n      shell.exit(nameCheckResult)\n    }\n  } else {\n    exercises.forEach((exercise) => {\n      shell.env['ASSIGNMENT'] = exercise\n\n      const checkResult = shell.exec(\n        `corepack yarn node ${path.join('scripts', 'checksum.mjs')}`\n      ).code\n\n      if (checkResult !== 0) {\n        shell.exit(checkResult)\n      }\n\n      const nameCheckResult = shell.exec(\n        `corepack yarn node ${path.join('scripts', 'name-check.mjs')}`\n      ).code\n\n      if (nameCheckResult !== 0) {\n        shell.exit(nameCheckResult)\n      }\n    })\n  }\n\n  const nameUniqResult = shell.exec(\n    `corepack yarn node ${path.join('scripts', 'name-uniq.mjs')}`\n  ).code\n\n  if (nameUniqResult !== 0) {\n    shell.exit(nameUniqResult)\n  }\n}\n\n// Cleanup tmp directory if any exists\ncleanUp()\n\n/**\n * Moves all example and test files to single directory - tmp_exercises\n * This allows running the test command together for all files\n * which is way faster than running once for each exercise\n */\n\nshell.echo('\\n==========\\nLint all the files\\n')\n\nshell.mkdir('-p', 'tmp_exercises')\nshell.cp(\n  path.join('common', 'tsconfig.json'),\n  path.join('tmp_exercises', 'tsconfig.json')\n)\n\nshell.env['PREPARE'] = false\nshell.env['CLEANUP'] = false\n\nexercises.forEach(prepare)\n\nshell.env['CLEANUP'] = true\n\nconst checkResult = shell.exec(`corepack yarn lint`).code\nif (checkResult !== 0) {\n  shell.exit(checkResult)\n}\n"
  },
  {
    "path": "scripts/ci.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * Run this script (from root directory):\n *\n * $ corepack yarn ci\n *\n * This will run following checks:\n *\n * 1. Find the exercises\n * 2. Run tests against sample solutions\n */\n\nimport shell from 'shelljs'\nimport {\n  prepareAndRun,\n  prepare,\n  cleanUp,\n  registerExitHandler,\n  assignments,\n} from './helpers.mjs'\n\nconst exercises = assignments\n\nif (exercises.length === 0) {\n  shell.echo('[Skip] None of the files are inside an exercise directory.')\n  shell.exit(0)\n}\n\nregisterExitHandler()\n\nshell.env['PREPARE'] = false\nshell.env['CLEANUP'] = false\n\nconst infoStr = `Running tests for ${\n  exercises.length === 1 ? exercises[0] : `${exercises.length} exercises\\n`\n}`\nconst failureStr = '[Failure] Tests failed!'\n\n// Prepare exercises\nexercises.forEach(prepare)\n\n// Run tests\nprepareAndRun('corepack yarn jest --bail tmp_exercises', infoStr, failureStr)\n\nshell.echo(\n  exercises.length === 1\n    ? `[Success] Tests passed for ${exercises[0]}`\n    : `[Success] Tests passed for all ${exercises.length} exercises`\n)\n\n// Cleanup\ncleanUp()\n"
  },
  {
    "path": "scripts/format.mjs",
    "content": "#!/usr/bin/env node\n\n/*\n * Run this script (from root directory):\n *\n * $ corepack yarn format\n *\n * This runs `prettier` on all applicable files, FORCES using the same version\n * as the CI uses to check if the files have been formatted.\n */\n\nimport shell from 'shelljs'\nimport path, { join, sep } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { mkdtempSync } from 'node:fs'\nimport { tmpdir } from 'node:os'\n\nconst basedir = path.resolve(\n  path.basename(fileURLToPath(import.meta.url)),\n  '..'\n)\n\nconst workflow = path.join(\n  basedir,\n  '.github',\n  'workflows',\n  'verify-code-formatting.yml'\n)\n\nlet EXERCISM_PRETTIER_VERSION\n\nconst versionLine = shell\n  .cat(workflow)\n  .stdout.split('\\n')\n  .map((line) => line.trim())\n  .find((line) => line.startsWith('EXERCISM_PRETTIER_VERSION:'))\n\nif (!versionLine) {\n  const tempDir = mkdtempSync(`${tmpdir()}${sep}`)\n  const versionInfo = join(tempDir, 'info.txt')\n  shell.touch(versionInfo)\n\n  shell\n    .exec('corepack yarn info prettier --json --name-only', { silent: true })\n    .to(versionInfo)\n  shell.sed(/^\"prettier@npm:/, '', versionInfo).to(versionInfo)\n  shell.sed(/\"$/, '', versionInfo).to(versionInfo)\n\n  const versionFromPackage = shell.cat(versionInfo)\n  shell.rm('-fr', tempDir)\n\n  if (versionFromPackage && !versionFromPackage.includes('Usage Error')) {\n    EXERCISM_PRETTIER_VERSION = versionFromPackage.trim()\n  } else {\n    EXERCISM_PRETTIER_VERSION = process.env.EXERCISM_PRETTIER_VERSION\n    if (!EXERCISM_PRETTIER_VERSION) {\n      shell.error(\n        'Could not find prettier version in corepack yarn info or ENV'\n      )\n      shell.exit(-1)\n    }\n  }\n} else {\n  EXERCISM_PRETTIER_VERSION = versionLine.split(':')[1].trim().replace(/'/g, '')\n}\n\nconst command = `corepack yarn dlx prettier@${EXERCISM_PRETTIER_VERSION} --write \"**/*.{js,jsx,ts,tsx,css,sass,scss,html,json,md,yml}\"`\nshell.echo(`[format] ${command}`)\n\n// Will print to console\nshell.exec(command, { silent: false })\n"
  },
  {
    "path": "scripts/helpers.mjs",
    "content": "/* eslint-disable @typescript-eslint/explicit-function-return-type */\n\n/**\n * This file provides helper functions\n * & is NOT intended to be run as a script.\n */\n\nimport shell from 'shelljs'\nimport crypto from 'node:crypto'\nimport path from 'node:path'\n\nconst exerciseDirs = shell.ls(\n  '-d',\n  path.join('exercises', '{practice,concept}', '*')\n)\n\nexport const packageFiles = exerciseDirs.map((dir) => `${dir}/package.json`)\n\nexport const COMMON_DIRS = ['.yarn', '.vscode']\nexport const COMMON_DIR_COPY_CONTENTS = [\n  // '.yarn/releases',\n  // '.yarn/sdks',\n  // '.vscode',\n]\nexport const COMMON_FILES = [\n  '.vscode/extensions.json',\n  '.vscode/settings.json',\n  '.yarnrc.yml',\n  'babel.config.cjs',\n  'eslint.config.mjs',\n  'jest.config.cjs',\n  'package.json',\n  'test-runner.mjs',\n  'tsconfig.json',\n]\n\nexport const assignments = shell.env['ASSIGNMENT']\n  ? [shell.env['ASSIGNMENT']]\n  : knownAssignments()\n\nfunction knownAssignments() {\n  return exerciseDirs.map((directory) =>\n    path.join(path.basename(path.dirname(directory)), path.basename(directory))\n  )\n}\n\nexport function assertAssignment(assignment, shouldExist = true) {\n  assignment = assignment.replace(/[/\\\\]/g, path.sep)\n\n  if (assignment.split(path.sep).length === 2) {\n    if (!shouldExist) {\n      return true\n    }\n\n    if (shell.test(`-d`, path.join('exercises', assignment))) {\n      return true\n    }\n  }\n\n  shell.echo(`[Failure] \"${assignment}\" is not a valid assignment reference`)\n\n  if (assignment.split(path.sep).length === 1) {\n    // prettier-ignore\n    shell.echo(`\nExpected ${`{type}${path.sep}{slug}`}, actual: ${assignment}.\n- Use ${`concept${path.sep}${assignment}`} if ${assignment} is a concept exercise.\n- Use ${`practice${path.sep}${assignment}`} if ${assignment} is a practice exercise.\n  `.trim());\n  }\n\n  const suggestions = knownAssignments().filter((known) =>\n    known.includes(assignment)\n  )\n\n  if (suggestions.length > 0 && suggestions.length < 5) {\n    shell.echo(\n      '\\nDid you mean:\\n' +\n        suggestions.map((suggestion) => `- ${suggestion}`).join('\\n')\n    )\n  }\n\n  return false\n}\n\nexport function sha(str) {\n  return crypto.createHash('md5').update(str).digest('hex')\n}\n\n/**\n *\n * @param {string} input\n * @returns {string | undefined}\n */\nexport function findExerciseDirectory(input) {\n  // Normalize paths for shell.js\n  input = input.replace(/\\\\/g, '/')\n\n  // Remove .meta directory from path\n  if (input.includes('/.meta')) {\n    input = input.split('/.meta').shift()\n  }\n\n  const directory = exerciseDirs.find((exerciseDir) => {\n    return input.indexOf(exerciseDir) !== -1\n  })\n\n  if (!directory) {\n    return null\n  }\n\n  return path.join(\n    path.basename(path.dirname(directory)),\n    path.basename(directory)\n  )\n}\n\nexport function fileConfiguration(assignment) {\n  const pathToConfig = path.join(\n    'exercises',\n    assignment,\n    '.meta',\n    'config.json'\n  )\n\n  let files = undefined\n\n  if (shell.test('-f', pathToConfig)) {\n    const configuration = JSON.parse(shell.cat(pathToConfig).toString())\n    if (configuration.files && configuration.files.test.length > 0) {\n      files = configuration.files\n    }\n  }\n\n  files = files || JSON.parse(shell.cat('config.json').toString()).files\n\n  Object.keys(files).forEach((key) => {\n    files[key] = files[key].map((value) =>\n      value\n        .replace('%{kebab_slug}', path.basename(assignment))\n        .replace(/[/\\\\]/g, path.sep)\n    )\n  })\n\n  return files\n}\n\n/**\n *\n * @param {string} assignment\n * @returns {boolean}\n */\nexport function hasStub(assignment) {\n  const stubFiles = fileConfiguration(assignment).solution\n\n  return stubFiles.every((stubFile) =>\n    shell.test('-f', path.join('exercises', assignment, stubFile))\n  )\n}\n\n/**\n *\n * @param {string} key\n * @param {true|false} unset\n * @returns {boolean}\n */\nexport function envIsThruthy(key, unset = false) {\n  if (shell.env[key] === undefined) {\n    return unset\n  }\n\n  return !['0', 0, 'false', false, null, 'null'].includes(shell.env[key])\n}\n\n/**\n * @returns {boolean}\n */\nexport function shouldPrepare() {\n  return envIsThruthy('PREPARE')\n}\n\n/**\n * @returns {boolean}\n */\nexport function shouldCleanup() {\n  return envIsThruthy('CLEANUP')\n}\n\n/**\n * Preapre all exercises (see above) & run a given command\n *\n * @param {string} command\n * @param {string} infoStr\n * @param {string} failureStr\n *\n * @returns {void}\n */\nexport function prepareAndRun(command, infoStr, failureStr) {\n  if (shouldPrepare()) {\n    const assignment = shell.env['ASSIGNMENT']\n\n    shell.mkdir('-p', 'tmp_exercises')\n\n    COMMON_FILES.forEach((file) => {\n      const source = path.join('common', file)\n      const destination = path.join('tmp_exercises', file)\n\n      shell.mkdir('-p', path.dirname(destination))\n      shell.cp(source, destination)\n    })\n\n    if (assignment) {\n      prepare(assignment)\n    } else {\n      assignments.forEach(prepare)\n    }\n  }\n\n  if (infoStr) {\n    shell.echo(infoStr)\n  }\n  const result = shell.exec(command)\n\n  if (shouldCleanup()) {\n    cleanUp()\n  }\n\n  if (result.code !== 0) {\n    if (failureStr) {\n      shell.echo(failureStr)\n    }\n    shell.exit(1)\n  }\n}\n\n/**\n * Delete tmp directory\n *\n * @returns {void}\n */\nexport function cleanUp() {\n  shell.rm('-rf', 'tmp_exercises')\n  shell.rm('-f', 'exercise-package.json')\n  shell.rm('-f', 'exercise-package.json.sha')\n}\n\n// These packages will be skipped while performing checksum. In other words,\n// these packages are only interesting for maintaining this repository and not\n// for the student.\nconst SKIP_PACKAGES_FOR_CHECKSUM = ['shelljs']\n\n// These fields may differ between package.json files.\nconst SKIP_FIELDS_FOR_CHECKSUM = [\n  'name',\n  'description',\n  'author',\n  'contributors',\n]\n\nexport function createExercisePackageJson(writeSha = false) {\n  const packageFile = shell.cat(path.join('common', 'package.json')).toString()\n  const packageJson = JSON.parse(packageFile)\n\n  // Filter out some unwanted packages and create package.json for exercises\n  SKIP_PACKAGES_FOR_CHECKSUM.forEach(\n    (pkg) => delete packageJson['devDependencies'][pkg]\n  )\n\n  const shellStr = new shell.ShellString(\n    JSON.stringify(packageJson, undefined, 2) + '\\n'\n  )\n\n  shellStr.to('exercise-package.json')\n\n  // Now remove all fields that should not be considered for checksum\n  SKIP_FIELDS_FOR_CHECKSUM.forEach((field) => {\n    delete packageJson[field]\n  })\n\n  delete packageJson['repository']['directory']\n\n  if (writeSha) {\n    const checksumShellStr = new shell.ShellString(shaPackageJson(packageJson))\n    checksumShellStr.to('exercise-package.json.sha')\n  }\n}\n\nexport function mergePackageJsons(basePackageJson, packageJson) {\n  const mergedPackageJson = JSON.parse(JSON.stringify(basePackageJson))\n\n  SKIP_FIELDS_FOR_CHECKSUM.forEach((key) => {\n    mergedPackageJson[key] = packageJson[key]\n  })\n\n  const extraRepositoryKeys = Object.keys(packageJson.repository || {}).filter(\n    (key) => !basePackageJson.repository[key]\n  )\n\n  extraRepositoryKeys.forEach((key) => {\n    mergedPackageJson.repository[key] = packageJson.repository[key]\n  })\n\n  return mergedPackageJson\n}\n\nexport function prepareExercisePackageJson(destinationPath, writeSha = false) {\n  const packageFile = shell.cat(destinationPath).toString()\n  const packageJson = JSON.parse(packageFile)\n\n  // Now remove all fields that should not be considered for checksum\n  SKIP_FIELDS_FOR_CHECKSUM.forEach((field) => {\n    delete packageJson[field]\n  })\n\n  delete packageJson['repository']['directory']\n\n  if (writeSha) {\n    const checksumShellStr = new shell.ShellString(shaPackageJson(packageJson))\n    checksumShellStr.to(`${destinationPath}.sha`)\n  }\n\n  return packageJson\n}\n\nexport function shaPackageJson(packageJson) {\n  return sha(JSON.stringify(packageJson, undefined, 2).trim() + '\\n')\n}\n\n/**\n * Copy sample solution and specs for given assignment to tmp_exercises\n *\n * @param {string} assignment\n * @returns {void}\n */\n\n/**\n * Copy sample solution and specs for given assignment to tmp_exercises\n */\nexport function prepare(assignment) {\n  if (!assignment) {\n    shell.echo('[Failure] Assignment not provided')\n    shell.exit(1)\n  }\n\n  if (!assertAssignment(assignment, true)) {\n    shell.exit(1)\n  }\n\n  const files = fileConfiguration(assignment)\n  const [type] = assignment.split(/[/\\\\]/g)\n\n  const exampleFiles = type === 'concept' ? files.exemplar : files.example\n\n  files.test.forEach((specFileName) => {\n    const specFile = path.join('exercises', assignment, specFileName)\n    const specFileDestination = path.join('tmp_exercises', specFileName)\n\n    shell.mkdir('-p', path.dirname(specFileDestination))\n    shell.cp(specFile, specFileDestination)\n\n    // Enable tests\n    //\n    // This purposefully does not replace describe.skip or it.skip, so we can\n    // have test cases that are _always_ skipped, including CI. Use case?\n    // - platform dependent tests\n    // - test cases that don't yet work with our solution\n    //\n    shell\n      .sed(/x(test|it)\\(/, 'it(', specFileDestination)\n      .to(specFileDestination)\n    shell\n      .sed(/xdescribe\\(/, 'describe(', specFileDestination)\n      .to(specFileDestination)\n    shell\n      .sed(/x(test|it|describe), ?/, '', specFileDestination)\n      .to(specFileDestination)\n    shell\n      .sed(/, ?x(test|it|describe) ?}/, '}', specFileDestination)\n      .to(specFileDestination)\n  })\n\n  shell.mkdir('-p', path.join('tmp_exercises', 'lib'))\n\n  exampleFiles.forEach((exampleFileName, i) => {\n    const exampleFile = path.join('exercises', assignment, exampleFileName)\n    const exampleFileDestination = path.join('tmp_exercises', files.solution[i])\n\n    shell.sed(\"from '../\", \"from './\", exampleFile).to(exampleFileDestination)\n  })\n\n  if (files.solution.length > exampleFiles.length) {\n    files.solution.slice(exampleFiles.length).forEach((extraLibFileName) => {\n      const solutionFile = path.join('exercises', assignment, extraLibFileName)\n      const solutionFileDestination = path.join(\n        'tmp_exercises',\n        extraLibFileName\n      )\n\n      shell.cp(solutionFile, solutionFileDestination)\n    })\n  }\n\n  const libDir = path.join('exercises', assignment, 'lib')\n  if (shell.test('-d', libDir)) {\n    shell.cp(path.join(libDir, '*.ts'), path.join('tmp_exercises', 'lib'))\n  }\n\n  shell.mkdir('-p', path.join('tmp_exercises', 'data'))\n  const dataDir = path.join('exercises', assignment, 'data')\n\n  if (shell.test('-d', dataDir)) {\n    shell.cp(path.join(dataDir, '*'), path.join('tmp_exercises', 'data'))\n  }\n}\n\n/**\n * @returns {void}\n */\nexport function registerExitHandler() {\n  function exitHandler(options, exitCode) {\n    if (shouldCleanup() || options.cleanUp) {\n      cleanUp()\n    }\n\n    if (options.error) {\n      console.error(options.error)\n    }\n\n    if (exitCode || exitCode === 0) {\n      /* exit code given */\n    }\n    if (options.exit) {\n      /* should exit forcefully */\n      process.exit()\n    }\n  }\n\n  //do something when app is closing\n  process.on('exit', exitHandler.bind(null, { cleanup: true }))\n\n  //catches ctrl+c event\n  process.on('SIGINT', exitHandler.bind(null, { exit: true }))\n\n  // catches \"kill pid\" (for example: nodemon restart)\n  process.on('SIGUSR1', exitHandler.bind(null, { exit: true }))\n  process.on('SIGUSR2', exitHandler.bind(null, { exit: true }))\n\n  //catches uncaught exceptions\n  process.on('uncaughtException', (error) => exitHandler({ exit: true, error }))\n}\n"
  },
  {
    "path": "scripts/lint.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * Run this script (from root directory):\n *\n * $ corepack yarn lint\n *\n * This runs `eslint` on all sample solutions (and test) files\n */\n\nimport shell from 'shelljs'\nimport path from 'node:path'\nimport {\n  registerExitHandler,\n  prepareAndRun,\n  assignments as exercises,\n  shouldPrepare,\n} from './helpers.mjs'\n\nregisterExitHandler()\n\nconst assignment = exercises.length === 0 ? exercises[0] : undefined\n\n// Prepare exercises and cleanup afterwards\nshell.env['PREPARE'] =\n  shell.env['PREPARE'] === undefined || shell.env['PREPARE']\nshell.env['CLEANUP'] =\n  shell.env['CLEANUP'] === undefined || shell.env['CLEANUP']\n\nconst count = shouldPrepare() ? exercises.length : 'all'\n\nconst infoStr = assignment\n  ? `Running lint for ${assignment}...`\n  : `Running lint for ${count} exercises...`\nconst failureStr = '[Failure] Lint check failed!'\n\nshell.mkdir('-p', 'tmp_exercises')\nshell.cp('eslint.config.mjs', path.join('tmp_exercises', 'eslint.config.mjs'))\n\n// Run lint all at once\nprepareAndRun(\n  'corepack yarn eslint tmp_exercises -c tmp_exercises/eslint.config.mjs',\n  infoStr,\n  failureStr\n)\n\nshell.echo(\n  assignment\n    ? `[Success] Lint passed for ${assignment}`\n    : `[Success] Lint passed for ${count} exercises`\n)\n"
  },
  {
    "path": "scripts/name-check.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * Run this script (from root directory):\n *\n * $ corepack yarn node scripts/name-check.mjs\n *\n * This will run following checks:\n *\n * 1. Package name is of the format \"@exercism/typescript-<exercise>\"\n *\n * This script also allows fixing these names:\n *\n * $ corepack yarn node scripts/name-check.mjs --fix\n */\n\nimport shell from 'shelljs'\nimport path from 'node:path'\nimport { packageFiles, registerExitHandler } from './helpers.mjs'\n\nregisterExitHandler()\n\nlet exitCode = 0\n\n// First 2 arguments are node and script name skip them\n// Check if rest has --fix\nconst fix = process.argv.slice(2).includes('--fix')\n\nif (fix) {\n  shell.echo('==============================================')\n  shell.echo('Fixing package names where necessary')\n  shell.echo('----------------------------------------------')\n}\n\nconst envAssignment = shell.env['ASSIGNMENT']\nconst finalPackageFiles = envAssignment\n  ? [path.join('exercises', envAssignment, 'package.json')]\n  : packageFiles\n\n// Check if package name in each exercises' package.json is of the format \"@exercism/javascript-<exercise>\"\nfinalPackageFiles.forEach((filePath) => {\n  const file = JSON.parse(shell.cat(filePath).toString())\n\n  const givenName = file['name']\n  const exerciseName = filePath.split(/[/\\\\]/g)[2]\n  const expectedName = `@exercism/typescript-${exerciseName}`\n\n  if (givenName === expectedName) {\n    shell.echo(`[Success]: Package name ${givenName} is in correct format`)\n    return\n  }\n\n  if (fix) {\n    file['name'] = expectedName\n    const fileWithFixedName = new shell.ShellString(\n      JSON.stringify(file, undefined, 2) + '\\n'\n    )\n    fileWithFixedName.to(filePath)\n    shell.echo(`[Success]: Fixed package name in ${filePath}`)\n  } else {\n    exitCode = 1\n    shell.echo(\n      `[Failure]: Package name in ${filePath} must be ${expectedName}\"`\n    )\n  }\n})\n\nshell.exit(exitCode)\n"
  },
  {
    "path": "scripts/name-uniq.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * Run this script (from root directory):\n *\n * $ corepack yarn node scripts/name-uniq.mjs\n *\n * This will run following checks:\n *\n * 1. All exercises have unique package names in their package.json files.\n */\n\nimport shell from 'shelljs'\nimport { packageFiles, registerExitHandler } from './helpers.mjs'\n\nregisterExitHandler()\n\nlet exitCode = 0\nconst allNames = packageFiles.map(\n  (filePath) => JSON.parse(shell.cat(filePath).toString())['name']\n)\n\n// Check if all exercises have unique package names\nconst duplicates = allNames.filter((e, i) => allNames.indexOf(e) !== i)\nif (duplicates.length !== 0) {\n  exitCode = 1\n  shell.echo(\n    `[Failure] Duplicate package names found: ${duplicates.join(', ')}`\n  )\n}\n\nif (exitCode === 0) {\n  shell.echo('[Success] All package names are unique.')\n}\n"
  },
  {
    "path": "scripts/pr-check.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * Run this script (from root directory):\n *\n * $ corepack yarn node scripts/pr-check.mjs path/1 path/2 path/3\n *\n * This will run following checks:\n * 1. Find the exercises at all the paths provided\n * 2. Check stub existance for those exercises\n * 3. Check integrity of configuration for those exercises\n * 4. Run eslint for those exercises to check code-style\n */\n\nimport shell from 'shelljs'\nimport path from 'node:path'\nimport {\n  findExerciseDirectory,\n  prepare,\n  cleanUp,\n  registerExitHandler,\n  envIsThruthy,\n  hasStub,\n  assignments,\n} from './helpers.mjs'\n\nconst files = process.argv.slice(2)\n\nif (files.length === 0) {\n  shell.echo(\n    '[Failure] No files passed in. Pass in paths to exercise directories or its file.'\n  )\n  shell.exit(-1)\n}\n\nshell.echo('[Files] The files passed in are as follows:')\nfiles.forEach((file) => {\n  shell.echo(`[Files] ${file}`)\n})\n\nconst _exercises = files\n  .map(findExerciseDirectory)\n  .filter(Boolean)\n  .filter((exercise, index, array) => array.indexOf(exercise) === index)\n\nconst hasRootFile = files.some((file) => file === 'package.json')\nconst hasCommonFile = files.some((file) => file.startsWith('common'))\n\nif (hasRootFile) {\n  shell.echo(\n    '[Root PR] When package.json is changed, all exercises need to be checked'\n  )\n} else if (hasCommonFile) {\n  shell.echo(\n    '[Common PR] When a file in common/ is changed, all exercises need to be checked'\n  )\n} else if (_exercises.length > 8) {\n  shell.echo(\n    '[Big PR] When more than 8 exercises are being checked, all of them are ' +\n      'checked as this is likely a PR affecting everything.'\n  )\n}\n\nconst exercises =\n  hasRootFile || hasCommonFile || _exercises.length > 8\n    ? assignments\n    : _exercises\n\nif (exercises.length === 0) {\n  shell.echo('[Skip] None of the files are inside an exercise directory.')\n  shell.exit(0)\n}\n\nregisterExitHandler()\n\nif (!envIsThruthy('SKIP_STUB', false)) {\n  shell.echo('\\n==========\\nEnsure stubs are present\\n')\n\n  // Inline the stub check instead of running scripts/stub-check, to save a\n  // few seconds.\n  const noStubs = exercises.filter((assignment) => !hasStub(assignment))\n\n  if (noStubs.length > 0) {\n    shell.echo(`[FAILURE] ${noStubs.length} missing a stub`)\n    noStubs.forEach((stub) => shell.echo(`${stub} is missing a stub file`))\n    shell.exit(-1)\n  } else {\n    shell.echo('[SUCCES] All stubs are present')\n  }\n}\n\nif (!envIsThruthy('SKIP_INTEGRITY', false)) {\n  shell.echo('\\n==========\\nCheck configuration and packages integrity\\n')\n\n  // If > 8 exercises, checksum everything as its faster than subprocessing\n  // TODO: be able to pass in any amount of exercises at once\n  if (exercises.length >= 8) {\n    const checkResult = shell.exec(\n      `corepack yarn node ${path.join('scripts', 'checksum.mjs')}`\n    ).code\n\n    if (checkResult !== 0) {\n      shell.exit(checkResult)\n    }\n\n    const nameCheckResult = shell.exec(\n      `corepack yarn node ${path.join('scripts', 'name-check.mjs')}`\n    ).code\n\n    if (nameCheckResult !== 0) {\n      shell.exit(nameCheckResult)\n    }\n  } else {\n    exercises.forEach((exercise) => {\n      shell.env['ASSIGNMENT'] = exercise\n\n      const checkResult = shell.exec(\n        `corepack yarn node ${path.join('scripts', 'checksum.mjs')}`\n      ).code\n      if (checkResult !== 0) {\n        shell.exit(checkResult)\n      }\n\n      const nameCheckResult = shell.exec(\n        `corepack yarn node ${path.join('scripts', 'name-check.mjs')}`\n      ).code\n\n      if (nameCheckResult !== 0) {\n        shell.exit(nameCheckResult)\n      }\n    })\n  }\n\n  const nameUniqResult = shell.exec(\n    `corepack yarn node ${path.join('scripts', 'name-uniq.mjs')}`\n  ).code\n\n  if (nameUniqResult !== 0) {\n    shell.exit(nameUniqResult)\n  }\n}\n\n// Cleanup tmp directory if any exists\ncleanUp()\n\n/**\n * Moves all example and test files to single directory - tmp_exercises\n * This allows running the test command together for all files\n * which is way faster than running once for each exercise\n */\n\nshell.echo('\\n==========\\nLint all the files\\n')\n\nshell.mkdir('-p', 'tmp_exercises')\nshell.cp(\n  path.join('common', 'tsconfig.json'),\n  path.join('tmp_exercises', 'tsconfig.json')\n)\n\nshell.env['PREPARE'] = false\nshell.env['CLEANUP'] = false\ndelete shell.env['ASSIGNMENT']\n\nexercises.forEach(prepare)\n\nshell.env['CLEANUP'] = true\n\nconst checkResult = shell.exec(`corepack yarn lint`).code\nif (checkResult !== 0) {\n  shell.exit(checkResult)\n}\n"
  },
  {
    "path": "scripts/pr.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * Run this script (from root directory):\n *\n * $ corepack yarn node scripts/pr.mjs path/1 path/2 path/3\n *\n * This will run following checks:\n *\n * 1. Find the exercises at all the paths provided\n * 2. Run tests for those exercises against sample solutions\n */\n\nimport shell from 'shelljs'\nimport {\n  findExerciseDirectory,\n  prepareAndRun,\n  prepare,\n  cleanUp,\n  registerExitHandler,\n  assignments,\n} from './helpers.mjs'\n\nconst files = process.argv.slice(2)\n\nif (files.length === 0) {\n  shell.echo(\n    '[Failure] No files passed in. Pass in paths to exercise directories or its file.'\n  )\n  shell.exit(-1)\n}\n\nconst _exercises = files\n  .map(findExerciseDirectory)\n  .filter(Boolean)\n  .filter((exercise, index, array) => array.indexOf(exercise) === index)\n\nconst hasRootFile = files.some((file) => file === 'package.json')\nconst hasCommonFile = files.some((file) => file.startsWith('common'))\n\nif (hasRootFile) {\n  shell.echo(\n    '[Root PR] When package.json is changed, all exercises need to be checked'\n  )\n} else if (hasCommonFile) {\n  shell.echo(\n    '[Common PR] When a file in common/ is changed, all exercises need to be checked'\n  )\n} else if (_exercises.length > 8) {\n  shell.echo(\n    '[Big PR] When more than 8 exercises are being checked, all of them are ' +\n      'checked as this is likely a PR affecting everything.'\n  )\n}\n\nconst exercises =\n  hasRootFile || hasCommonFile || _exercises.length > 8\n    ? assignments\n    : _exercises\n\nif (exercises.length === 0) {\n  shell.echo('[Skip] None of the files are inside an exercise directory.')\n  shell.exit(0)\n}\n\nregisterExitHandler()\n\nshell.env['PREPARE'] = false\nshell.env['CLEANUP'] = false\n\nconst infoStr = `Running tests for ${\n  exercises.length === 1 ? exercises[0] : `${exercises.length} exercises\\n`\n}`\nconst failureStr = '[Failure] Tests failed!'\n\n// Prepare exercises\nexercises.forEach(prepare)\n\n// Run tests\nprepareAndRun('corepack yarn jest --bail tmp_exercises', infoStr, failureStr)\n\nshell.echo(\n  exercises.length === 1\n    ? `[Success] Tests passed for ${exercises[0]}`\n    : `[Success] Tests passed for all ${exercises.length} exercises`\n)\n\n// Cleanup\ncleanUp()\n"
  },
  {
    "path": "scripts/stub-check.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * Run this script (from root directory):\n *\n * $ corepack yarn node scripts/stub-check.mjs\n *\n * This script checks that all exercises have a stub file.\n * Ref: https://github.com/exercism/javascript/issues/705\n */\n\nimport shell from 'shelljs'\nimport * as helpers from './helpers.mjs'\n\nconst noStubs = helpers.assignments.filter(\n  (assignment) => !helpers.hasStub(assignment)\n)\n\nif (noStubs.length > 0) {\n  shell.echo('[Error]: No stub files found for following exercises:')\n  shell.echo(noStubs.join('\\n'))\n  shell.exit(1)\n}\n\nif (shell.env['ASSIGNMENT']) {\n  shell.echo(`[Success]: Stub file present for ${shell.env['ASSIGNMENT']}`)\n} else {\n  shell.echo('[Success]: Stub files present for all exercises!')\n}\n"
  },
  {
    "path": "scripts/sync.mjs",
    "content": "#!/usr/bin/env node\n\n// @ts-check\n\n/**\n * Run this script (from root directory):\n *\n * $ corepack yarn sync\n *\n * This script is used to copy the following files to all exercises and keep\n * them in sync:\n *\n * - .vscode/extensions.json\n * - .vscode/settings.json\n * - .yarnrc.yml\n * - babel.config.cjs\n * - eslint.config.mjs\n * - jest.config.cjs\n * - package.json\n * - tsconfig.json\n *\n * There is a CI step which checks that package.json in root & exercises match\n * (see checksum script for more info).\n */\n\nimport shell from 'shelljs'\nimport * as helpers from './helpers.mjs'\nimport path from 'node:path'\n\nconst assignment = shell.env['ASSIGNMENT']\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nfunction copyConfigForAssignment(name) {\n  const destination = path.join('exercises', name)\n  const assignmentPackageFilename = path.join(destination, 'package.json')\n\n  // First delete any common directories (they'll be recreated when copying files)\n  helpers.COMMON_DIRS.forEach((dir) => {\n    const copy = path.join(destination, dir)\n\n    shell.rm('-rf', copy)\n    shell.mkdir('-p', copy)\n  })\n\n  // DELETE legacy\n  ;['.eslintignore', '.eslintrc.cjs', '.meta/test-runner.mjs'].forEach(\n    (file) => {\n      const source = path.join(destination, file)\n      shell.rm('-f', source)\n    }\n  )\n\n  // Next copy over all the common files\n  helpers.COMMON_FILES.forEach((file) => {\n    if (file !== 'package.json') {\n      const source = path.join('common', file)\n      const copy = path.join(destination, file)\n\n      shell.mkdir('-p', path.dirname(copy))\n      shell.cp(source, copy)\n    }\n  })\n\n  // Copy the common dir matching contents\n  helpers.COMMON_DIR_COPY_CONTENTS.forEach((dir) => {\n    const source = path.join('common', dir)\n    const copy = path.join(destination, path.dirname(dir))\n\n    shell.cp('-R', source, copy)\n  })\n\n  // Touch an empty `yarn.lock` file so you can install yarn in each folder.\n  shell.rm(path.join(destination, 'yarn.lock'))\n  shell.touch(path.join(destination, 'yarn.lock'))\n\n  // Now edit package.json and copy it over\n  const packageJson = getCurrentPackageJson(assignmentPackageFilename)\n  const basePackageJson = JSON.parse(\n    shell.cat('exercise-package.json').toString()\n  )\n\n  const mergedPackageJson = helpers.mergePackageJsons(\n    basePackageJson,\n    packageJson\n  )\n\n  shell\n    .ShellString(JSON.stringify(mergedPackageJson, undefined, 2) + '\\n')\n    .to(assignmentPackageFilename)\n}\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nfunction getCurrentPackageJson(assignmentPackageFilename) {\n  const packageFile = shell.cat(assignmentPackageFilename).toString()\n  if (!packageFile) {\n    const packageJson = JSON.parse(\n      shell.cat('exercise-package.json').toString()\n    )\n\n    const conceptName = path\n      .dirname(assignmentPackageFilename)\n      .split(/[/\\\\]/g)\n      .slice(1)\n\n    packageJson.name = `@exercism/typescript-${conceptName.join('-')}`\n    packageJson.description = `Exercism ${conceptName[0]} exercise on ${conceptName[1]}`\n    return packageJson\n  }\n\n  return JSON.parse(packageFile)\n}\n\nhelpers.registerExitHandler()\nhelpers.createExercisePackageJson(false)\n\nif (assignment) {\n  if (!helpers.assertAssignment(assignment)) {\n    shell.exit(1)\n  }\n\n  shell.echo('Syncing ' + assignment + '...')\n  copyConfigForAssignment(assignment)\n} else {\n  shell.echo('Syncing all assignments...')\n\n  helpers.assignments.forEach((a) => {\n    shell.echo('Syncing ' + a + '...')\n    copyConfigForAssignment(a)\n  })\n}\n"
  },
  {
    "path": "scripts/test.mjs",
    "content": "#!/usr/bin/env node\n\n/**\n * Run this script (from root directory):\n *\n * $ corepack yarn test\n *\n * This runs `jest` tests for all sample solutions\n */\n\nimport shell from 'shelljs'\nimport * as helpers from './helpers.mjs'\n\nconst assignment = shell.env['ASSIGNMENT']\n\nconst infoStr = assignment\n  ? '\\nRunning tests for ' + assignment + '...'\n  : '\\nRunning tests for all exercises...'\nconst failureStr = '[Failure] Tests failed!'\n\n// Copies the necessary files\nshell.env['PREPARE'] = true\n\n// Cleans up after\nshell.env['CLEANUP'] = true\n\nhelpers.prepareAndRun(\n  'corepack yarn tstyche tmp_exercises --failFast && corepack yarn jest --bail tmp_exercises',\n  infoStr,\n  failureStr\n)\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"extends\": \"@tsconfig/node20/tsconfig.json\",\n  \"include\": [\"src\", \"exercises\"],\n  \"exclude\": [\"test\", \"node_modules\"]\n}\n"
  },
  {
    "path": "yarn-error.log",
    "content": "Arguments: \n  C:\\Program Files\\nodejs\\node.exe C:\\Program Files (x86)\\Yarn\\bin\\yarn.js add @babel/cli @babel/chore @babel/node @babel/plugin-syntax-bigint @babel/preset-env @types/jest @types/node babel-eslint babel-jest jest shelljs -D\n\nPATH: \n  C:\\Program Files\\Git\\mingw64\\bin;C:\\Program Files\\Git\\usr\\bin;C:\\Users\\Derk-Jan\\bin;C:\\Users\\Derk-Jan\\AppData\\Local\\Google\\Chrome SxS\\Application;C:\\Python38\\Scripts;C:\\Python38;C:\\Program Files\\ImageMagick-6.9.7-Q16-HDRI;C:\\Program Files (x86)\\GnuWin32\\bin;C:\\ProgramData\\Oracle\\Java\\javapath;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0;C:\\Program Files (x86)\\NVIDIA Corporation\\PhysX\\Common;C:\\Program Files\\Git\\cmd;C:\\Program Files\\Amazon\\AWSCLI;C:\\Users\\Derk-Jan\\AppData\\Roaming\\npm;C:\\Program Files\\PuTTY;C:\\Users\\Derk-Jan\\AppData\\Roaming\\Python\\Python36\\Scripts;C:\\Program Files\\Git\\usr\\bin;C:\\Program Files\\Redis;C:\\opscode\\chefdk\\bin;C:\\Program Files\\dotnet;C:\\uru;C:\\WINDOWS\\System32\\OpenSSH;C:\\ffmpeg;C:\\Program Files\\nodejs;C:\\Program Files\\Git LFS;C:\\Program Files\\Microsoft VS Code Insiders\\bin;C:\\Program Files\\Telegrap;C:\\Program Files\\Chronograf;C:\\Program Files\\Kapacitor;C:\\Program Files\\InfluxDB;.;C:\\Program Files\\NVIDIA Corporation\\NVIDIA NvDLISR;C:\\Users\\Derk-Jan\\.windows-build-tools\\python27;C:\\Users\\Derk-Jan\\AppData\\Local\\Yarn\\Data\\global\\node_modules\\windows-build-tools\\node_modules\\.bin;C:\\Users\\Derk-Jan\\AppData\\Local\\Yarn\\Data\\link\\node_modules\\.bin;C:\\Program Files\\libexec\\lib\\node_modules\\npm\\bin\\node-gyp-bin;C:\\Program Files\\lib\\node_modules\\npm\\bin\\node-gyp-bin;C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\node-gyp-bin;C:\\Go\\bin;C:\\TDM-GCC-64\\bin;C:\\ProgramData\\chocolatey\\bin;C:\\Program Files (x86)\\GnuPG\\bin;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0;C:\\WINDOWS\\System32\\OpenSSH;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files (x86)\\Yarn\\bin;C:\\Program Files\\Docker\\Docker\\resources\\bin;C:\\ProgramData\\DockerDesktop\\version-bin;C:\\Ruby26-x64\\bin;C:\\Users\\Derk-Jan\\scoop\\shims;C:\\Program Files (x86)\\Intel\\iCLS Client;C:\\Program Files (x86)\\Common Files\\Oracle\\Java\\javapath;C:\\Program Files\\ImageMagick-6.9.7-Q16-HDRI;C:\\Program Files (x86)\\GnuWin32\\bin;C:\\ProgramData\\Oracle\\Java\\javapath;C:\\Program Files\\Intel\\iCLS Client;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0;C:\\Program Files (x86)\\NVIDIA Corporation\\PhysX\\Common;C:\\Program Files\\Git\\cmd;C:\\Program Files\\Amazon\\AWSCLI;C:\\Users\\Derk-Jan\\AppData\\Roaming\\npm;C:\\Program Files\\PuTTY;C:\\Users\\Derk-Jan\\AppData\\Roaming\\Python\\Python36\\Scripts;C:\\Program Files\\Git\\usr\\bin;C:\\Program Files\\Redis;C:\\Program Files\\dotnet;C:\\uru;C:\\WINDOWS\\System32\\OpenSSH;C:\\ffmpeg;C:\\Program Files\\nodejs;C:\\Program Files\\Git LFS;C:\\Program Files (x86)\\Yarn\\bin;C:\\Program Files\\Microsoft VS Code Insiders\\bin;C:\\Program Files\\Telegrap;C:\\Program Files\\Chronograf;C:\\Program Files\\Kapacitor;C:\\Program Files\\InfluxDB;.;C:\\Users\\Derk-Jan\\.cargo\\bin;C:\\Users\\Derk-Jan\\AppData\\Local\\Programs\\Python\\Python36\\Scripts;C:\\Users\\Derk-Jan\\AppData\\Local\\Programs\\Python\\Python36;C:\\Program Files (x86)\\FAHClient;C:\\Users\\Derk-Jan\\AppData\\Roaming\\Dashlane\\4.8.7.35982\\bin\\Firefox_Extension\\{442718d9-475e-452a-b3e1-fb1ee16b8e9f}\\components;C:\\Users\\Derk-Jan\\AppData\\Roaming\\Dashlane\\4.8.7.35982\\ucrt;C:\\Users\\Derk-Jan\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Exercism;C:\\Users\\Derk-Jan\\AppData\\Local\\GitHubDesktop\\bin;C:\\Users\\Derk-Jan\\go\\bin;C:\\Users\\Derk-Jan\\AppData\\Local\\Code\\bin;C:\\Program Files\\Java\\jdk1.8.0_121\\jre\\bin;C:\\Users\\Derk-Jan\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Program Files (x86)\\Graphviz2.38\\bin;C:\\youtube-dl;C:\\Users\\Derk-Jan\\AppData\\Local\\Yarn\\bin;C:\\vips\\bin\n\nYarn version: \n  1.22.4\n\nNode version: \n  12.19.0\n\nPlatform: \n  win32 x64\n\nTrace: \n  Error: https://registry.yarnpkg.com/@babel%2fchore: Not found\n      at Request.params.callback [as _callback] (C:\\Program Files (x86)\\Yarn\\lib\\cli.js:66096:18)\n      at Request.self.callback (C:\\Program Files (x86)\\Yarn\\lib\\cli.js:140748:22)\n      at Request.emit (events.js:314:20)\n      at Request.<anonymous> (C:\\Program Files (x86)\\Yarn\\lib\\cli.js:141720:10)\n      at Request.emit (events.js:314:20)\n      at IncomingMessage.<anonymous> (C:\\Program Files (x86)\\Yarn\\lib\\cli.js:141642:12)\n      at Object.onceWrapper (events.js:420:28)\n      at IncomingMessage.emit (events.js:326:22)\n      at endReadableNT (_stream_readable.js:1223:12)\n      at processTicksAndRejections (internal/process/task_queues.js:84:21)\n\nnpm manifest: \n  {\n    \"name\": \"@exercism/typescript-track\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Exercism TypeScript track top-level runner. Not meant for individual exercises.\",\n    \"private\": true,\n    \"repository\": {\n      \"type\": \"git\",\n      \"url\": \"https://github.com/exercism/typescript\"\n    },\n    \"devDependencies\": {\n      \"@typescript-eslint/eslint-plugin\": \"^4.4.1\",\n      \"@typescript-eslint/parser\": \"^4.4.1\",\n      \"eslint\": \"^7.11.0\",\n      \"eslint-plugin-import\": \"^2.22.1\",\n      \"typescript\": \"^4.0.3\"\n    },\n    \"scripts\": {\n      \"lint\": \"yarn eslint . --ext .tsx,.ts -c .eslint.track.rc\",\n      \"lint:report\": \"yarn lint --format json -o lintreport.json\"\n    },\n    \"dependencies\": {}\n  }\n\nyarn manifest: \n  No manifest\n\nLockfile: \n  No lockfile\n"
  }
]