[
  {
    "path": ".dockerignore",
    "content": "*\n!requirements.txt\n"
  },
  {
    "path": ".editorconfig",
    "content": "# editorconfig.org\nroot = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\n\n[*.md]\ntrim_trailing_whitespace = false\n\n[Makefile]\nindent_style = tab\n\n[*.ts]\nindent_style = tab\n\n[*.tsx]\nindent_style = tab\n"
  },
  {
    "path": ".eslintrc.js",
    "content": "module.exports = {\n  extends: [\"./node_modules/@balena/lint/config/.eslintrc.js\"],\n  root: true,\n  ignorePatterns: [\"node_modules/\"],\n  rules: {\n    \"@typescript-eslint/no-floating-promises\": \"off\",\n    \"@typescript-eslint/no-var-requires\": \"off\",\n    \"@typescript-eslint/ban-ts-comment\": \"off\",\n  },\n};\n"
  },
  {
    "path": ".gitattributes",
    "content": "# default\n* text\n\n# Javascript files must retain LF line-endings (to keep eslint happy)\n*.js text eol=lf\n*.jsx text eol=lf\n*.ts text eol=lf\n*.tsx text eol=lf\n# CSS and SCSS files must retain LF line-endings (to keep ensure-staged-sass.sh happy)\n*.css text eol=lf\n*.scss text eol=lf\n\n# Text files\nDockerfile* text\n.dockerignore text\n.editorconfig text\netcher text\n.git* text\n*.html text\n*.json text eol=lf\n*.cpp text\n*.h text\n*.gyp text\nLICENSE text\nMakefile text\n*.md text\n*.sh text\n*.bat text\n*.svg text\n*.yml text\n*.patch text\n*.txt text\n*.tpl text\nCODEOWNERS text\n*.plist text\n\n# Binary files (no line-ending conversions)\n*.bz2 binary diff=hex\n*.gz binary diff=hex\n*.icns binary diff=hex\n*.ico binary diff=hex\n*.tiff binary diff=hex\n*.img binary diff=hex\n*.iso binary diff=hex\n*.png binary diff=hex\n*.bin binary diff=hex\n*.elf binary diff=hex\n*.xz binary diff=hex\n*.zip binary diff=hex\n*.dtb binary diff=hex\n*.dtbo binary diff=hex\n*.dat binary diff=hex\n*.bin binary diff=hex\n*.dmg binary diff=hex\n*.rpi-sdcard binary diff=hex\n*.wic binary diff=hex\n*.foo binary diff=hex\n*.eot binary diff=hex\n*.otf binary diff=hex\n*.woff binary diff=hex\n*.woff2 binary diff=hex\n*.ttf binary diff=hex\nxz-without-extension binary diff=hex\nwmic-output.txt binary diff=hex\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "- **Etcher version:** \n- **Operating system and architecture:** \n- **Image flashed:** \n- **What do you think should have happened:** <!-- or a step by step reproduction process -->\n- **What happened:**\n- **Do you see any meaningful error information in the DevTools?** \n<!-- You can open DevTools by pressing `Ctrl+Shift+I` (`Ctrl+Alt+I` for Etcher before v1.3.x), or `Cmd+Opt+I` if you're on macOS. -->\n\n<!-- issues with missing information will be labeled as not-enough-info and closed shortly -->\n<!-- please try to include as many influencing elements as possible are you root, does any other process block the device, etc. -->\n<!-- if you find a solution in the meantime thank you for sharing the fix and not just closing / abandoning your issue -->\n"
  },
  {
    "path": ".github/actions/publish/action.yml",
    "content": "---\nname: package and publish GitHub (draft) release\n# https://github.com/product-os/flowzone/tree/master/.github/actions\ninputs:\n  json:\n    description: 'JSON stringified object containing all the inputs from the calling workflow'\n    required: true\n  secrets:\n    description: 'JSON stringified object containing all the secrets from the calling workflow'\n    required: true\n\n  # --- custom environment\n  NODE_VERSION:\n    type: string\n    # Beware that native modules will be built for this version,\n    # which might not be compatible with the one used by pkg (see forge.sidecar.ts)\n    # https://github.com/vercel/pkg-fetch/releases\n    default: '20.19'\n  VERBOSE:\n    type: string\n    default: 'true'\n\nruns:\n  # https://docs.github.com/en/actions/creating-actions/creating-a-composite-action\n  using: 'composite'\n  steps:\n    - name: Download custom source artifact\n      uses: actions/download-artifact@v4\n      with:\n        name: custom-${{ github.event.pull_request.head.sha || github.event.head_commit.id }}-${{ runner.os }}-${{ runner.arch }}\n        path: ${{ runner.temp }}\n\n    - name: Extract custom source artifact\n      if: runner.os != 'Windows'\n      shell: bash\n      working-directory: .\n      run: tar -xf ${{ runner.temp }}/custom.tgz\n\n    - name: Extract custom source artifact\n      if: runner.os == 'Windows'\n      shell: pwsh\n      working-directory: .\n      run: C:\\\"Program Files\"\\Git\\usr\\bin\\tar.exe --force-local -xf ${{ runner.temp }}\\custom.tgz\n\n    - name: Setup Node.js\n      uses: actions/setup-node@v3\n      with:\n        node-version: ${{ inputs.NODE_VERSION }}\n        cache: npm\n\n    - name: Install host dependencies\n      if: runner.os == 'Linux'\n      shell: bash\n      run: sudo apt-get install -y --no-install-recommends fakeroot dpkg rpm\n\n    # rpmbuild will strip binaries by default, which breaks the sidecar.\n    # Use a macro to override the \"strip\" to bypass stripping.\n    - name: Configure rpmbuild to not strip executables\n      if: runner.os == 'Linux'\n      shell: bash\n      run: echo '%__strip  /usr/bin/true' > ~/.rpmmacros\n\n    - name: Install host dependencies\n      if: runner.os == 'macOS'\n      # FIXME: Python 3.12 dropped distutils that node-gyp depends upon.\n      # This is a temporary workaround to make the job use Python 3.11 until\n      # we update to npm 10+.\n      uses: actions/setup-python@d27e3f3d7c64b4bbf8e4abfb9b63b83e846e0435 # v4\n      with:\n        python-version: '3.11'\n\n    # https://www.electron.build/code-signing.html\n    # https://dev.to/rwwagner90/signing-electron-apps-with-github-actions-4cof\n    - name: Import Apple code signing certificate\n      if: runner.os == 'macOS'\n      shell: bash\n      run: |\n        KEY_CHAIN=build.keychain\n        CERTIFICATE_P12=certificate.p12\n\n        # Recreate the certificate from the secure environment variable\n        echo $CERTIFICATE_P12_B64 | base64 --decode > $CERTIFICATE_P12\n\n        # Create a keychain\n        security create-keychain -p actions $KEY_CHAIN\n\n        # Make the keychain the default so identities are found\n        security default-keychain -s $KEY_CHAIN\n\n        # Unlock the keychain\n        security unlock-keychain -p actions $KEY_CHAIN\n\n        security import $CERTIFICATE_P12 -k $KEY_CHAIN -P $CERTIFICATE_PASSWORD -T /usr/bin/codesign\n\n        security set-key-partition-list -S apple-tool:,apple: -s -k actions $KEY_CHAIN\n\n        # remove certs\n        rm -fr *.p12\n      env:\n        CERTIFICATE_P12_B64: ${{ fromJSON(inputs.secrets).APPLE_SIGNING }}\n        CERTIFICATE_PASSWORD: ${{ fromJSON(inputs.secrets).APPLE_SIGNING_PASSWORD }}\n\n    - name: Import Windows code signing certificate\n      if: runner.os == 'Windows'\n      id: import_win_signing_cert\n      shell: powershell\n      run: |\n        Set-Content -Path ${{ runner.temp }}/certificate.base64 -Value $env:SM_CLIENT_CERT_FILE_B64\n        certutil -decode ${{ runner.temp }}/certificate.base64 ${{ runner.temp }}/Certificate_pkcs12.p12\n        Remove-Item -path ${{ runner.temp }} -include certificate.base64\n\n        echo \"certFilePath=${{ runner.temp }}/Certificate_pkcs12.p12\" >> $GITHUB_OUTPUT\n\n      env:\n        SM_CLIENT_CERT_FILE_B64: ${{ fromJSON(inputs.secrets).SM_CLIENT_CERT_FILE_B64 }}\n\n    - name: Package release\n      shell: bash\n      # IMPORTANT: before making changes to this step please consult @engineering in balena's chat.\n      run: |\n        ## FIXME: causes issues with `xxhash` which tries to load a debug build which doens't exist and cannot be compiled\n        # if [[ '${{ inputs.VERBOSE }}' =~ on|On|Yes|yes|true|True ]]; then\n        #  export DEBUG='electron-forge:*,sidecar'\n        # fi\n\n        APPLICATION_VERSION=\"$(jq -r '.version' package.json)\"\n        HOST_ARCH=\"$(echo \"${RUNNER_ARCH}\" | tr '[:upper:]' '[:lower:]')\"\n\n        if [[ \"${RUNNER_OS}\" == Linux ]]; then\n          PLATFORM=Linux\n          SHA256SUM_BIN=sha256sum\n\n        elif [[ \"${RUNNER_OS}\" == macOS ]]; then\n          PLATFORM=Darwin\n          SHA256SUM_BIN='shasum -a 256'\n\n        elif [[ \"${RUNNER_OS}\" == Windows ]]; then\n          PLATFORM=Windows\n          SHA256SUM_BIN=sha256sum\n\n          # Install DigiCert Signing Manager Tools\n          curl --silent --retry 3 --fail https://one.digicert.com/signingmanager/api-ui/v1/releases/smtools-windows-x64.msi/download \\\n            -H \"x-api-key:$SM_API_KEY\" \\\n            -o smtools-windows-x64.msi\n          msiexec -i smtools-windows-x64.msi -qn\n          PATH=\"/c/Program Files/DigiCert/DigiCert One Signing Manager Tools:${PATH}\"\n          smksp_registrar.exe list\n          smctl.exe keypair ls\n          smctl.exe windows certsync\n          /c/Windows/System32/certutil.exe -csp \"DigiCert Signing Manager KSP\" -key -user\n\n          # (signtool.exe) https://github.com/actions/runner-images/blob/main/images/win/Windows2019-Readme.md#installed-windows-sdks\n          PATH=\"/c/Program Files (x86)/Windows Kits/10/bin/${runner_arch}:${PATH}\"\n\n        else\n          echo \"ERROR: unexpected runner OS: ${RUNNER_OS}\"\n          exit 1\n        fi\n\n        # Currently, we can only build for the host architecture.\n        npx electron-forge make\n\n        echo \"version=${APPLICATION_VERSION}\" >> $GITHUB_OUTPUT\n\n        # collect all artifacts from subdirectories under a common top-level directory\n        mkdir -p dist\n        find ./out/make -type f \\( \\\n          -iname \"*.zip\" -o        \\\n          -iname \"*.dmg\" -o        \\\n          -iname \"*.rpm\" -o        \\\n          -iname \"*.deb\" -o        \\\n          -iname \"*.AppImage\" -o   \\\n          -iname \"*Setup.exe\"      \\\n        \\) -ls -exec cp '{}' dist/ \\;\n\n        if [[ -n \"${SHA256SUM_BIN}\" ]]; then\n          # Compute and save digests.\n          cd dist/\n          ${SHA256SUM_BIN} *.* >\"SHA256SUMS.${PLATFORM}.${HOST_ARCH}.txt\"\n        fi\n      env:\n        # ensure we sign the artifacts\n        NODE_ENV: production\n        # analytics tokens\n        SENTRY_TOKEN: https://739bbcfc0ba4481481138d3fc831136d@o95242.ingest.sentry.io/4504451487301632\n        AMPLITUDE_TOKEN: 'balena-etcher'\n        # Apple notarization\n        XCODE_APP_LOADER_EMAIL: ${{ fromJSON(inputs.secrets).XCODE_APP_LOADER_EMAIL }}\n        XCODE_APP_LOADER_PASSWORD: ${{ fromJSON(inputs.secrets).XCODE_APP_LOADER_PASSWORD }}\n        XCODE_APP_LOADER_TEAM_ID: ${{ fromJSON(inputs.secrets).XCODE_APP_LOADER_TEAM_ID }}\n        # Windows signing\n        SM_CLIENT_CERT_PASSWORD: ${{ fromJSON(inputs.secrets).SM_CLIENT_CERT_PASSWORD }}\n        SM_CLIENT_CERT_FILE: '${{ runner.temp }}\\Certificate_pkcs12.p12'\n        SM_HOST: ${{ fromJSON(inputs.secrets).SM_HOST }}\n        SM_API_KEY: ${{ fromJSON(inputs.secrets).SM_API_KEY }}\n        SM_CODE_SIGNING_CERT_SHA1_HASH: ${{ fromJSON(inputs.secrets).SM_CODE_SIGNING_CERT_SHA1_HASH }}\n        TIMESTAMP_SERVER: http://timestamp.digicert.com\n\n    - name: Upload artifacts\n      uses: actions/upload-artifact@v4\n      with:\n        name: gh-release-${{ github.event.pull_request.head.sha || github.event.head_commit.id }}-${{ runner.os }}-${{ runner.arch }}\n        path: dist\n        retention-days: 1\n        if-no-files-found: error\n"
  },
  {
    "path": ".github/actions/test/action.yml",
    "content": "---\nname: test release\n# https://github.com/product-os/flowzone/tree/master/.github/actions\ninputs:\n  json:\n    description: 'JSON stringified object containing all the inputs from the calling workflow'\n    required: true\n  secrets:\n    description: 'JSON stringified object containing all the secrets from the calling workflow'\n    required: true\n\n  # --- custom environment\n  NODE_VERSION:\n    type: string\n    default: '20.19'\n  VERBOSE:\n    type: string\n    default: 'true'\n\nruns:\n  # https://docs.github.com/en/actions/creating-actions/creating-a-composite-action\n  using: 'composite'\n  steps:\n    # https://github.com/actions/setup-node#caching-global-packages-data\n    - name: Setup Node.js\n      uses: actions/setup-node@v3\n      with:\n        node-version: ${{ inputs.NODE_VERSION }}\n        cache: npm\n\n    - name: Install host dependencies\n      if: runner.os == 'Linux'\n      shell: bash\n      run: |\n        sudo apt-get update && sudo apt-get install -y --no-install-recommends xvfb libudev-dev\n        cat < package.json | jq -r '.hostDependencies[][]' - | \\\n          xargs -L1 echo | sed 's/|//g' | xargs -L1 \\\n          sudo apt-get --ignore-missing install || true\n\n    - name: Install host dependencies\n      if: runner.os == 'macOS'\n      # FIXME: Python 3.12 dropped distutils that node-gyp depends upon.\n      # This is a temporary workaround to make the job use Python 3.11 until\n      # we update to npm 10+.\n      uses: actions/setup-python@d27e3f3d7c64b4bbf8e4abfb9b63b83e846e0435 # v4\n      with:\n        python-version: '3.11'\n\n    - name: Test release\n      shell: bash\n      run: |\n        ## FIXME: causes issues with `xxhash` which tries to load a debug build which doens't exist and cannot be compiled\n        # if [[ '${{ inputs.VERBOSE }}' =~ on|On|Yes|yes|true|True ]]; then\n        #   export DEBUG='electron-forge:*,sidecar'\n        # fi\n\n        npm ci\n\n        # as the shrinkwrap might have been done on mac/linux, this is ensure the package is there for windows\n        if [[ \"$RUNNER_OS\" == \"Windows\" ]]; then\n          npm i -D winusb-driver-generator\n\n          # need to modifies @yao-pkg/pkg-fetch\n          # expected-shas.json and patches.json files to force use of nodejs v20.11.1 instead of latest minor (v20.19.4 at the time of writing).\n          # this is required for Windows compatibility as 20.15.1 introduced a regression that breaks the flasher on Windows.\n          # As soon as nodejs the fix is backported to node20 and, or node 22, this script can be removed: https://github.com/nodejs/node/pull/55623\n          \n          # Add entry to expected-shas.json\n          sed -i 's/}$/,\\n  \"node-v20.11.1-win-x64\": \"140c377c2c91751832e673cb488724cbd003f01aa237615142cd2907f34fa1a2\"\\n}/' node_modules/@yao-pkg/pkg-fetch/lib-es5/expected-shas.json\n\n          # Replace any \"v20...\" key with \"v20.11.1\" in patches.json (keeps value)\n          sed -i -E 's/\"v20[^\"]*\":/\"v20.11.1\":/' node_modules/@yao-pkg/pkg-fetch/patches/patches.json\n        fi\n\n        npm run lint\n        npm run package\n        npm run wdio # test stage, note that it requires the package to be done first\n\n      env:\n        # https://www.electronjs.org/docs/latest/api/environment-variables\n        ELECTRON_NO_ATTACH_CONSOLE: 'true'\n\n    - name: Compress custom source\n      if: runner.os != 'Windows'\n      shell: bash\n      run: tar -acf ${{ runner.temp }}/custom.tgz .\n\n    - name: Compress custom source\n      if: runner.os == 'Windows'\n      shell: pwsh\n      run: C:\\\"Program Files\"\\Git\\usr\\bin\\tar.exe --force-local -acf ${{ runner.temp }}\\custom.tgz .\n\n    - name: Upload custom artifact\n      uses: actions/upload-artifact@v4\n      with:\n        name: custom-${{ github.event.pull_request.head.sha || github.event.head_commit.id }}-${{ runner.os }}-${{ runner.arch }}\n        path: ${{ runner.temp }}/custom.tgz\n        retention-days: 1\n"
  },
  {
    "path": ".github/workflows/flowzone.yml",
    "content": "name: Flowzone\non:\n  pull_request:\n    types: [opened, synchronize, closed]\n    branches: [main, master]\n  # allow external contributions to use secrets within trusted code\n  pull_request_target:\n    types: [opened, synchronize, closed]\n    branches: [main, master]\njobs:\n  flowzone:\n    name: Flowzone\n    uses: product-os/flowzone/.github/workflows/flowzone.yml@master\n    # prevent duplicate workflows and only allow one `pull_request` or `pull_request_target` for\n    # internal or external contributions respectively\n    if: |\n      (github.event.pull_request.head.repo.full_name == github.repository && github.event_name == 'pull_request') ||\n      (github.event.pull_request.head.repo.full_name != github.repository && github.event_name == 'pull_request_target')\n    secrets: inherit\n    with:\n      custom_test_matrix: >\n        {\n          \"os\": [\n            [\"ubuntu-22.04\"],\n            [\"windows-2022\"],\n            [\"macos-13\"],\n            [\"macos-latest-xlarge\"]\n          ]\n        }\n      custom_publish_matrix: >\n        {\n          \"os\": [\n            [\"ubuntu-22.04\"],\n            [\"windows-2022\"],\n            [\"macos-13\"],\n            [\"macos-latest-xlarge\"]\n          ]\n        }\n      restrict_custom_actions: false\n      github_prerelease: true\n      cloudflare_website: 'etcher'\n"
  },
  {
    "path": ".github/workflows/winget.yml",
    "content": "name: Publish to WinGet\non:\n  release:\n    types: [released]\njobs:\n  publish:\n    runs-on: windows-latest # action can only be run on windows\n    steps:\n      - uses: vedantmgoyal2009/winget-releaser@v2\n        with:\n          identifier: Balena.Etcher\n          # matches something like \"balenaEtcher-1.19.0.Setup.exe\"\n          installers-regex: 'balenaEtcher-[\\d.-]+\\.Setup.exe$'\n          token: ${{ secrets.WINGET_PAT }}\n"
  },
  {
    "path": ".gitignore",
    "content": "\n# -- ADD NEW ENTRIES AT THE END OF THE FILE ---\n\n# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\n\n# Diagnostic reports (https://nodejs.org/api/report.html)\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\n\n# Runtime data\npids\n*.pid\n*.seed\n*.pid.lock\n.DS_Store\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nlib-cov\n\n# Coverage directory used by tools like istanbul\ncoverage\n*.lcov\n\n# nyc test coverage\n.nyc_output\n\n# node-waf configuration\n.lock-wscript\n\n# Compiled binary addons (https://nodejs.org/api/addons.html)\nbuild/Release\n\n# Dependency directories\nnode_modules/\njspm_packages/\n\n# TypeScript v1 declaration files\ntypings/\n\n# TypeScript cache\n*.tsbuildinfo\n\n# Optional npm cache directory\n.npm\n\n# Optional eslint cache\n.eslintcache\n\n# Optional REPL history\n.node_repl_history\n\n# Output of 'npm pack'\n*.tgz\n\n# Yarn Integrity file\n.yarn-integrity\n\n# dotenv environment variables file\n.env\n.env.test\n\n# parcel-bundler cache (https://parceljs.org/)\n.cache\n\n# next.js build output\n.next\n\n# nuxt.js build output\n.nuxt\n\n# vuepress build output\n.vuepress/dist\n\n# Serverless directories\n.serverless/\n\n# FuseBox cache\n.fusebox/\n\n# DynamoDB Local files\n.dynamodb/\n\n# Webpack\n.webpack/\n\n# Vite\n.vite/\n\n# Electron-Forge\nout/\n\n# ---- Do not modify entries above this line ----\n\n# Build artifacts\ndist/\n\n# Certificates\n*.spc\n*.pvk\n*.p12\n*.cer\n*.crt\n*.pem\n\n# Secrets\n.gitsecret/keys/random_seed\n!*.secret\nsecrets/APPLE_SIGNING_PASSWORD.txt\nsecrets/WINDOWS_SIGNING_PASSWORD.txt\nsecrets/XCODE_APP_LOADER_PASSWORD.txt\nsecrets/WINDOWS_SIGNING.pfx\n\n# Image stream output directory\n/tests/image-stream/output\n\n#local development\n.yalc\nyalc.lock"
  },
  {
    "path": ".nvmrc",
    "content": "18\n"
  },
  {
    "path": ".prettierrc.js",
    "content": "const fs = require(\"fs\");\nconst path = require(\"path\");\n\nmodule.exports = JSON.parse(\n  fs.readFileSync(path.join(__dirname, \"node_modules\", \"@balena\", \"lint\", \"config\", \".prettierrc\"), \"utf8\"),\n);\n"
  },
  {
    "path": ".versionbot/CHANGELOG.yml",
    "content": "- commits:\n    - subject: \"patch: fix ubuntu 24 build and flash issues - bump electron-forge to\n        7.8.1 - bump electron to 37.2.4 - stop producing broken appimage\"\n      hash: c824a60e5dc9a78b92679fa8915e3ddad4127c05\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n    - subject: \"patch: fix windows build and flash issues - downgrade flasher's node\n        to 20.11.1 on windows - bump windows GHA runner to 2022 - bump\n        winusb-driver-generator to 2.1.9\"\n      hash: 2a470f5e6c864ea161188f1e1a01d4baeba6c310\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n    - subject: \"patch: refactor permission code\"\n      hash: f3123f3cbe0159c624412ec2f162d01e079d314e\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 2.1.4\n  title: \"\"\n  date: 2025-07-29T12:17:33.739Z\n- commits:\n    - subject: Remove stale secrets\n      hash: c2fc36971c9460eac6bd02cfc7bdcabec7b97a6d\n      body: \"\"\n      footer:\n        change-type: patch\n      author: Anton Belodedenko\n      nested: []\n  version: 2.1.3\n  title: \"\"\n  date: 2025-05-15T18:09:55.848Z\n- commits:\n    - subject: \"patch: remove analytics\"\n      hash: aa6d526fea010d181f49dd81ae3bdaefb8d1938e\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 2.1.2\n  title: \"\"\n  date: 2025-05-08T08:51:44.810Z\n- commits:\n    - subject: \"patch: fix signin windows artifacts\"\n      hash: a1e9be2f94629447e02994e52e12c67ec98de831\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 2.1.1\n  title: \"\"\n  date: 2025-05-05T17:19:50.443Z\n- commits:\n    - subject: Add informational notice about how to disable analytics collection\n      hash: aac092fd4df8750024c082b25dcbd0ae6ee618fd\n      body: \"\"\n      footer:\n        Change-type: minor\n        change-type: minor\n      author: myarmolinsky\n      nested: []\n  version: 2.1.0\n  title: \"\"\n  date: 2025-02-27T16:16:57.036Z\n- commits:\n    - subject: \"major: build on ubuntu 22 and macos 13\"\n      hash: 039a022353d1980ef9ddd19166515c531e48aba4\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 2.0.0\n  title: \"\"\n  date: 2025-02-20T14:27:01.338Z\n- commits:\n    - subject: \"patch: bump etcher-sdk to 9.1.2\"\n      hash: c726b51dca3383c76f4bf824fd5d594ac3069180\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 1.19.25\n  title: \"\"\n  date: 2024-10-10T10:03:29.519Z\n- commits:\n    - subject: \"patch: etcher-util is corrupted in RPM package\"\n      hash: e43ee788ec5ec49e105ff804206919bb10a59ea7\n      body: |\n        rpmbuild strips executables by default when generating an rpm packge.\n        This was causing the JavaScript code bundled in the etcher-util file\n        to be removed, causing \"Pkg: Error reading from file.\" whenever\n        etcher-util was called.\n\n        This in turn caused balena-etcher to generate the error message\n        `Error: (0, h.requestMetadata) is not a function` when attempting\n        to write an SD card.\n\n        This fixes the issue for RPM builds by replacing the `strip` command\n        with `true` so that rpmbuild no longer strips the executables and\n        the embeded code stays intact.\n\n        See: https://github.com/balena-io/etcher/issues/4150\n      footer:\n        Signed-off-by: Richard Glidden <richard@glidden.org>\n        signed-off-by: Richard Glidden <richard@glidden.org>\n      author: Richard Glidden\n      nested: []\n  version: 1.19.24\n  title: \"\"\n  date: 2024-10-09T14:22:56.623Z\n- commits:\n    - subject: \"patch: remove gconf2 libgconf-2-4 deps\"\n      hash: 2ed779ef371db367e4e413c9d0d08fcd738edb5b\n      body: \"Closes #4096\"\n      footer: {}\n      author: Marc-Aurèle Brothier\n      nested: []\n  version: 1.19.23\n  title: \"\"\n  date: 2024-10-09T13:52:54.936Z\n- commits:\n    - subject: Replace deprecated Flowzone inputs\n      hash: 52d396aa7ea9ae1ef6d68151f582f04f57191b14\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Kyle Harding\n      nested: []\n  version: 1.19.22\n  title: \"\"\n  date: 2024-07-18T18:12:56.368Z\n- commits:\n    - subject: \"patch: fix missing windows dependency\"\n      hash: 8dad81ae34b8d71f3d4f7151ee60717e6207ccd8\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n    - subject: \"patch: fix missing windows dependency\"\n      hash: d28719daf249f2994acdf94b4bb7ea937ffcab9b\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n    - subject: \"patch: fix missing windows dependency\"\n      hash: 98db4df0dc147e5fec9180c50f4e21acf1fd0a58\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 1.19.21\n  title: \"\"\n  date: 2024-05-30T15:00:35.706Z\n- commits:\n    - subject: \"patch: fix missing windows dependency\"\n      hash: c4d3f8db8769418925a9909ac700edc5f425a068\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 1.19.20\n  title: \"\"\n  date: 2024-05-30T10:17:29.075Z\n- commits:\n    - subject: \"patch: add sentry debug flag\"\n      hash: 8223130e8dfce180481550d77f022064255601e4\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 1.19.19\n  title: \"\"\n  date: 2024-05-28T12:09:51.167Z\n- commits:\n    - subject: \"patch: fix Sentry DSN for main process\"\n      hash: 4ffda6e208a6e2f109f652d39e1248bec23a2ddf\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 1.19.18\n  title: \"\"\n  date: 2024-05-22T13:28:03.659Z\n- commits:\n    - subject: \"patch: fix injection of analytics key at build time\"\n      hash: e94767aca7b07e674bd60176ef77c11440131ace\n      body: \"\"\n      footer: {}\n      author: JOASSART Edwin\n      nested: []\n  version: 1.19.17\n  title: \"\"\n  date: 2024-05-09T06:33:45.091Z\n- commits:\n    - subject: \"patch: hold request for metadata while waiting for flasher\"\n      hash: 2dfa795129e287f887b9ea02f2eca717575d27ac\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 1.19.16\n  title: \"\"\n  date: 2024-04-26T14:33:19.111Z\n- commits:\n    - subject: \"patch: bump etcher-sdk to 9.0.11 to fix url loading using http/2\"\n      hash: cb03fb83754f38d647fc951b94470725b46b2b31\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 1.19.15\n  title: \"\"\n  date: 2024-04-26T13:26:57.047Z\n- commits:\n    - subject: \"patch: pretty-bytes to 6.1.1\"\n      hash: fa642270f7153f14e45ee03a73bad1f0797cbd51\n      body: \"\"\n      footer: {}\n      author: JOASSART Edwin\n      nested: []\n  version: 1.19.14\n  title: \"\"\n  date: 2024-04-25T21:11:35.350Z\n- commits:\n    - subject: \"patch: use etcher icon as loading for windows installer\"\n      hash: bc3340960a765e99f2f02bc21adace91d228d26f\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n    - subject: \"patch: fix windows squirrel install\"\n      hash: d498248a0f1416045b836646b72c7b4c588119d3\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 1.19.13\n  title: \"\"\n  date: 2024-04-25T19:02:23.576Z\n- commits:\n    - subject: \"patch: bump minors & patch\"\n      hash: afd659f9e586e012be7e3b02490d14a8ac64bb35\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n    - subject: \"patch: bump @electron-forge/* to 7.4.0\"\n      hash: ffdeccf7efd1412a2e2838fd07df5b21f1233efe\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n    - subject: \"patch: bump electron to 30.0.1 & @electron/remote to 2.1.2\"\n      hash: 37ac323e10c07db35a7e47b576d07e1d4d41a470\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n    - subject: \"patch: npm upgrade\"\n      hash: 7c8f3c35d3d159e7be73442ab215019dc2388f54\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n    - subject: \"patch: bump @balena/lint to 8.0.2 and fix formating\"\n      hash: 4aa4140d65189920938c42c41a6a781c97148c8a\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n    - subject: \"patch: fix pretty-bytes imports\"\n      hash: 064261107954dd64d03f94d6aeffd95cd2211df0\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n    - subject: \"patch: bump etcher-sdk to 9.0.9\"\n      hash: 2f4a12a48facf0634ed457fe6ed7c50e21b419ee\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 1.19.12\n  title: \"\"\n  date: 2024-04-25T16:47:43.024Z\n- commits:\n    - subject: \"patch: setup wdio and port (most) tests\"\n      hash: a661d102bc94bf2707f01958d1e9d260efc06c14\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 1.19.11\n  title: \"\"\n  date: 2024-04-25T13:00:13.805Z\n- commits:\n    - subject: \"patch: remove node-ipc and tests\"\n      hash: ccc31bb9aaba8df88b2af612824d9106051e2804\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n    - subject: \"patch: switch api; use ws; integrate sudo-prompt - switch api roles\n        flow - use websocket instead of node-ipc - integrate; modernize;\n        simplify and deprecate sudo-prompt\"\n      hash: b3e33824ed1f70719b04f18dcb7f7dd76451b7f6\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n    - subject: \"patch: refactor api to use a single topic\"\n      hash: 6582260355fcc5280932bee771602fbfb5190619\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n    - subject: \"patch: set require node engine to 20\"\n      hash: b1d2bdaa06bfb35f4a66d92275ca21c731d1cf8e\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 1.19.10\n  title: \"\"\n  date: 2024-04-23T10:28:00.127Z\n- commits:\n    - subject: \"patch: prevent rebuild of native deps by @electron/rebuild\"\n      hash: 003abfb88f2c7bff0ee291828f3815c738340afa\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 1.19.9\n  title: \"\"\n  date: 2024-04-22T10:20:10.534Z\n- commits:\n    - subject: \"patch: replace deprecated pkg with yao-pkg and bump etcher-util node v\n        to 20.10\"\n      hash: c696c389c9988c75ad9ccc472bdac7edefe762ed\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 1.19.8\n  title: \"\"\n  date: 2024-04-22T09:37:37.561Z\n- commits:\n    - subject: \"patch: fix formating\"\n      hash: 1a9a3d2cdc5642a754b73628f4ae2636e3ffd8eb\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n    - subject: \"patch: configure prettier in the project to use balena-lint\n        configuration\"\n      hash: faeaa58ec548e47abaf30b2498ab145e7c0c6f76\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 1.19.7\n  title: \"\"\n  date: 2024-04-22T06:52:18.878Z\n- commits:\n    - subject: \"patch: fix win signature process\"\n      hash: f629e6d53b5329cd7e8105050df042f3873a35ee\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 1.19.6\n  title: \"\"\n  date: 2024-04-19T15:59:28.200Z\n- commits:\n    - subject: Replace deprecated flowzone input tests_run_on\n      hash: bec0e50741bfeda63ca9785217576613f74ca043\n      body: |\n        The `custom_runs_on` array supports multiple runner labels\n        in nested arrays.\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Kyle Harding <kyle@balena.io>\n        signed-off-by: Kyle Harding <kyle@balena.io>\n      author: Kyle Harding\n      nested: []\n  version: 1.19.5\n  title: \"\"\n  date: 2024-02-14T19:51:16.321Z\n- commits:\n    - subject: \"patch: remove screensaver error when not on etcher-pro\"\n      hash: 196fd8ae24de2a23ebaeae736c6ca41007162fa1\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n    - subject: \"patch: fix typo in IPC server id\"\n      hash: 5d436992423961258ad861c01e3b9b30f3317aab\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 1.19.4\n  title: \"\"\n  date: 2024-01-26T17:29:27.301Z\n- commits:\n    - subject: Update dependencies\n      hash: 0f2b4dbc106c55fe104f0b10e62c35c16bcfe9b3\n      body: >\n        - upgrade pretty_bytes to 6.1.1\n\n        - upgrade electron-remote to 2.1.0\n\n        - upgrade semver to 7.5.4 + @types/semver to 7.5.6\n\n        - upgrade chai to 4.3.11 + @types/chai to 4.3.10\n\n        - upgrade mocha to 10.2.0 + @types/mocha to 10.0.6\n\n        - upgrade sinon to 17.0.1 + @types/sinon to 17.0.2\n\n        - remove useless @types\n\n        - upgrade @svgr/webpack to 8.1.0\n\n        - upgrade @sentry/electron to 4.15.1\n\n        - upgrade tslib to 2.6.2\n\n        - upgrade immutable to 4.3.4\n\n        - upgrade redux to 4.2.1\n\n        - upgrade ts-node to 10.9.2 & ts-loader to 9.5.1\n\n        - remove mini-css-extract-plugin\n\n        - upgrade husky to 8.0.3\n\n        - upgrade uuid to 9.0.1\n\n        - upgrade lint-staged to 15.2.1\n\n        - upgrade @types/node to 18.11.9\n\n        - upgrade @fortawesome/fontawesome-free to 6.5.1\n\n        - upgrade i18next to 23.7.8 & react-i18next to 11.18.6\n\n        - bump react, react-dom + related @types to 17.0.2 and rendition to\n        35.1.0\n\n        - fix getuid for ts\n\n        - fix @types/react being in wrong deps\n\n        - upgrade @types/tmp to 0.2.6\n\n        - upgrade typescript to 5.3.3\n\n        - upgrade @types/mime-types to 2.1.4\n\n        - remove d3 from deps\n\n        - upgrade electron-updater to 6.1.7\n\n        - upgrade rendition to 35.1.2\n\n        - upgrade node-ipc to 9.2.3\n\n        - upgrade @types/node-ipc to 9.2.3\n\n        - upgrade electron to 27.1.3\n\n        - upgrade @electron-forge/* to 7.2.0\n\n        - upgrade @reforged/marker-appimage to 3.3.2\n\n        - upgrade style-loader to 3.3.3\n\n        - upgrade balena-lint to 7.2.4\n\n        - run CI with node 18.19\n\n        - add xxhash-addon to sidecar assets\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Edwin Joassart\n      nested: []\n  version: 1.19.3\n  title: \"\"\n  date: 2023-12-22T16:13:00.924Z\n- commits:\n    - subject: \"fix: typos\"\n      hash: aaac1336702b7ac4a07992f41db4f0bcdb931c70\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Rotzbua\n      nested: []\n  version: 1.19.2\n  title: \"\"\n  date: 2023-12-22T12:57:35.441Z\n- commits:\n    - subject: \"patch: update winget-releaser v2\"\n      hash: ea184eb6352b7988c6ab1f439d30c297610cd84e\n      body: \"\"\n      footer: {}\n      author: Vedant\n      nested: []\n  version: 1.19.1\n  title: \"\"\n  date: 2023-12-22T08:12:34.451Z\n- commits:\n    - subject: Use native ARM runner for Apple Silicon builds\n      hash: 01a96bb6de1ff00d20f7784469dd05286069e014\n      body: \"\"\n      footer:\n        Change-type: minor\n        change-type: minor\n      author: Akis Kesoglou\n      nested: []\n    - subject: Calculate and upload build artifact sha256 checksums\n      hash: 2e3a75e685258961bc8efdb95dde12727b93a04a\n      body: \"\"\n      footer:\n        Change-type: minor\n        change-type: minor\n      author: Akis Kesoglou\n      nested: []\n    - subject: Migrate build pipeline to Electron Forge\n      hash: bd33c5b092cb5224c8dfc4d5a2caf4684cee161d\n      body: \"\"\n      footer:\n        Change-type: minor\n        change-type: minor\n      author: Akis Kesoglou\n      nested: []\n  version: 1.19.0\n  title: \"\"\n  date: 2023-12-21T16:41:57.426Z\n- commits:\n    - subject: Remove repo config from flowzone.yml\n      hash: ecb24dad251fbb9b3f92e5b404b66aedd155a584\n      body: |\n        This functionality is being deprecated in Flowzone.\n\n        See: https://github.com/product-os/flowzone/pull/833\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Kyle Harding <kyle@balena.io>\n        signed-off-by: Kyle Harding <kyle@balena.io>\n      author: Kyle Harding\n      nested: []\n    - subject: Update actions/upload-artifact to v4\n      hash: a970f55b555f69c5fcb40374eb50ad7b98cc8f96\n      body: |\n        Also ensure we are generating unique artifact names on upload.\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Kyle Harding <kyle@balena.io>\n        signed-off-by: Kyle Harding <kyle@balena.io>\n        See: https://github.com/product-os/flowzone/pull/827\n        see: https://github.com/product-os/flowzone/pull/827\n      author: Kyle Harding\n      nested: []\n  version: 1.18.14\n  title: \"\"\n  date: 2023-12-20T16:23:00.875Z\n- commits:\n    - subject: \"patch: upgrade to electron 25\"\n      hash: f38bca290fe26121bed58d1131265e1aa350ddb5\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n    - subject: \"patch: refactor scanner, loader and flasher out of gui + upgrade to\n        electron 25\"\n      hash: fb8ed5b529e22bc9e766bfe99c2b6955ed695b58\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 1.18.13\n  title: \"\"\n  date: 2023-10-16T13:32:26.738Z\n- commits:\n    - subject: Update instructions for installing deb file\n      hash: acab03ad77a1c1901d0c8a65999e93c1d27169a0\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Jorge Capona\n      nested: []\n  version: 1.18.12\n  title: \"\"\n  date: 2023-07-19T10:24:22.407Z\n- commits:\n    - subject: \"fix: prevent stealing window focus from auth dialog\"\n      hash: f716c74ef7cb164b4d825828e4e46033484ad9af\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: leadpogrommer\n      nested: []\n  version: 1.18.11\n  title: \"\"\n  date: 2023-07-13T14:31:40.021Z\n- commits:\n    - subject: \"spelling: validates\"\n      hash: 06d246e3fd1c573b9e04d23ab3bc3c4036fb9859\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>\n        signed-off-by: Josh Soref <jsoref@users.noreply.github.com>\n      author: Josh Soref\n      nested: []\n    - subject: \"spelling: undefined\"\n      hash: 67b26a5b69f819066c6419d3d915846b63fdbcf0\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>\n        signed-off-by: Josh Soref <jsoref@users.noreply.github.com>\n      author: Josh Soref\n      nested: []\n    - subject: \"spelling: except if\"\n      hash: b4b9db7ffa2104c19e7bd079e4f394a817f40bc0\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>\n        signed-off-by: Josh Soref <jsoref@users.noreply.github.com>\n      author: Josh Soref\n      nested: []\n  version: 1.18.10\n  title: \"\"\n  date: 2023-07-12T11:21:59.231Z\n- commits:\n    - subject: Fix opening links from within SafeWebView\n      hash: 497bb0e2cbefad3e9a1188ee5df49cf61f6bd6e4\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Akis Kesoglou\n      nested: []\n  version: 1.18.9\n  title: \"\"\n  date: 2023-07-12T09:07:17.666Z\n- commits:\n    - subject: \"Patch: Fix Support link\"\n      hash: 882b385c88111a192e5f37e20c1c8aeca9950b21\n      body: \"\"\n      footer: {}\n      author: Oliver Plummer\n      nested: []\n  version: 1.18.8\n  title: \"\"\n  date: 2023-04-26T09:57:46.155Z\n- commits:\n    - subject: \"patch: update docs to remove cloudsmith install instructions for linux\"\n      hash: 02a406711852cf237e41da4cd39350d8acc1f0b0\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 1.18.7\n  title: \"\"\n  date: 2023-04-25T15:25:35.584Z\n- commits:\n    - subject: add-flash-with-etcher-to-docs\n      hash: 856b426dc98925f5e339976a5cac144f4bb4ea59\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Lizzie Epton\n      nested: []\n  version: 1.18.6\n  title: \"\"\n  date: 2023-03-21T13:24:18.265Z\n- commits:\n    - subject: \"patch: add apt-get update in flowzone preinstall\"\n      hash: 0d9ac710880e6b9413b09e4c35a505034d1e9d51\n      body: libudev package has changed and cannot be installed if we not update apt\n        cache\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 1.18.5\n  title: \"\"\n  date: 2023-03-09T11:30:34.540Z\n- commits:\n    - subject: \"patch: bump etcher-sdk to 8.3.1\"\n      hash: bf0360e7f46ac620f95021e0c48a3a04d302e725\n      body: \"\"\n      footer: {}\n      author: JOASSART Edwin\n      nested: []\n  version: 1.18.4\n  title: \"\"\n  date: 2023-03-02T17:31:31.788Z\n- commits:\n    - subject: fix-typo\n      hash: 496f131c4b024dfcd17fde5173016f70c0d0599c\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Lizzie Epton\n      nested: []\n    - subject: edits-to-info-about-efp\n      hash: f582b0215c2cf66acf652afdaa47353e1a7eac07\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Lizzie Epton\n      nested: []\n    - subject: Add reference to etcher-efp in publishing.md\n      hash: 4c3c4babea5efdadbed7ba0df85f08b68a7b6f20\n      body: |\n        Add reference to etcher-efp in publishing.md\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Edwin Joassart\n      nested: []\n  version: 1.18.3\n  title: \"\"\n  date: 2023-02-22T12:12:40.270Z\n- commits:\n    - subject: \"patch: organize docs\"\n      hash: e479b95d72bed6a50ae6a971598a18d8a7562f0d\n      body: \"\"\n      footer: {}\n      author: mcraa\n      nested: []\n    - subject: \"patch: actualized develop guide\"\n      hash: 926ff2b7549d8b187b18ee452ce48c62f6cd3531\n      body: \"\"\n      footer: {}\n      author: mcraa\n      nested: []\n    - subject: \"patch: updated commit message guide\"\n      hash: 394b64319de11b1010b8acfe160de13a6f3851cd\n      body: \"\"\n      footer: {}\n      author: mcraa\n      nested: []\n    - subject: add-item-from-FAQs\n      hash: 96fa53b6ee4ec7a29522df488b927074c0f301ca\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Lizzie Epton\n      nested: []\n    - subject: \"patch: removed gt characters from contributing guide\"\n      hash: 9b54e2af0b9356bb73e197cccbcc2ff89673361f\n      body: \"\"\n      footer: {}\n      author: mcraa\n      nested: []\n    - subject: \"patch: added docosaurus site name\"\n      hash: b01cf3c2e1c3a7a234c8b957bd570ecdca81e0c1\n      body: \"\"\n      footer: {}\n      author: mcraa\n      nested: []\n  version: 1.18.2\n  title: \"\"\n  date: 2023-02-21T13:17:09.606Z\n- commits:\n    - subject: \"patch: use @electron/remote for locating rpiboot files\"\n      hash: 04fa3dcd8c619dce927221cef5799b5210354d2e\n      body: \"\"\n      footer: {}\n      author: mcraa\n      nested: []\n  version: 1.18.1\n  title: \"\"\n  date: 2023-02-15T14:54:45.951Z\n- commits:\n    - subject: Update to Electron 19\n      hash: c11db0a2797a6b1093dd3fa6f55bee5f100c6da4\n      body: \"\"\n      footer:\n        Change-type: minor\n        change-type: minor\n      author: Akis Kesoglou\n      nested: []\n    - subject: Remove Spectron and related (low-value) tests\n      hash: 6f7570d265e4b457afe832d00e5f45e0bf5a8a53\n      body: >\n        Spectron is long deprecated and abandoned and the browser tests are so\n        rudimentary that it’s no longer worth having them around. We will\n        introduce a proper browser-based test suite in the short term — it’s a\n        project in progress.\n      footer:\n        Change-type: minor\n        change-type: minor\n      author: Akis Kesoglou\n      nested: []\n  version: 1.18.0\n  title: \"\"\n  date: 2023-02-14T18:07:05.870Z\n- commits:\n    - subject: Update to Electron 17 and Node 16\n      hash: 3c1dd6ce29ddf43ef35e58236d25713fa2026c10\n      body: |\n        This is the latest Electron version officially supported by Spectron.\n      footer:\n        Change-type: minor\n        change-type: minor\n      author: Akis Kesoglou\n      nested: []\n  version: 1.17.0\n  title: \"\"\n  date: 2023-02-14T16:18:54.834Z\n- commits:\n    - subject: Update to Electron 14\n      hash: df7854111a901b620e3284edf10768d308ce7755\n      body: \"\"\n      footer:\n        Change-type: minor\n        change-type: minor\n      author: Akis Kesoglou\n      nested: []\n  version: 1.16.0\n  title: \"\"\n  date: 2023-02-14T12:40:40.820Z\n- commits:\n    - subject: \"patch: app: i18n: Translation: Update zh-TW strings * Improve\n        translate. * Sync layout with English strings ts file.\"\n      hash: b51418814f5ef48d09e3157c92bda5eab173dbd5\n      body: \"\"\n      footer:\n        Signed-off-by: Edward Wu <bluehome.wu@gmail.com>\n        signed-off-by: Edward Wu <bluehome.wu@gmail.com>\n      author: Edward Wu\n      nested: []\n  version: 1.15.6\n  title: \"\"\n  date: 2023-02-13T11:23:13.079Z\n- commits:\n    - subject: revert auto-update feature\n      hash: e6d33eda2b8f767679a43f8056e20098b0f2f6d9\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: JOASSART Edwin\n      nested: []\n  version: 1.15.5\n  title: \"\"\n  date: 2023-02-03T14:25:19.611Z\n- commits:\n    - subject: Switch to `@electron/remote`\n      hash: 7ee174edcecbfc2d7370db6d4185b3ee4eedbe28\n      body: >\n        Electron 12 deprecated `electron.remote` and the functionality was\n        removed in Electron 14, but became available as a separate\n        `@electron/remote` module. This commit makes the transition to the\n        external module as an intermediary step to enable updating to a newer\n        Electron version.\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Akis Kesoglou\n      nested: []\n  version: 1.15.4\n  title: \"\"\n  date: 2023-02-02T18:26:45.877Z\n- commits:\n    - subject: move EFP & success-banner to efp.balena.io\n      hash: a140faaebe087a96387604f12c3510ee22374d92\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Edwin Joassart\n      nested: []\n  version: 1.15.3\n  title: \"\"\n  date: 2023-02-02T17:23:16.454Z\n- commits:\n    - subject: Remove configuration remote update\n      hash: 85a49a221fa7fc9b1943dc8ed43b29995f9d8260\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Edwin Joassart\n      nested: []\n  version: 1.15.2\n  title: \"\"\n  date: 2023-02-02T13:05:01.310Z\n- commits:\n    - subject: Remove redundant resinci-deploy build step\n      hash: 48ddafd120cc9cd4fb94c0d6f7530a14be46f28d\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Akis Kesoglou\n      nested: []\n    - subject: Lazily import Electron from child-writer process\n      hash: 851219f835ed037d9fd970f538095e4b339c5342\n      body: >\n        No idea how this *used* to work, but it doesn’t since 887ec428 and this\n        is fixing it properly.\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Akis Kesoglou\n      nested: []\n  version: 1.15.1\n  title: \"\"\n  date: 2023-02-01T12:18:55.922Z\n- commits:\n    - subject: Add support for Node 18\n      hash: 887ec42847acbd4a935b4e9ed6abb2b8d87058ce\n      body: >\n        The Electron version we’re currently using is on Node 14 but this is a\n        step forward to upgrading to a newer Electron and Node version.\n\n\n        Updates etcher-sdk and switches the redundant aws4-axios dependency to\n        just axios.\n\n\n        Also changed bundler to stop trying to bundle wasm files — they must be\n        included inline with JS code as data — and removed some now redundant\n        code.\n\n\n        The crucial changes that enable support are:\n\n\n        1. The update to etcher-sdk@8 where some dependency fixes and updates\n        took place\n\n        2. The downgrade and pinning of \"electron-rebuild\" to v3.2.3 until we’re\n        able to update to Electron >= 14.2. The patch we need to avoid is\n        https://github.com/electron/rebuild/pull/907. Also see:\n        https://github.com/nodejs/node-gyp/issues/2673 and\n        https://github.com/electron/rebuild/issues/913\n\n        3. A rule in webpack.config to ignore `aws-crt` which is a dependency of\n        (ultimately) `aws4-axios` which is used by etcher-sdk and does a runtime\n        check to its availability. We’re not currently using the “assume role”\n        functionality (AFAIU) of aws4-axios and we don’t care that it’s not\n        found, so force webpack to ignore the import. See\n        https://github.com/aws/aws-sdk-js-v3/issues/3025\n      footer:\n        Change-type: minor\n        change-type: minor\n      author: Akis Kesoglou\n      nested: []\n  version: 1.15.0\n  title: \"\"\n  date: 2023-01-27T11:36:32.980Z\n- commits:\n    - subject: \"patch: fixed mac sudo on other languages\"\n      hash: 19d1e093fc2b1588492c9868f7604ee15ab3fd5b\n      body: \"\"\n      footer: {}\n      author: Peter Makra\n      nested: []\n  version: 1.14.3\n  title: \"\"\n  date: 2023-01-19T12:21:02.651Z\n- commits:\n    - subject: \"patch: revert to lockfile v1\"\n      hash: 72af77860bee3685635c9f4db602c2a07e825037\n      body: \"\"\n      footer: {}\n      author: Peter Makra\n      nested: []\n    - subject: \"patch: update etcher-sdk for cm4v5\"\n      hash: 8e63be2efecada2ad6abd9d9d7728859e2c30ebc\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: builder555\n      nested: []\n  version: 1.14.2\n  title: \"\"\n  date: 2023-01-17T14:37:41.555Z\n- commits:\n    - subject: fix disabled-screensaver unhandled exception outside balena-electron env\n      hash: 46c406e8c1e3b5e41890aff7f65b1711e4426782\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Edwin Joassart\n      nested: []\n  version: 1.14.1\n  title: \"\"\n  date: 2023-01-16T13:22:36.972Z\n- commits:\n    - subject: Anonymizes all paths before sending\n      hash: 86d43a536f7c9aa6b450a9f2f90341e07364208e\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Otávio Jacobi\n      nested: []\n    - subject: \"patch: Sentry fix path\"\n      hash: 6c417e35a13873cd95d25f42a819de3750cdf65d\n      body: \"\"\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n    - subject: Remove personal path on etcher\n      hash: 2b728d3c521b76177a2c019b4891627272f35aac\n      body: \"\"\n      footer:\n        Change-type: minor\n        change-type: minor\n      author: Otávio Jacobi\n      nested: []\n    - subject: Unifying sentry reports in a single project\n      hash: f3f7ecb852503d4d97dbe6a78bf920ca177bddd1\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Edwin Joassart\n      nested: []\n    - subject: Removes corvus in favor of sentry and analytics client\n      hash: 41fca03c98d4a72bd8c3842d7e6b9d41f65336f9\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Otavio Jacobi\n        signed-off-by: Otavio Jacobi\n      author: Otávio Jacobi\n      nested: []\n    - subject: Removes corvus in favor of sentry and analytics client\n      hash: 10caf8f1b6a174762192b13ce7bb4eaa71e90fcc\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Otavio Jacobi\n        signed-off-by: Otavio Jacobi\n      author: Otávio Jacobi\n      nested: []\n  version: 1.14.0\n  title: \"\"\n  date: 2023-01-16T11:23:54.866Z\n- commits:\n    - subject: Adding EtcherPro device serial number to the Settings modal\n      hash: d25eda9a7d6bf89284b630b2d55cbb0a7e3a9432\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Aurelien VALADE\n      nested: []\n  version: 1.13.4\n  title: \"\"\n  date: 2023-01-12T15:10:50.328Z\n- commits:\n    - subject: \"patch: progress cm4 to second stage\"\n      hash: 2475d576c7d9ecb46507c47c4143bdbfbdb44e45\n      body: \"\"\n      footer: {}\n      author: Peter Makra\n      nested: []\n  version: 1.13.3\n  title: \"\"\n  date: 2023-01-11T14:30:45.116Z\n- commits:\n    - subject: \"patch: fixed winget parameter name\"\n      hash: 33fe4b2c1abcb7f71f42a4b682f174422cb72a00\n      body: \"\"\n      footer: {}\n      author: mcraa\n      nested: []\n  version: 1.13.2\n  title: \"\"\n  date: 2023-01-02T20:55:58.179Z\n- commits:\n    - subject: \"patch: updated sdk to fix bz2 issue\"\n      hash: f79cb0fac56f6ec86f3a6f9be7035fbf59102253\n      body: \"\"\n      footer: {}\n      author: Peter Makra\n      nested: []\n    - subject: \"patch: update copyright in electron-builder\"\n      hash: ec42892c7cf1d22f4bb2968733ba9dc85e3552c6\n      body: \"\"\n      footer: {}\n      author: JOASSART Edwin\n      nested: []\n  version: 1.13.1\n  title: \"\"\n  date: 2023-01-02T17:26:55.602Z\n- commits:\n    - subject: \"minor: electron version bump\"\n      hash: e3072ac416470cd161309935c2622cc5a3d8d242\n      body: \"\"\n      footer: {}\n      author: Peter Makra\n      nested: []\n    - subject: \"patch: handle ext2fs with webpack\"\n      hash: b59b171e43a170c0ccf84d36ab4ba2db403e25c5\n      body: \"\"\n      footer: {}\n      author: Peter Makra\n      nested: []\n    - subject: \"Patch: update etcher-sdk version to fix CM4 issues\"\n      hash: 36c813714b3ce60e5e85f1889c9bc7eeadb524b4\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: builder555\n      nested: []\n  version: 1.13.0\n  title: \"\"\n  date: 2022-12-28T16:48:12.506Z\n- commits:\n    - subject: Update dependency i18next to 21.10.0\n      hash: b068b847c7ae6456ebd16a5d641ff61d8d074015\n      body: |\n        Update i18next to 21.10.0\n\n        Update i18next from 21.8.14 to 21.10.0\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.12.7\n  title: \"\"\n  date: 2022-12-20T19:35:11.219Z\n- commits:\n    - subject: Update dependency react-i18next to 11.18.6\n      hash: 2e85fb45de3a52e9bf0605e474a550e1af2bb980\n      body: |\n        Update react-i18next to 11.18.6\n\n        Update react-i18next from 11.18.1 to 11.18.6\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.12.6\n  title: \"\"\n  date: 2022-12-20T18:00:03.165Z\n- commits:\n    - subject: \"Patch: made trim setting more readable\"\n      hash: 5c5a7612220b011e6942ac10b7026b7d6513e54f\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: builder555\n      nested: []\n  version: 1.12.5\n  title: \"\"\n  date: 2022-12-20T12:27:33.706Z\n- commits:\n    - subject: \"patch: publish to winget with gh action\"\n      hash: f9c8378d6a96e1c44d0bced0d3227a9930b9fd14\n      body: \"\"\n      footer: {}\n      author: Begula\n      nested: []\n  version: 1.12.4\n  title: \"\"\n  date: 2022-12-19T19:41:59.151Z\n- commits:\n    - subject: \"Patch: replaced plain text with i18n in settings\"\n      hash: 11cea7c926be1bac27df8ab583cbb4b8752a49c5\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: builder555\n      nested: []\n  version: 1.12.3\n  title: \"\"\n  date: 2022-12-19T09:51:52.545Z\n- commits:\n    - subject: Update dependency webpack-dev-server to 4.11.1\n      hash: c9e9d7d109ee103402acea1c7be4bac2f674168a\n      body: |\n        Update webpack-dev-server to 4.11.1\n\n        Update webpack-dev-server from 4.5.0 to 4.11.1\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.12.2\n  title: \"\"\n  date: 2022-12-16T16:59:03.254Z\n- commits:\n    - subject: \"Patch: expose trim ext{2,3,4} setting\"\n      hash: b9a82be29bee61a41f6f6a5ca6043dd8a7bee547\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: builder555\n      nested: []\n  version: 1.12.1\n  title: \"\"\n  date: 2022-12-16T15:02:34.104Z\n- commits:\n    - subject: i18n support and Chinese translation\n      hash: 8fc574f0596f256382523c3b269e647a9aed5747\n      body: \"\"\n      footer:\n        Change-type: minor\n        change-type: minor\n      author: ab77\n      nested: []\n    - subject: \"minor: optimize i18n\"\n      hash: 67d26ff7902c272e8113c9b650382a1dcb0cdde0\n      body: >\n        Optimized several translations.\n\n        This commit itself is only a patch, but as a pull request must have at\n        least one commit with a change-type.\n      footer:\n        Change-Type: minor\n        change-type: minor\n      author: r-q\n      nested: []\n  version: 1.12.0\n  title: \"\"\n  date: 2022-12-14T16:17:31.131Z\n- commits:\n    - subject: Update dependency webpack-cli to 4.10.0\n      hash: 757aa77d897d6266afbf6e7d62ddd0255ea0c926\n      body: |\n        Update webpack-cli to 4.10.0\n\n        Update webpack-cli from 4.2.0 to 4.10.0\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.11.10\n  title: \"\"\n  date: 2022-12-13T02:27:41.593Z\n- commits:\n    - subject: Update dependency webpack to 5.75.0\n      hash: cd67b442c9c55adddb2d8def456d7155af1f23c6\n      body: |\n        Update webpack to 5.75.0\n\n        Update webpack from 5.11.0 to 5.75.0\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.11.9\n  title: \"\"\n  date: 2022-12-12T23:58:09.807Z\n- commits:\n    - subject: Update dependency awscli to 1.27.28\n      hash: 927a026b869e0da872e17a662536d0ad3aeeae0f\n      body: |\n        Update awscli to 1.27.28\n\n        Update awscli from 1.27.27 to 1.27.28\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.11.8\n  title: \"\"\n  date: 2022-12-12T21:55:28.620Z\n- commits:\n    - subject: Update dependency uuid to 8.3.2\n      hash: c9cfb87733a694a69044a3b04cb12e72047a92da\n      body: |\n        Update uuid to 8.3.2\n\n        Update uuid from 8.1.0 to 8.3.2\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.11.7\n  title: \"\"\n  date: 2022-12-12T19:57:31.379Z\n- commits:\n    - subject: Update dependency tslib to 2.4.1\n      hash: f0747abe3fde8df4a004573a3ffd49134dd6d40d\n      body: |\n        Update tslib to 2.4.1\n\n        Update tslib from 2.0.0 to 2.4.1\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n    - subject: \"Patch: run linux build on ubuntu-20.04\"\n      hash: adcd8e0325bc891460b3e51aa5403f8675189f13\n      body: |-\n        as [`18.04` has been removed](https://github.blog/changelog/2022-08-09-github-actions-the-ubuntu-18-04-actions-runner-image-is-being-deprecated-and-will-be-removed-by-12-1-22/)\n\n        We cannot use `latest` as the glibc version will cause issue with older ubuntu version.\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 1.11.6\n  title: \"\"\n  date: 2022-12-12T17:59:43.391Z\n- commits:\n    - subject: Update dependency ts-loader to 8.4.0\n      hash: 5ae9a263619e9bb499705ee7c19df5707ea3936c\n      body: |\n        Update ts-loader to 8.4.0\n\n        Update ts-loader from 8.0.12 to 8.4.0\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.11.5\n  title: \"\"\n  date: 2022-12-10T12:28:18.918Z\n- commits:\n    - subject: Update dependency styled-components to 5.3.6\n      hash: 88c5fa50352efe76a6506ee763915f504889111b\n      body: |\n        Update styled-components to 5.3.6\n\n        Update styled-components from 5.1.0 to 5.3.6\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.11.4\n  title: \"\"\n  date: 2022-12-10T10:57:10.809Z\n- commits:\n    - subject: Update dependency terser-webpack-plugin to 5.3.6\n      hash: c431222909ef49126549c0f630cf1f3f3f8895ed\n      body: |\n        Update terser-webpack-plugin to 5.3.6\n\n        Update terser-webpack-plugin from 5.2.5 to 5.3.6\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.11.3\n  title: \"\"\n  date: 2022-12-10T08:54:53.274Z\n- commits:\n    - subject: Update dependency string-replace-loader to 3.1.0\n      hash: 33f8851083d50ed2db2b1308d1f1cf8749751db5\n      body: |\n        Update string-replace-loader to 3.1.0\n\n        Update string-replace-loader from 3.0.1 to 3.1.0\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.11.2\n  title: \"\"\n  date: 2022-12-10T07:32:25.553Z\n- commits:\n    - subject: Update dependency sinon to 9.2.4\n      hash: 686a5837b69c26bc83772ed738376ce0a766fef5\n      body: |\n        Update sinon to 9.2.4\n\n        Update sinon from 9.0.2 to 9.2.4\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.11.1\n  title: \"\"\n  date: 2022-12-10T06:19:30.932Z\n- commits:\n    - subject: Update dependency shyaml to 0.6.2\n      hash: 2acad790d3e85b3215e692705691fff4fadb99b0\n      body: |\n        Update shyaml to 0.6.2\n\n        Update shyaml from 0.5.0 to 0.6.2\n      footer:\n        Change-type: minor\n        change-type: minor\n      author: Renovate Bot\n      nested: []\n  version: 1.11.0\n  title: \"\"\n  date: 2022-12-10T04:27:19.119Z\n- commits:\n    - subject: Update dependency awscli to 1.27.27\n      hash: 17858a7d72dc001419bf75ac04b1a66b782404e2\n      body: |\n        Update awscli to 1.27.27\n\n        Update awscli from 1.27.26 to 1.27.27\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.10.29\n  title: \"\"\n  date: 2022-12-10T03:05:02.826Z\n- commits:\n    - subject: Update dependency rendition to 19.3.2\n      hash: 0d740ad12dbadcb35d0e2076821a073177476acb\n      body: |\n        Update rendition to 19.3.2\n\n        Update rendition from 19.2.0 to 19.3.2\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested:\n        - commits:\n            - subject: Add Breadcrumbs component export\n              hash: fbe0da641ae76ed99185f5799f94653bbed52609\n              body: |\n                add breadcrumbs component export\n              footer:\n                Change-type: patch\n                change-type: patch\n                Signed-off-by: Andrea Rosci <andrear@balena.io>\n                signed-off-by: Andrea Rosci <andrear@balena.io>\n              author: JSReds\n          version: rendition-19.3.2\n          date: 2020-12-29T17:27:09.528Z\n        - commits:\n            - subject: Fix max-width on breadcrumbs container\n              hash: b7c4ab7bed3caa1c10130f50abb582fcf63d867e\n              body: |\n                fix max-width on breadcrumbs container\n              footer:\n                Change-type: patch\n                change-type: patch\n                Signed-off-by: Andrea Rosci <andrear@balena.io>\n                signed-off-by: Andrea Rosci <andrear@balena.io>\n              author: JSReds\n          version: rendition-19.3.1\n          date: 2020-12-29T13:35:01.615Z\n        - commits:\n            - subject: Add Breadcrumbs component\n              hash: 41a7abb3724a6c8a0a839d4083ce36ceaeeb9d91\n              body: |\n                Add Breadcrumbs component and generate snapshots\n              footer:\n                Change-type: minor\n                change-type: minor\n                Signed-off-by: Andrea Rosci <andrear@balena.io>\n                signed-off-by: Andrea Rosci <andrear@balena.io>\n              author: JSReds\n          version: rendition-19.3.0\n          date: 2020-12-29T12:12:16.944Z\n  version: 1.10.28\n  title: \"\"\n  date: 2022-12-10T02:10:41.368Z\n- commits:\n    - subject: Update dependency redux to 4.2.0\n      hash: 85c183b9ef2dbe798c6d5cd8bce6367ef31e2624\n      body: |\n        Update redux to 4.2.0\n\n        Update redux from 4.0.5 to 4.2.0\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.10.27\n  title: \"\"\n  date: 2022-12-09T20:59:24.075Z\n- commits:\n    - subject: Update dependency pretty-bytes to 5.6.0\n      hash: d8b2a7a2369f24b1390bd85eca3cfbcd8282df80\n      body: |\n        Update pretty-bytes to 5.6.0\n\n        Update pretty-bytes from 5.3.0 to 5.6.0\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.10.26\n  title: \"\"\n  date: 2022-12-09T18:58:21.970Z\n- commits:\n    - subject: Update dependency pnp-webpack-plugin to 1.7.0\n      hash: 86bb093f3d7eec4835060789cc725e172223c74f\n      body: |\n        Update pnp-webpack-plugin to 1.7.0\n\n        Update pnp-webpack-plugin from 1.6.4 to 1.7.0\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.10.25\n  title: \"\"\n  date: 2022-12-09T17:01:52.897Z\n- commits:\n    - subject: Update dependency node-ipc to 9.2.1\n      hash: f26b0748114c7623f152e00b065f3e6ec0657e83\n      body: |\n        Update node-ipc to 9.2.1\n\n        Update node-ipc from 9.1.1 to 9.2.1\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.10.24\n  title: \"\"\n  date: 2022-12-09T14:59:54.907Z\n- commits:\n    - subject: Update dependency mocha to 8.4.0\n      hash: be190c6c802f0cb6f5f68981b255aa4e620db2f7\n      body: |\n        Update mocha to 8.4.0\n\n        Update mocha from 8.0.1 to 8.4.0\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.10.23\n  title: \"\"\n  date: 2022-12-09T13:05:52.859Z\n- commits:\n    - subject: Update dependency mini-css-extract-plugin to 1.6.2\n      hash: d35f3c30498e3a8d8b8eb74a50952489f1c629fc\n      body: |\n        Update mini-css-extract-plugin to 1.6.2\n\n        Update mini-css-extract-plugin from 1.3.3 to 1.6.2\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.10.22\n  title: \"\"\n  date: 2022-12-09T10:57:43.780Z\n- commits:\n    - subject: Update dependency lint-staged to 10.5.4\n      hash: 54e6c5e2c137073e6229fa28726d8f6b08853fcc\n      body: |\n        Update lint-staged to 10.5.4\n\n        Update lint-staged from 10.2.2 to 10.5.4\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.10.21\n  title: \"\"\n  date: 2022-12-09T08:57:59.766Z\n- commits:\n    - subject: Update dependency husky to 4.3.8\n      hash: cf8b5790a1e9cf853328f128f9c52d72d5ac1da5\n      body: |\n        Update husky to 4.3.8\n\n        Update husky from 4.2.5 to 4.3.8\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.10.20\n  title: \"\"\n  date: 2022-12-09T06:59:31.264Z\n- commits:\n    - subject: Update dependency esbuild-loader to 2.20.0\n      hash: ba812b4f6484f0803486f7c1969992030267ae12\n      body: |\n        Update esbuild-loader to 2.20.0\n\n        Update esbuild-loader from 2.16.0 to 2.20.0\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.10.19\n  title: \"\"\n  date: 2022-12-09T04:58:48.480Z\n- commits:\n    - subject: Update dependency electron-updater to 4.6.5\n      hash: 32011c0deab646af1c4d99c15418f336f1dc02f1\n      body: |\n        Update electron-updater to 4.6.5\n\n        Update electron-updater from 4.3.5 to 4.6.5\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.10.18\n  title: \"\"\n  date: 2022-12-09T03:07:57.710Z\n- commits:\n    - subject: Update dependency electron-notarize to 1.2.2\n      hash: d68eab1dda78e17ce3804e6c7f08940b36f377a8\n      body: |\n        Update electron-notarize to 1.2.2\n\n        Update electron-notarize from 1.0.0 to 1.2.2\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.10.17\n  title: \"\"\n  date: 2022-12-09T01:21:25.322Z\n- commits:\n    - subject: Update dependency awscli to 1.27.26\n      hash: b5ab500a14396525cb6c7bac4eabf0b4b1c7cb11\n      body: |\n        Update awscli to 1.27.26\n\n        Update awscli from 1.27.25 to 1.27.26\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.10.16\n  title: \"\"\n  date: 2022-12-08T22:58:41.740Z\n- commits:\n    - subject: Update dependency electron-builder to 22.14.13\n      hash: 99862b95a55a3a7a174763d635073bab5dbc704f\n      body: |\n        Update electron-builder to 22.14.13\n\n        Update electron-builder from 22.10.5 to 22.14.13\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.10.15\n  title: \"\"\n  date: 2022-12-08T21:37:01.110Z\n- commits:\n    - subject: Update dependency debug to 4.3.4\n      hash: b8af86e30c9ce3b8d9eba8749f2aeba1f6eea197\n      body: |\n        Update debug to 4.3.4\n\n        Update debug from 4.2.0 to 4.3.4\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.10.14\n  title: \"\"\n  date: 2022-12-08T19:55:06.173Z\n- commits:\n    - subject: Update dependency awscli to 1.27.25\n      hash: 0667d1110fbc05ef7222530ea413a1db7a2bd814\n      body: |\n        Update awscli to 1.27.25\n\n        Update awscli from 1.27.24 to 1.27.25\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.10.13\n  title: \"\"\n  date: 2022-12-08T17:57:06.474Z\n- commits:\n    - subject: Update dependency css-loader to 5.2.7\n      hash: 6991a4950bfb2b7c9ad93df4c76170003b7d47f0\n      body: |\n        Update css-loader to 5.2.7\n\n        Update css-loader from 5.0.1 to 5.2.7\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.10.12\n  title: \"\"\n  date: 2022-12-08T15:56:12.526Z\n- commits:\n    - subject: Update dependency awscli to 1.27.24\n      hash: 72b4d4f4fa5a013d9a808402660186a92b165bc7\n      body: |\n        Update awscli to 1.27.24\n\n        Update awscli from 1.27.5 to 1.27.24\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.10.11\n  title: \"\"\n  date: 2022-12-07T03:21:58.354Z\n- commits:\n    - subject: Update dependency @types/node to 14.18.34\n      hash: aa3756ad172e939dff88ad213fda2b57966341c6\n      body: |\n        Update @types/node to 14.18.34\n\n        Update @types/node from 14.18.33 to 14.18.34\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.10.10\n  title: \"\"\n  date: 2022-12-07T02:19:17.414Z\n- commits:\n    - subject: Enable repository configuration\n      hash: 0d5bb4935f860a5b7f58810fce8084dc8f82dd65\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: ab77\n      nested: []\n  version: 1.10.9\n  title: \"\"\n  date: 2022-12-06T23:59:21.301Z\n- commits:\n    - subject: Update dependency chai to 4.3.7\n      hash: 4ed30027162365a68f26264f7574ac9eaf752926\n      body: |\n        Update chai to 4.3.7\n\n        Update chai from 4.2.0 to 4.3.7\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.10.8\n  title: \"\"\n  date: 2022-12-05T21:38:41.964Z\n- commits:\n    - subject: Use core workflow for GitHub publish\n      hash: f3844d56e2bb317e9360f34f5054c91eb0fb8910\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: ab77\n      nested: []\n  version: 1.10.7\n  title: \"\"\n  date: 2022-12-05T19:39:07.247Z\n- commits:\n    - subject: Dummy update to fix asset version issue\n      hash: 03d6a011db5fd4dad3d25fde86cf2b434c8192e8\n      body: |\n        Due to a race between two patch, 1.10.5 assets are labelled 1.10.3.\n        This dummy PR should fix this.\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Edwin Joassart\n      nested: []\n  version: 1.10.6\n  title: \"\"\n  date: 2022-12-02T14:04:57.766Z\n- commits:\n    - subject: \"Patch: run linux build on ubuntu-18.04\"\n      hash: 57a6ceff0e28d06063679a7a8b14671416ba46c5\n      body: >-\n        Running on ubuntu-latest means you need a more recent version of glibc\n        which breaks on older ubuntu.\n\n\n        Thanks to @theofficialgman for suggesting the fix.\n      footer: {}\n      author: Edwin Joassart\n      nested: []\n  version: 1.10.5\n  title: \"\"\n  date: 2022-12-02T12:41:19.841Z\n- commits:\n    - subject: \"patch: remove Homebrew instructions in README\"\n      hash: 0d1cfffa5c7c084d9f48d60c1abbf7e2974abb28\n      body: |\n        Homebrew no longer supports etcher, so removing install instructions.\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Patrick Linnane\n      nested: []\n  version: 1.10.4\n  title: \"\"\n  date: 2022-12-01T23:27:55.910Z\n- commits:\n    - subject: Allow external contributors\n      hash: 156b9314b5786e943256974d5344383ae1f0650d\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: ab77\n      nested: []\n  version: 1.10.3\n  title: \"\"\n  date: 2022-12-01T22:31:25.592Z\n- commits:\n    - subject: Fix missing analytics token\n      hash: 831339bd2cbe73dd441cdd77d85b34e98f68a6a6\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Edwin Joassart edwin.joassart@balena.io\n        signed-off-by: Edwin Joassart edwin.joassart@balena.io\n      author: Edwin Joassart\n      nested: []\n  version: 1.10.2\n  title: \"\"\n  date: 2022-11-25T19:22:49.679Z\n- commits:\n    - subject: Fixing call to electron block screensaver methods invocation\n      hash: 1b5b64713505dfb69448bc2184839b4c23bd677b\n      body: >\n        Replacing `send` calls to `invoke` for `enable/disable-screensaver`\n        calls.\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Aurelien VALADE <aurelien.valade@balena.io>\n        signed-off-by: Aurelien VALADE <aurelien.valade@balena.io>\n      author: Aurelien VALADE\n      nested: []\n  version: 1.10.1\n  title: \"\"\n  date: 2022-11-21T16:50:14.797Z\n- commits:\n    - subject: testing renovate\n      hash: 306e087ec6daed9e736a8918cde07159dd9298dc\n      body: \"\"\n      footer:\n        Change-Type: minor\n        change-type: minor\n      author: builder555\n      nested: []\n  version: 1.10.0\n  title: \"\"\n  date: 2022-11-10T20:54:12.345Z\n- commits:\n    - subject: Update dependency awscli to 1.27.5\n      hash: 26dc2d19e56354b0f43c9af2f1d6dd51a4a0b235\n      body: |\n        Update awscli to 1.27.5\n\n        Update awscli from 1.11.87 to 1.27.5\n      footer:\n        Change-type: minor\n        change-type: minor\n      author: Renovate Bot\n      nested: []\n  version: 1.9.0\n  title: \"\"\n  date: 2022-11-08T21:37:25.500Z\n- commits:\n    - subject: Update dependency @types/react-dom to 16.9.17\n      hash: 448ce141d51ec342e95148f265daf0fc73df694c\n      body: |\n        Update @types/react-dom to 16.9.17\n\n        Update @types/react-dom from 16.8.4 to 16.9.17\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.8.17\n  title: \"\"\n  date: 2022-11-08T20:38:27.629Z\n- commits:\n    - subject: Update dependency @types/react to 16.14.34\n      hash: 77b33b127dcfb0345e0ff80c80b2f560984c14b1\n      body: |\n        Update @types/react to 16.14.34\n\n        Update @types/react from 16.8.5 to 16.14.34\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.8.16\n  title: \"\"\n  date: 2022-11-08T19:39:42.616Z\n- commits:\n    - subject: \"CI: generalise artefact handling\"\n      hash: e3618b939e119b8ae6d0dcea0f4077fe2c332122\n      body: |\n        * on PR syncs, delete draft releases on Linux runners only\n        * delete draft releases when unmerged PRs are closed\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: ab77\n      nested: []\n  version: 1.8.15\n  title: \"\"\n  date: 2022-11-08T18:21:04.227Z\n- commits:\n    - subject: Update dependency @types/node to 14.18.33\n      hash: 7e2c2eae635e6d9aef1e65b158268400074ff020\n      body: |\n        Update @types/node to 14.18.33\n\n        Update @types/node from 14.14.41 to 14.18.33\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.8.14\n  title: \"\"\n  date: 2022-11-08T13:57:18.149Z\n- commits:\n    - subject: Update dependency @types/copy-webpack-plugin to 6.4.3\n      hash: 2c2a5c7c2b31d188cc32024dd6f9b5d0d1a5bc8b\n      body: |\n        Update @types/copy-webpack-plugin to 6.4.3\n\n        Update @types/copy-webpack-plugin from 6.0.0 to 6.4.3\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.8.13\n  title: \"\"\n  date: 2022-11-08T12:39:27.293Z\n- commits:\n    - subject: Update dependency @fortawesome/fontawesome-free to 5.15.4\n      hash: 7bb52aa1706b4bfe06cdd023f4f95bf8de1a6666\n      body: |\n        Update @fortawesome/fontawesome-free to 5.15.4\n\n        Update @fortawesome/fontawesome-free from 5.13.1 to 5.15.4\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.8.12\n  title: \"\"\n  date: 2022-11-08T11:33:01.286Z\n- commits:\n    - subject: Update dependency @balena/lint to 5.4.2\n      hash: cc0285a77db78a014b73169cc8a6b2429961f41f\n      body: |\n        Update @balena/lint to 5.4.2\n\n        Update @balena/lint from 5.3.0 to 5.4.2\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.8.11\n  title: \"\"\n  date: 2022-11-08T10:38:47.026Z\n- commits:\n    - subject: Update dependency sys-class-rgb-led to 3.0.1\n      hash: 0e58edf1139b16b26335f7b6f7b2e6f92c8c8838\n      body: |\n        Update sys-class-rgb-led to 3.0.1\n\n        Update sys-class-rgb-led from 3.0.0 to 3.0.1\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested:\n        - commits:\n            - subject: \"patch: Delete Codeowners\"\n              hash: 91e33b39ac7c55b1186887b20703e3298f37751c\n              body: \"\"\n              footer: {}\n              author: Vipul Gupta\n          version: sys-class-rgb-led-3.0.1\n          date: 2021-07-01T10:53:00.610Z\n  version: 1.8.10\n  title: \"\"\n  date: 2022-11-08T09:35:02.677Z\n- commits:\n    - subject: Update dependency semver to 7.3.8\n      hash: 8357cc19d258103bc66061467ac984b1adae6456\n      body: |\n        Update semver to 7.3.8\n\n        Update semver from 7.3.2 to 7.3.8\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.8.9\n  title: \"\"\n  date: 2022-11-08T08:40:21.355Z\n- commits:\n    - subject: Update dependency omit-deep-lodash to 1.1.7\n      hash: a4f944e7959431f24b55c44dbcde2b13530cf902\n      body: |\n        Update omit-deep-lodash to 1.1.7\n\n        Update omit-deep-lodash from 1.1.4 to 1.1.7\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.8.8\n  title: \"\"\n  date: 2022-11-08T07:33:36.421Z\n- commits:\n    - subject: Update dependency immutable to 3.8.2\n      hash: 330df325f9b2eb855c6213f91cdb0d4cf1439525\n      body: |\n        Update immutable to 3.8.2\n\n        Update immutable from 3.8.1 to 3.8.2\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.8.7\n  title: \"\"\n  date: 2022-11-08T06:19:12.271Z\n- commits:\n    - subject: Update dependency electron-rebuild to 3.2.9\n      hash: 3dc54405feebce319bb29933f9bad52621067f0a\n      body: |\n        Update electron-rebuild to 3.2.9\n\n        Update electron-rebuild from 3.2.5 to 3.2.9\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.8.6\n  title: \"\"\n  date: 2022-11-08T05:18:29.447Z\n- commits:\n    - subject: Update dependency electron-mocha to 9.3.3\n      hash: 1b93891ed805d2a091a3d4eaff6a00a498de6eaa\n      body: |\n        Update electron-mocha to 9.3.3\n\n        Update electron-mocha from 9.3.2 to 9.3.3\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.8.5\n  title: \"\"\n  date: 2022-11-08T04:22:23.418Z\n- commits:\n    - subject: Update dependency @types/webpack-node-externals to 2.5.3\n      hash: ea5a167f4f3eb81a177ebd5c9c3def2e38a65f37\n      body: |\n        Update @types/webpack-node-externals to 2.5.3\n\n        Update @types/webpack-node-externals from 2.5.0 to 2.5.3\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.8.4\n  title: \"\"\n  date: 2022-11-08T02:41:36.635Z\n- commits:\n    - subject: Update dependency @types/tmp to 0.2.3\n      hash: 98a5ddf58ad762d46d532310100513834c6d68b5\n      body: |\n        Update @types/tmp to 0.2.3\n\n        Update @types/tmp from 0.2.0 to 0.2.3\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.8.3\n  title: \"\"\n  date: 2022-11-08T01:36:34.632Z\n- commits:\n    - subject: Generate release notes with git\n      hash: a61aa8e2bec57281655eb1c89c956fd5d42d3fc5\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: ab77\n      nested: []\n  version: 1.8.2\n  title: \"\"\n  date: 2022-11-08T00:19:25.825Z\n- commits:\n    - subject: Update dependency @types/mime-types to 2.1.1\n      hash: fe09f9f862d2eef79a237986c50e587b232d9c2d\n      body: |\n        Update @types/mime-types to 2.1.1\n\n        Update @types/mime-types from 2.1.0 to 2.1.1\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.8.1\n  title: \"\"\n  date: 2022-11-07T23:35:26.671Z\n- commits:\n    - subject: Update scripts/resin digest to 652fdd4\n      hash: 16422971012d77dc928c9d99c3db6b1a58cd52be\n      body: |\n        Update scripts/resin to\n\n        Update scripts/resin from  to\n      footer:\n        Change-type: minor\n        change-type: minor\n      author: Renovate Bot\n      nested: []\n  version: 1.8.0\n  title: \"\"\n  date: 2022-11-07T22:27:03.928Z\n- commits:\n    - subject: Build targets individually\n      hash: b58249b9c833763ec80402820b2c93c01fafda22\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: ab77\n      nested: []\n  version: 1.7.15\n  title: \"\"\n  date: 2022-11-07T21:36:35.993Z\n- commits:\n    - subject: Update dependency lodash to 4.17.21 [SECURITY]\n      hash: f356e4c303080eefdf74f52c2b4de227d20e4e49\n      body: |\n        Update lodash to 4.17.21\n\n        Update lodash from 4.17.10 to 4.17.21\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Renovate Bot\n      nested: []\n  version: 1.7.14\n  title: \"\"\n  date: 2022-11-07T20:17:53.572Z\n- commits:\n    - subject: Update release notes on finalize\n      hash: 576113febfe000339545c0fd55793aafd2e53abb\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: ab77\n      nested: []\n  version: 1.7.13\n  title: \"\"\n  date: 2022-11-07T19:17:06.571Z\n- commits:\n    - subject: Avoid duplicate releases\n      hash: 33dea6267fbcc3cd47b1744830731c853ebbba18\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: ab77\n      nested: []\n  version: 1.7.12\n  title: \"\"\n  date: 2022-11-07T18:32:19.617Z\n- commits:\n    - subject: Only run finalize on Linux runners\n      hash: 9ab307df4f4f617adac33c6a36f492229050bb0e\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: ab77\n      nested: []\n  version: 1.7.11\n  title: \"\"\n  date: 2022-11-07T17:32:25.787Z\n- commits:\n    - subject: Switch to Flowzone\n      hash: 2e53feb38cd548bd2fe68957797bffe66b832eaf\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: ab77\n      nested: []\n  version: 1.7.10\n  title: \"\"\n  date: 2022-11-07T15:59:41.308Z\n- commits:\n    - subject: \"patch: update allowed extensions to include deb afterinstall in build\"\n      hash: 61610ded842caba47c6a682afcb08aa0fda4e86b\n      body: \"\"\n      footer: {}\n      author: mcraa\n      nested: []\n    - subject: \"patch: add update notification\"\n      hash: c87a132f40b41c28d2375c7489d66ad4a6914355\n      body: \"\"\n      footer: {}\n      author: Peter Makra\n      nested: []\n    - subject: \"patch: fix usb-device-boot link in README\"\n      hash: 350d4de32ba0739b0ad1c2dc0b0b98eecf41f8f9\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Andrew Scheller\n      nested: []\n    - subject: Fix application directory for Debian postinst script\n      hash: f5f9025d6db248a8774ff6c9bb9d2afebda6cc3b\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Ken Bannister <kb2ma@runbox.com>\n        signed-off-by: Ken Bannister <kb2ma@runbox.com>\n      author: Ken Bannister\n      nested: []\n  version: 1.7.9\n  title: \"'patch: deb afterinstall and readme updates'\"\n  date: 2022-04-22T13:10:47.137Z\n- commits:\n    - subject: \"patch: complete suse uninstall readme\"\n      hash: 8370f638b4e92a4c981f79362ba0d0700f9f94a1\n      body: \"\"\n      footer:\n        Change-Type: patch\n        change-type: patch\n      author: Peter Makra\n      nested: []\n    - subject: \"patch: completed suse instructions\"\n      hash: ac34c511251f195fd37baf24d1c150a309210c9e\n      body: \"\"\n      footer:\n        Change-Type: patch\n        change-type: patch\n      author: Peter Makra\n      nested: []\n    - subject: \"patch: order rpm instrictions\"\n      hash: b241470fe1bae57e70888b84bb066855363a350b\n      body: \"\"\n      footer:\n        Change-Type: patch\n        change-type: patch\n      author: Peter Makra\n      nested: []\n    - subject: \"patch: enabled update notification for version 1.7.8\"\n      hash: 335766ed12901d6b8b16860d449eca4ea574f9c1\n      body: \"\"\n      footer:\n        Change-Type: patch\n        change-type: patch\n      author: Peter Makra\n      nested: []\n    - subject: \"patch: updated title to balenaEtcher\"\n      hash: 4c5d052a7185ecd598a12d80d2bd7afd5ced7c92\n      body: |\n        fixes #3592\n      footer:\n        Change-Type: patch\n        change-type: patch\n      author: Peter Makra\n      nested: []\n    - subject: \"patch: cleanup and organize readme\"\n      hash: 86423342a86a9327545099eb9df47236d0ac6aef\n      body: \"\"\n      footer:\n        Change-Type: patch\n        change-type: patch\n      author: Peter Makra\n      nested: []\n    - subject: \"patch: extend cloudsmith attribution in readme\"\n      hash: d8b41552e34faf71bbd128f3857667f8f341a217\n      body: \"\"\n      footer:\n        Change-Type: patch\n        change-type: patch\n      author: Peter Makra\n      nested: []\n    - subject: Update macOS Icon to Big Sur Style\n      hash: 11c65fb392416027158918f77bde68dd8996187c\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Logicer\n      nested: []\n  version: 1.7.8\n  title: \"'small ui updates'\"\n  date: 2022-03-18T10:39:52.131Z\n- commits:\n    - subject: \"patch: clarified update check\"\n      hash: a5201942b8817cc1d74fba0ae2c8378632d16fc5\n      body: \"\"\n      footer: {}\n      author: Peter Makra\n      nested: []\n    - subject: \"patch: autoupdate stagingPercentage check, include default\"\n      hash: c1f7164273ffff5d2d5e6aadc1defcd9b0acbecb\n      body: \"\"\n      footer:\n        Change-Type: patch\n        change-type: patch\n      author: Peter Makra\n      nested: []\n  version: 1.7.7\n  title: \"'patch: Fix auto update'\"\n  date: 2022-02-22T08:57:27.982Z\n- commits:\n    - subject: \"patch: version number notification\"\n      hash: 35868509af3461f5bc312990d184d88eae476c4f\n      body: \"\"\n      footer: {}\n      author: Peter Makra\n      nested: []\n    - subject: \"patch: fixed typos in template\"\n      hash: 4366bb372f3c273ccce99dc61b1ced905c591004\n      body: \"\"\n      footer: {}\n      author: Peter Makra\n      nested: []\n    - subject: \"patch: add requirements and help to issue template\"\n      hash: e4d02bc561c359ace94a2c461310ef0dc44b2ca1\n      body: \"\"\n      footer: {}\n      author: mcraa\n      nested: []\n    - subject: \"patch: add requirements and help to issue template\"\n      hash: b9e54e39f7f95aa64e2b12474936c3ce880b661f\n      body: \"\"\n      footer: {}\n      author: mcraa\n      nested: []\n  version: 1.7.6\n  title: \"'patch: add requirements and help to issue template'\"\n  date: 2022-02-21T15:40:15.306Z\n- commits:\n    - subject: \"patch: fix flashing from URL when using basic auth\"\n      hash: a6f6cd4a19b25c26cbc36386719186a7e3c31fea\n      body: \"\"\n      footer: {}\n      author: Marco Füllemann\n      nested: []\n  version: 1.7.5\n  title: \"'patch: fix flashing from URL when using basic auth'\"\n  date: 2022-02-21T12:39:38.276Z\n- commits:\n    - subject: \"patch: set version update notification 1.7.3\"\n      hash: 28adc34239f9abc7ccfe13f2810991ca0f17a645\n      body: \"\"\n      footer: {}\n      author: Peter Makra\n      nested: []\n    - subject: \"patch: updated electron to 12.2.3\"\n      hash: 59f54e194bd19c5e77b797039141be65371b376c\n      body: \"\"\n      footer:\n        Change-Type: patch\n        change-type: patch\n      author: Peter Makra\n      nested: []\n    - subject: \"patch: updated electron to 12.2.3\"\n      hash: c4834e61a7058d91d9a17960acb16365591a17fd\n      body: \"\"\n      footer:\n        Change-Type: patch\n        change-type: patch\n      author: Peter Makra\n      nested: []\n  version: 1.7.4\n  title: \"'patch: updated electron to 12.2.3'\"\n  date: 2022-02-21T08:33:45.382Z\n- commits:\n    - subject: \"patch: fix mesage of null\"\n      hash: 9c1b55bebc1f7777ee830886c1999a72f082c17f\n      body: \"\"\n      footer:\n        Change-Type: patch\n        change-type: patch\n      author: Peter Makra\n      nested: []\n  version: 1.7.3\n  date: 2021-12-29T14:31:13.283Z\n- commits:\n    - subject: \"patch: fixed open from browser on windows\"\n      hash: ef90d048ca2fc9e3eb7731b4b5eff63c3f0ee00a\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Peter Makra <peter@balena.io>\n        signed-off-by: Peter Makra <peter@balena.io>\n      author: Peter Makra\n      nested: []\n  version: 1.7.2\n  date: 2021-12-21T16:51:12.194Z\n- commits:\n    - subject: \"patch: Revert back to electron-rebuild\"\n      hash: ea9875ddf06b932b22b5b26d64fed6fe4f02384e\n      body: \"\"\n      footer:\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n    - subject: \"patch: Disallow TS in JS\"\n      hash: 65dacd2ff282864b82283b7f8251ef9fa548ed3f\n      body: \"\"\n      footer:\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n    - subject: \"patch: Remove esInterop TS flag\"\n      hash: a190818827e2354f9ff13d04017541c1fae6cd47\n      body: \"\"\n      footer:\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n    - subject: \"patch: Use @balena/sudo-prompt\"\n      hash: 98e33b619be70348429038b5d04e49a840c8f218\n      body: \"\"\n      footer:\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n    - subject: \"patch: Update rpiboot guide link\"\n      hash: 685ed715ac85495343a82e5d7886ad826fe2cdfe\n      body: \"\"\n      footer:\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n    - subject: \"patch: Improve webpack build time\"\n      hash: 3cf3c4b398fb65cb4ca59cbf8c3798492197f622\n      body: \"\"\n      footer:\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n  version: 1.7.1\n  date: 2021-11-22T11:27:50.714Z\n- commits:\n    - subject: \"patch: Add missing @types/react@16.8.5\"\n      hash: 0a28af5c35a5c73cd78a729bfd8f4bb7978d7c1a\n      body: \"\"\n      footer:\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n    - subject: \"patch: Use npm ci in Makefile\"\n      hash: 0c1e5b88ef01465ee84712560971af31c3f630ca\n      body: \"\"\n      footer:\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n    - subject: \"patch: Add draft info boxes for system information\"\n      hash: 790201be90e63a3e93c64060bacd977e52dfb4ff\n      body: \"\"\n      footer:\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n    - subject: \"patch: Remove electron-rebuild package\"\n      hash: d8d379f05e8adc4fb3df6b5f926d3ff548bed0bc\n      body: \"\"\n      footer:\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n    - subject: \"patch: Make electron a dev. dependency\"\n      hash: b5e9701048eebd4f8a56157cad8bdc966e354a32\n      body: \"\"\n      footer:\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n    - subject: \"patch: Remove electron-rebuild package\"\n      hash: 292f86d6f5b0e8dd34cb3dd6e008517f9a066cd0\n      body: \"\"\n      footer:\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n    - subject: \"patch: Use exact modules versions\"\n      hash: 76ca9934c808ec013dcad2b427b21f253c588d8d\n      body: \"\"\n      footer:\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n    - subject: \"patch: Update etcher-sdk from v6.2.5 to v6.3.0\"\n      hash: 37b826ee4ee47bda5285083c2184b7e6bf2a6a3b\n      body: \"\"\n      footer:\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n    - subject: Fix write step for Http file process\n      hash: 1e1bd3c508197f0e129715d5e37d1bc06744089b\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Andrea Rosci <andrear@balena.io>\n        signed-off-by: Andrea Rosci <andrear@balena.io>\n      author: JSReds\n      nested: []\n    - subject: \"patch: Fix linting errors\"\n      hash: 00e8f11913eb9eaadb09909cc530693aac825e9f\n      body: \"\"\n      footer:\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n    - subject: \"minor: Refactor dependencies installation to avoid custom scripts\"\n      hash: a3c24a26a05d1c3a767bf7f515cc7f193c9d8e2b\n      body: \"\"\n      footer:\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n    - subject: \"patch: Fix LEDs init error\"\n      hash: 4232928ad894fed548290054b09e25e60fa9eda3\n      body: \"\"\n      footer:\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n  version: 1.7.0\n  date: 2021-11-09T13:13:32.580Z\n- commits:\n    - subject: Add support for basic auth when downloading images from URL.\n      hash: b2d0c1c9ddbbfe87d5a905d420d615821610e825\n      body: >\n        When selecting \"Flash from URL\" the user can optionally provide a\n        username and password for basic authentication. The authentication input\n        fields are collapsed by default. When the authentication input fields\n        are collapsed after entering values the values are cleared to ensure\n        that the user sees all parameter passed to the server.\n      footer:\n        Change-Type: minor\n        change-type: minor\n        Changelog-Entry: Add support for basic auth when downloading images from URL.\n        changelog-entry: Add support for basic auth when downloading images from URL.\n      author: Marco Füllemann\n      nested: []\n    - subject: \"patch: Update etcher-sdk from v6.2.1 to v6.2.5\"\n      hash: 14d91400a425617ee87e0d64f55980bd378fbfc2\n      body: \"\"\n      footer:\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n    - subject: Update Makefile to Apple M1 info\n      hash: d0114aece7df213e27a84cb0081ba6cedd541bcb\n      body: |\n        Expanding host architecture detection.\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: David Gaspar\n      nested: []\n    - subject: Add LED settings for potentially different hardware\n      hash: dff2df4aab73a26fb90401869bfd58035dc652a9\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n  version: 1.6.0\n  date: 2021-09-20T10:42:04.677Z\n- commits:\n    - subject: Restore image file selection LED-drive pathing\n      hash: f46963b6b3176395acc07863c9936a7c7f31d31a\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n    - subject: Update scripts submodule\n      hash: b97f4e0031d7c4d0f33be9fdb8c999631f9eef1d\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n    - subject: Change LEDs colours\n      hash: e2d233d74b6335fd53a9271a9c00c3f93828c5b5\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n    - subject: Windows images now show the proper warning again\n      hash: a7ca2e527bc0cc040711ee4d60f93eda35f17558\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n        Changelog-entry: Windows images now show the proper warning again\n        changelog-entry: Windows images now show the proper warning again\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n    - subject: Fix Update and install with DNF instructions\n      hash: 396a053c0a0ec8def4b3672509cbb4ecc0b0c784\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Mohamed Salah\n      nested: []\n    - subject: Add possibile authorization as a query param\n      hash: d1a3f1cb88ff38f804caa9289d3205b09666c1e6\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Andrea Rosci <andrear@balena.io>\n        signed-off-by: Andrea Rosci <andrear@balena.io>\n      author: JSReds\n      nested: []\n    - subject: update the windows part\n      hash: 9f96558cdd11ce83dcc08289c31da425063eab24\n      body: |\n        I choose to add this part because, after the clean the usb stick\n        could stay in a raw state without creating the new partions,\n        activating and formatting.\n        Thanks\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Xtraim\n      nested: []\n    - subject: Update SUPPORT.md\n      hash: b3bc589d70cc4498a13f86f7d9aa36d9908275e3\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: thambu1710\n      nested: []\n    - subject: replace make webpack with npm run webpack\n      hash: 18d2c28110c8b4b4c327a58f6f6a712c33dfd4cc\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Seth Falco\n      nested: []\n    - subject: Add loader on image select\n      hash: b272ef296dec9b4242028202e1d759f1e2d1aa2b\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Andrea Rosci <andrear@balena.io>\n        signed-off-by: Andrea Rosci <andrear@balena.io>\n      author: JSReds\n      nested: []\n    - subject: add pnp-webpack-plugin\n      hash: 32ca28a3a95d2ffd3eb2b32cfc54113515ae3097\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Zane Hitchcox\n      nested: []\n    - subject: Remove redundant codespell dependency/tests\n      hash: 4d5e5a3b0b81cbdd3341abbcca0c816bc905a8ed\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n  version: 1.5.122\n  date: 2021-09-02T12:20:22.871Z\n- commits:\n    - subject: \"patch: Delete Codeowners\"\n      hash: a81b552b95f93a8989a6fff4774a14e21abe9a0e\n      body: \"\"\n      footer: {}\n      author: Vipul Gupta\n      nested: []\n    - subject: Add source maps for devtools\n      hash: 53f53c0f75779e814834e2fd0375b705664190c5\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n    - subject: Clone submodules when initializing modules\n      hash: fdaf5c69d6bd20b64b1c1749b62dec9c22f12fb4\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n    - subject: \"patch: Select drive on list interaction rather than modal closing\"\n      hash: 061afca5d3ce7dbf67d66706e6c2c65ecd61cf7b\n      body: \"\"\n      footer:\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n  version: 1.5.121\n  date: 2021-07-05T18:20:04.735Z\n- commits:\n    - subject: Update README to reference Cloudsmith\n      hash: 7e333caaf9d94ff90583fe897ccabb6fdf860f74\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n  version: 1.5.120\n  date: 2021-05-11T16:04:28.710Z\n- commits:\n    - subject: Update readme for new PPA provider\n      hash: 250aed2eb1911a6302a80bd7e9f4488c96787ee0\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n        Signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      author: Lorenzo Alberto Maria Ambrosi\n      nested: []\n  version: 1.5.119\n  date: 2021-04-30T21:33:09.009Z\n- commits:\n    - subject: \"patch: development environment\"\n      hash: 1ee110bc9587ecdc672b5b9cf8373e78c04943a1\n      body: >-\n        Add webpack dev server and hot module reloading to get live changes and\n        reloads without reloading the whole electron app.\n\n\n        This patch also runs the development environment in development mode,\n        which is much, much faster on builds and rebuilds.\n      footer: {}\n      author: Zane Hitchcox\n      nested: []\n    - subject: \"patch: watch files for electron\"\n      hash: 33dd07c6751e5ca84b5e7d78027e2e9fec1e7b0e\n      body: \"\"\n      footer: {}\n      author: Zane Hitchcox\n      nested: []\n  version: 1.5.118\n  date: 2021-04-27T01:21:31.707Z\n- commits:\n    - subject: Rename mac releases (keep old naming)\n      hash: 0bdea5c54ca1465d89c73cd269e60ebb24c79f0f\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested: []\n    - subject: Disable spectron tests on macOS\n      hash: 3be372d49fd0a24bd67086d4a523ed831a828d4b\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested: []\n    - subject: Update electron to v12.0.2\n      hash: d0c66b2c4844540c90440f2baea9819dc136a16b\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested: []\n    - subject: Update etcher-sdk from 6.1.1 to 6.2.1\n      hash: 65082c4790c1109077aecae1a5f48def4db03e0c\n      body: |\n        Update etcher-sdk from 6.1.1 to 6.2.1\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested:\n        - commits:\n            - subject: Update node-raspberrypi-usbboot from 0.2.11 to 0.3.0\n              hash: de39ec278ff397d1f69bcb4db968486ce59b33b2\n              body: |\n                Update node-raspberrypi-usbboot from 0.2.11 to 0.3.0\n              footer:\n                Change-type: patch\n                change-type: patch\n              author: Alexis Svinartchouk\n              nested:\n                - commits:\n                    - subject: Add support for compute module 4\n                      hash: 701744f0bbc02bd7d322ed7e989af576a7156689\n                      body: \"\"\n                      footer:\n                        Change-type: minor\n                        change-type: minor\n                      author: Alexis Svinartchouk\n                    - subject: Fix size endianness of boot_message_t message\n                      hash: 867d8b0d217af0ad554d839fbc42cc08b222bc32\n                      body: \"\"\n                      footer:\n                        Change-type: patch\n                        change-type: patch\n                      author: Alexis Svinartchouk\n                  version: node-raspberrypi-usbboot-0.3.0\n                  date: 2021-03-26T16:10:38.120Z\n          version: etcher-sdk-6.2.1\n          date: 2021-03-26T16:37:33.170Z\n        - commits:\n            - subject: Added BeagleBone USB Boot example\n              hash: f088dbb3543d55341d06cfb6b20f64e02b9f6a78\n              body: \"\"\n              footer:\n                Change-type: patch\n                change-type: patch\n              author: Parthiban Gandhi\n              nested: []\n            - subject: Added BeagleBone USB Boot support\n              hash: 2a1d745bf59ca93739f489d7ae85ba19bc2697da\n              body: \"\"\n              footer:\n                Change-type: minor\n                change-type: minor\n              author: Parthiban Gandhi\n              nested: []\n          version: etcher-sdk-6.2.0\n          date: 2021-02-18T12:08:54.323Z\n    - subject: Fix getAppPath() returning an asar file on macOS\n      hash: e87ed9beed924da86b73c10addde432958586895\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested: []\n    - subject: Grammar fix\n      hash: bc5563d9c2ac9dcdd541d7e3cf062b9c29f8e1b4\n      body: |\n        \"flash directly\" sounds odd\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Andrew Scheller\n      nested: []\n    - subject: (docs) update README.md\n      hash: ad83ab5dccba5c4d746d52fc7ea6e18451bfd162\n      body: |\n        - fix spelling\n        - emphasize notes\n        - add link\n        - fix macOS to account for new homebrew API\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: vlad doster\n      nested: []\n    - subject: Update copyright year in electron-builder.yml\n      hash: 0dc1cf970186ef235eb12e5839712e7389ee37ef\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Andrew Scheller\n      nested: []\n    - subject: Update copyright year in .resinci.json\n      hash: 11489c653861590da2129f00fa938b062d9fd16a\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Andrew Scheller\n      nested: []\n    - subject: Separate the Yum and DNF instructions.\n      hash: 2619d4bc8602962d45317713474968c4aa833d67\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Dugan Chen\n      nested: []\n    - subject: Set msvs_version to 2019 when rebuilding\n      hash: 3730efd350d0875b7bbfcd58b614ca2ab025de4f\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested: []\n    - subject: \"Use moduleIds: 'natural' in webpack config to keep js files in arm64\n        and x64 mac builds identical\"\n      hash: 6ece32c546ca83a5be387d2618ce2967ad65dc81\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested: []\n    - subject: Update electron-builder to 22.10.5\n      hash: fd9996a3cc8f9c973518f57f439b3bc78b7b1671\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested: []\n    - subject: Update spectron to v13\n      hash: f06cc89152772bcf8748a02514a948bc9aecc9a1\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested: []\n    - subject: Update dependencies, use aws4-axios@2.2.1 to avoid adding more\n        dependiencies\n      hash: c1d7ab3fa9e66b5c33a302c62c282d48e37dde54\n      body: |\n        Also filter out dmg-license dependencies from the shrinkwrap file\n        aws4-axios@2.3.0 brings in react-native, see aws/aws-sdk-js-v3#1797\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested: []\n    - subject: Update scripts to build universal mac dmgs on the ci\n      hash: b206483c7cf37ef9865bc242b4053f6a5cc7cdec\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested: []\n    - subject: Fix beforeBuild.js script to also work on mac\n      hash: c3eb8c7b5603129ab12e38dda6f34bfb752034ef\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested: []\n    - subject: Support building universal dmgs (x64 and arm64) for mac\n      hash: 0849d4f435ba0e5612b6837996b18ab148346f07\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested: []\n    - subject: Update electron-builder to 22.10.4\n      hash: 1dba3ae19b324b5a45541002e91c0e5fd93c92e3\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested: []\n    - subject: Fix titlebar z-index\n      hash: f33f2e3771f0ea08424bb8169d596198a1c09035\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested: []\n    - subject: Explicitly set contextIsolation to false\n      hash: e56aaed9735cc22b28317455a4dc81d86d7746ab\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested: []\n    - subject: Update electron from 9.4.1 to 11.2.3\n      hash: a4659f038eb8ed0aa6ffb7b2e2c22ff5d29250d3\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested: []\n    - subject: Update etcher-sdk from 6.1.0 to 6.1.1\n      hash: cd462818da6f812fcec547e933964697bfd6847e\n      body: |\n        Update etcher-sdk from 6.1.0 to 6.1.1\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested:\n        - commits:\n            - subject: Update node-raspberrypi-usbboot from 0.2.10 to 0.2.11\n              hash: 66a232f0a2cb06192a5d94ddde9831893966cc94\n              body: |\n                Update node-raspberrypi-usbboot from 0.2.10 to 0.2.11\n              footer:\n                Change-type: patch\n                change-type: patch\n              author: Alexis Svinartchouk\n              nested:\n                - commits:\n                    - subject: Update @balena.io/usb from 1.3.12 to 1.3.14\n                      hash: d7cb5c673bfc8bd7c4ca3d49490fc9407d12700d\n                      body: |\n                        Update @balena.io/usb from 1.3.12 to 1.3.14\n                      footer:\n                        Change-type: patch\n                        change-type: patch\n                      author: Alexis Svinartchouk\n                  version: node-raspberrypi-usbboot-0.2.11\n                  date: 2021-02-10T15:43:10.247Z\n          version: etcher-sdk-6.1.1\n          date: 2021-02-10T16:33:01.204Z\n  version: 1.5.117\n  date: 2021-04-02T14:05:00.244Z\n- commits:\n    - subject: Only cleanup temporary decompressed files in child-writer\n      hash: 48b5e8b9d90fdd9df98e099db1947bb6b2490a5a\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested: []\n    - subject: Add .versionbot/CHANGELOG.yml\n      hash: 1f138f0ecc13046ffe4f0bce2795c492fc3d4486\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested: []\n    - subject: Stop using node-tmp, use withTmpFile from etcher-sdk instead\n      hash: 73f67e99ca7608a43afb326ab4a63e9507b769a1\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested: []\n    - subject: Update etcher-sdk from 5.2.2 to 6.1.0\n      hash: 9114da2445df0df85fc97aa3d83797c72963aba6\n      body: |\n        Update etcher-sdk from 5.2.2 to 6.1.0\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested:\n        - commits:\n            - subject: Prefix temporary decompressed images filenames\n              hash: 58b0ba2d9362536a105ff2b1152915540a9efb1e\n              body: \"\"\n              footer:\n                Change-type: minor\n                change-type: minor\n              author: Alexis Svinartchouk\n              nested: []\n          version: etcher-sdk-6.1.0\n          date: 2021-02-03T13:41:11.058Z\n        - commits:\n            - subject: Ignore ENOENT errors on unlink in withTmpFile\n              hash: 7bb2a23c4e94dcda6a7b494fe0435c0b59b56b06\n              body: >\n                The temporary file might have been already deleted by\n                cleanupTmpFiles\n              footer:\n                Change-type: patch\n                change-type: patch\n              author: Alexis Svinartchouk\n              nested: []\n          version: etcher-sdk-6.0.1\n          date: 2021-02-02T14:57:11.116Z\n        - commits:\n            - subject: Export tmp and add prefix and postfix options\n              hash: bd80af3ec5a87229fb3aebe2c77787371ab20253\n              body: \"\"\n              footer:\n                Change-type: major\n                change-type: major\n              author: Alexis Svinartchouk\n              nested: []\n          version: etcher-sdk-6.0.0\n          date: 2021-02-01T18:03:42.334Z\n        - commits:\n            - subject: upgrade lint\n              hash: 172bf453b5f96d6ebe06dc6564dec6613b97e3c7\n              body: \"\"\n              footer:\n                Change-type: patch\n                change-type: patch\n              author: Zane Hitchcox\n              nested: []\n          version: etcher-sdk-5.2.3\n          date: 2021-01-26T12:07:58.336Z\n    - subject: Revert \"Change some border colors to have higher contrast\"\n      hash: 554bbcc780f96b007b5b28610e1c724fab863cb5\n      body: |\n        This reverts commit 8c4edaabba832a5771caea69356e4d565a2c2e13.\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested: []\n    - subject: Update electron to v9.4.1\n      hash: 4db2289cfdd02f41523b6ece2982c22114372f40\n      body: \"\"\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested: []\n    - subject: Update etcher-sdk from 5.2.1 to 5.2.2\n      hash: c15b56bc237207fd16b432c22e612c20f16b451a\n      body: |\n        Update etcher-sdk from 5.2.1 to 5.2.2\n      footer:\n        Change-type: patch\n        change-type: patch\n      author: Alexis Svinartchouk\n      nested:\n        - commits:\n            - subject: Update drivelist from 9.2.2 to 9.2.4\n              hash: cebb5202f81572aac786c332c9c71c537602774c\n              body: |\n                Update drivelist from 9.2.2 to 9.2.4\n              footer:\n                Change-type: patch\n                change-type: patch\n              author: Alexis Svinartchouk\n              nested:\n                - commits:\n                    - subject: Pass strings between methods as std::string instead of char *\n                      hash: 1ec6a8ffc4c9e138b78210f0db84a9ebd6c9182b\n                      body: >\n                        - Fixes \"basic_string::_M_construct null not valid\"\n                        exception\n                          aborting program, because WCharToUtf8() returned NULL\n                          in some cases, and NULL was being fed to string constructor.\n                        - Fixes memory leak because memory allocated with\n                        calloc()\n                          in WCharToUtf8() was not being freed anywhere\n                        - Fixes undefined behavior because GetEnumeratorName()\n                        returns\n                          pointer to stack memory, that goes outside of scope while\n                          pointer still is being used.\n\n                        Closes #381\n\n                        Closes #382\n                      footer:\n                        Change-type: patch\n                        change-type: patch\n                      author: Floris Bos\n                  version: drivelist-9.2.4\n                  date: 2021-01-19T13:27:50.033Z\n                - commits:\n                    - subject: Support lsblk versions that do no support the pttype column\n                      hash: a6d568bb64e53c0dc3aeb226cbd0b19bbb090671\n                      body: \"\"\n                      footer:\n                        Change-type: patch\n                        change-type: patch\n                      author: Alexis Svinartchouk\n                  version: drivelist-9.2.3\n                  date: 2021-01-19T13:07:29.910Z\n          version: etcher-sdk-5.2.2\n          date: 2021-01-19T17:24:06.603Z\n  version: 1.5.116\n  date: 2021-02-03T13:58:32.420Z\n- version: 1.5.115\n  date: 2021-01-18T12:07:12.000Z\n  commits:\n    - hash: 361c32913ccab6dffacce47dbac22eac61b4abc9\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update etcher-sdk from 5.1.12 to 5.2.1\n      body: Update etcher-sdk from 5.1.12 to 5.2.1\n- version: 1.5.114\n  date: 2021-01-15T12:28:32.000Z\n  commits:\n    - hash: 93db90c725bdc56967eb73eace8cc09d6d4b1c70\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Disable screensaver while flashing (on balena-electron-env)\n      body: null\n    - hash: 3521b61a817e5094425b9c631ec5bd485f50c0e9\n      author: Aaron Shaw\n      footers:\n        change-type: patch\n        signed-off-by: Aaron Shaw <aaron@balena.io>\n      subject: \"docs: fix quote marks\"\n      body: \"Fix quote mark styling\\r\\n\\r\"\n    - hash: e8c7591751e8e6af9f49cfbcd6043da1b06477e7\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Fix typo in webpack.config.ts comment\n      body: null\n    - hash: b74069eb41e88826a26a893c43624001db919a62\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update webpack to v5\n        change-type: patch\n      subject: Update webpack to v5\n      body: null\n    - hash: f82996bfd1b7b562f2889eeddc5589df62817f5b\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update @balena/lint to 5.3.0\n      body: null\n    - hash: 53954e81fd148f25da67d56cff32cf89171e13a4\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update dependencies\n      body: null\n    - hash: f9d7991dc8aaca8ebeeb56309f52ec7cc5141058\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update rendition from 18.8.3 to 19.2.0\n      body: Update rendition from 18.8.3 to 19.2.0\n    - hash: 1188888956ee2895e363efdfbe6d90d0b612064a\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update etcher-sdk from 5.1.11 to 5.1.12\n      body: Update etcher-sdk from 5.1.11 to 5.1.12\n    - hash: aa563c87bd4f8217212bc72a96c7785daeb1c26e\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Remove libappindicator1 debian dependency\n        change-type: patch\n      subject: Remove libappindicator1 debian dependency\n      body: null\n- version: 1.5.113\n  date: 2020-12-08T13:54:21.000Z\n  commits:\n    - hash: 8c4edaabba832a5771caea69356e4d565a2c2e13\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Change some border colors to have higher contrast\n      body: null\n    - hash: d3df2fe57eae0c05d031dabd3f4e0454d0b3849d\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update sys-class-rgb-led from 2.1.1 to 3.0.0\n        change-type: patch\n      subject: Update sys-class-rgb-led from 2.1.1 to 3.0.0\n      body: Update sys-class-rgb-led from 2.1.1 to 3.0.0\n    - hash: 05497ce85c063b0ebec8fe6a688a159643a246d6\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update etcher-sdk from 5.1.10 to 5.1.11\n        change-type: patch\n      subject: Update etcher-sdk from 5.1.10 to 5.1.11\n      body: Update etcher-sdk from 5.1.10 to 5.1.11\n    - hash: 8c4edaabba832a5771caea69356e4d565a2c2e13\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Change some border colors to have higher contrast\n      body: null\n    - hash: 2f08142f5abe91b2ba09357c18e2750621484181\n      author: bulldozer-balena[bot]\n      subject: \"Merge pull request #3379 from balena-io/high-contrast-lines\"\n      body: Change some border colors to have higher contrast\n    - hash: 409b78fc21c7d9b09e15671fcf085e54ac1ca357\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Fix effective flashing speed calculation for compressed images\n        change-type: patch\n      subject: Fix effective flashing speed calculation for compressed images\n      body: null\n    - hash: c32e485f279d462a83f687d66b0a84158da815f5\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove dead code in settings modal\n      body: null\n    - hash: fe0b45cae63878ee9bdf40cea943ce29a484ff97\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Only show auto-updates setting on supported targets\n      body: null\n    - hash: 1f94f44b182ee24831bd3bd702df58e72faee807\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Remove unmountOnSuccess setting\n        change-type: patch\n      subject: Remove unmountOnSuccess setting\n      body: null\n    - hash: de0010eb72240da28f4cebd8aa1830b4bad1f6f1\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update rgb leds colors\n      body: null\n    - hash: 3987078c11f7fefa32571e0f48dfab107d9d324e\n      author: Giovanni Garufi\n      footers:\n        change-type: patch\n      subject: Update npm to v6.14.8\n      body: null\n    - hash: b1e4e681d12ffaf7dae1d7a06b9d0d76fcae40ca\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update electron to v9.4.0\n        change-type: patch\n      subject: Update electron to v9.4.0\n      body: null\n    - hash: 36d05724c00015e7c655d6afbd66d9c8904f74cc\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Improve hover message when the drive is too small\n        change-type: patch\n      subject: Improve hover message when the drive is too small\n      body: null\n    - hash: b4b8c89aad31dcb191e54a2e96ec9feab94e3206\n      author: Aaron Shaw\n      footers:\n        change-type: patch\n        signed-off-by: Aaron Shaw <aaron@balena.io>\n      subject: \"docs: update macOS version\"\n      body: \"Update macOS version as latest version of Electron is 10.10 compatible\n        only (Yosemite)\\r\n\n        \\r\"\n    - hash: 3cde2faed0440926c8913e72100aa18562bacbb0\n      author: Aaron Shaw\n      footers:\n        change-type: patch\n        closes: https://github.com/balena-io/etcher/issues/3191\n        signed-off-by: Aaron Shaw <aaron@balena.io>\n      subject: \"docs: add documentation links\"\n      body: \"add documentation and faq links\\r\\n\\r\"\n    - hash: fc45df270af35151027f231df4fd1d826d4b2bd2\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Fix red leds not showing for failed devices\n      body: null\n    - hash: c54856a616446b0ea3f9fd569a9558a2aeb5ede2\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Show the first error for each drive (not the last)\n        change-type: patch\n      subject: Only store the first error for each target\n      body: null\n- version: 1.5.112\n  date: 2020-12-03T15:17:29.000Z\n  commits:\n    - hash: da3a22d0f6254c6563c3be5ec192300970880dab\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Set useContentSize to true so the size is the same on all platforms\n        change-type: patch\n      subject: Set useContentSize to true so the size is the same on all platforms\n      body: null\n    - hash: 8bd11a01aebedd8f83fee0ba95fc14ab37389e16\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update etcher-sdk from 5.1.5 to 5.1.10\n        change-type: patch\n      subject: Update etcher-sdk from 5.1.5 to 5.1.10\n      body: Update etcher-sdk from 5.1.5 to 5.1.10\n    - hash: 3c0084d012f983241d1e2bb44971e44ffec41709\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Fix modal content height on Windows\n      body: null\n    - hash: 4e68955981827f4be5c50557e18e1f7d70297ac6\n      author: Alexis Svinartchouk\n      footers:\n        change-type: none\n      subject: Target commit instead of branch name for sudo-prompt\n      body: null\n    - hash: 50730bd3dfa7058e2834a7571159e74cee59acd0\n      author: Alexis Svinartchouk\n      footers:\n        change-type: none\n      subject: Fix imports in child-writer.ts\n      body: null\n    - hash: fa593e33d1568e4863ae0057b5133cc1dc2d10b7\n      author: Alexis Svinartchouk\n      footers:\n        change-type: none\n      subject: Update repo.yml to enable nested changelogs\n      body: null\n    - hash: 2158e20380276240e725da4da5baa4a563be6a35\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Improve flashing error handling\n        change-type: patch\n      subject: Improve flashing error handling\n      body: null\n    - hash: f46176fd105fbe9ac8d062bcd871af3f0a77105c\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Fix layout when the featured project is not showing\n        change-type: patch\n      subject: Fix layout when the featured project is not showing\n      body: null\n    - hash: edabacfb3a7a327557d00da02dbdc5d7cac2c54d\n      author: Alexis Svinartchouk\n      footers:\n        change-type: none\n      subject: Fix spectron test to work on Windows in all cases\n      body: null\n    - hash: 2e5a39dcd83cb614804c93859aff71cb1a91d237\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update sys-class-rgb-led from 2.1.0 to 2.1.1\n        change-type: patch\n      subject: Update sys-class-rgb-led from 2.1.0 to 2.1.1\n      body: Update sys-class-rgb-led from 2.1.0 to 2.1.1\n    - hash: 3647457bb5793fbf42b34840d1678f78715eff30\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Add rendition and sys-class-rgb-led to repo.yml\n      body: null\n- version: 1.5.111\n  date: 2020-11-23T17:52:39.000Z\n  commits:\n    - hash: 560ed91e2ec02a9abb8a62da78312fdfa68930e4\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update etcher-sdk to 5.1.1, use WASM ext2fs module\n        change-type: patch\n      subject: Update etcher-sdk to 5.1.1, use WASM ext2fs module\n      body: null\n    - hash: bddb89e4a1c7b6ef75e7b1762d725e219239ebc0\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update electron to v9.3.3\n        change-type: patch\n      subject: Update electron to v9.3.3\n      body: null\n    - hash: e2c2b4069030e0fce9c928e1d113c8f63419674d\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Remove \"Validate write on success\" setting. Validation is\n          always enabled, press the \"skip\" button to skip it.\n        change-type: patch\n      subject: Remove \"Validate write on success\" setting\n      body: Validation is always enabled, press the \"skip\" button to skip it.\n    - hash: 1c52379ee3da40306ae2c14751f9026d59e7a6c3\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Add drivesOrder setting\n      body: null\n    - hash: e58cfd89c58649ed3ae32e2304495f31b057d865\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Add successBannerURL setting\n      body: null\n    - hash: ef3b8915d895d59ea4878137d5b4280056ca912b\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update etcher-sdk to 5.1.2\n      body: null\n    - hash: 1e0a6a3129735641dc9920eec7ae9acd7495afce\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Removed disableExplicitDriveSelection setting, use autoSelectAllDrives\n        instead\n      body: null\n    - hash: e7b4f0902166cc78dfbf728a6c708586667fb884\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Allow selecting a locked SD card as the source drive\n        change-type: patch\n      subject: Allow selecting a locked SD card as the source drive\n      body: null\n    - hash: 644d955f08756cacab866d4bdeb1031fb6f84049\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Prevent opening more than one file selector\n      body: null\n    - hash: e37ae2743f20d08cd2c2c7dafa55053fc4228aa9\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update etcher-sdk to 5.1.3\n      body: null\n    - hash: a2c7a542df3c64e5d91e8ebe70b14abe0c0d1854\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Use a different icon when no source drive is available\n        change-type: patch\n      subject: Use a different icon when no source drive is available\n      body: null\n    - hash: af2b6bc8ca0cdd0b68b62d54a208cad8c4553a1a\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update typescript to 4.1.2\n      body: null\n    - hash: 0597c0e908c952eb424efe0c06c37addb775b06e\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update etcher-sdk to 5.1.5\n      body: null\n    - hash: c69b2fa053241d6d32073df09c363b1f9d2b7f85\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Warn when the source drive has no partition table\n        change-type: patch\n      subject: Warn when the source drive has no partition table\n      body: null\n    - hash: 446e8e1253091ea65f518f23ab3fbed74eff4189\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update bl\n      body: null\n- version: 1.5.110\n  date: 2020-11-05T11:54:37.000Z\n  commits:\n    - hash: db09b7440d4172df4f416bb287013d92d2ee126c\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Rework success screen\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Rework success screen\n      body: null\n    - hash: 7e7ca9524e6486fdccc59fc4964454be8d925e30\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Add skip function to validation\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Add skip function to validation\n      body: null\n    - hash: e484ae98372ab7661e62e4a0cb79420edcc87325\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Cleanup after child-process is terminated\n      body: null\n    - hash: 611e6596268f43f3cff3b463dec87001a5498c0a\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Add retry button to the errors modal in success screen\n      body: null\n    - hash: 06997fdf291d675f1059d33b38da93ff9557e2eb\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Fix zoomFactor in webviews\n      body: null\n    - hash: e74dc9eb6002202e392cd55b841b0ed4be777fa4\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Update rendition to v18.8.3\n      body: null\n    - hash: 31409c61ca1cf0b7e66195ad8190eb081bef017c\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Use drive-selector's table for flash errors table\n      body: null\n    - hash: a7637ad8d45164dad290edf3a4250579d225de7a\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Fix settings spacing\n      body: null\n    - hash: 640a7409ee364bedc89d812786ed293a20a1492f\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Add dash on table when selecting only some rows\n      body: null\n    - hash: 4872fa3d6e975385df81a1615d1fcb742c6f82a8\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Fix URL not being selected with custom protocol\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Fix URL not being selected with custom protocol\n      body: null\n    - hash: deb3db0fff97358a1fb3c47d761179be4b0acbb5\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Add more typings & refactor code accordingly\n      body: null\n    - hash: 6c49c71b3fe6eb02da290a7c53a889de052439bf\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Remove console.log in tests\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Remove console.log in tests\n      body: null\n    - hash: 40e5fb22878576488c5896c266beb8770184b5db\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Add primary colors to default flow\n      body: null\n- version: 1.5.109\n  date: 2020-09-14T16:25:48.000Z\n  commits:\n    - hash: 7c2644ec51097e9251ac587845552ac23036084c\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Workaround elevation bug on Windows when the username contains\n          an ampersand\n        change-type: patch\n      subject: Workaround elevation bug on Windows when the username contains an\n        ampersand\n      body: null\n    - hash: 0a28a7794d4a5fa2fb55e11999b69d3a982536d3\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update ext2fs to v2.0.5\n      body: null\n- version: 1.5.108\n  date: 2020-09-10T17:31:36.000Z\n  commits:\n    - hash: b9076d01af583572aa914968994b2c6e05f9c88c\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Fix content not loading when the app path contains special characters\n        change-type: patch\n      subject: Fix content not loading when the app path contains special characters\n      body: null\n- version: 1.5.107\n  date: 2020-09-07T09:48:17.000Z\n  commits:\n    - hash: 377dfb8e220276549364094ea9c1a88cdd63f50c\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Split drive selector from target selector\n      body: null\n    - hash: dda022df37133d638808bae4271982789d8e584f\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Add clone-drive workflow\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Add clone-drive workflow\n      body: null\n    - hash: bb04098062f84462200468159510cc4b77cb9ea5\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Reword macOS Catalina askpass message\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Reword macOS Catalina askpass message\n      body: null\n    - hash: aa72c5d3bb051f552ab3cfd0a67681dcc5407e53\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Ignore vscode workspace folder\n      body: null\n    - hash: 42838eba095220ecb254aadc314df5d88822d170\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Override cached window's zoomFactor\n      body: null\n    - hash: 093008dee7a936c91b9ecdde8bebee9e6dace5b5\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Rework system & large drives handling logic\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Rework system & large drives handling logic\n      body: null\n    - hash: 8fa6e618c4d52f4ec5e5c9fc93c74fb301c789c9\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Use pretty-bytes instead of custom function\n      body: null\n    - hash: 14a89b3b8a25ae82e153e56bc97fcad983e1bbf4\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Remove lodash from selection-state.ts\n      body: null\n    - hash: f9d79521a11f09fdd2a31ccba9de096a11b292eb\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Fix tests not running\n      body: null\n    - hash: 3e45691d0b207eb476df38a1b2250ffe4fa91fa7\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Re-enable ext partitions trimming on 32 bit Windows\n        change-type: patch\n      subject: Re-enable ext partitions trimming on 32 bit Windows\n      body: null\n    - hash: eeab35163658c982f9ec35f37b40649d5f99fad6\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Fix tests hanging on array.flatMap\n      body: null\n    - hash: b76366a514edd494188cfdc6eccbd2a1d2c49c61\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Add more typings & refactor code accordingly\n      body: null\n- version: 1.5.106\n  date: 2020-08-27T16:16:31.000Z\n  commits:\n    - hash: 7894a67719cb178f3465ec05cf7ac107e3dc7610\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Fix opening zip files from servers accepting Range headers\n        change-type: patch\n      subject: Fix opening zip files from servers accepting Range headers\n      body: null\n    - hash: 688d697a996cb362aa4dab8346cd8ea893619b76\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update typescript to ^4\n      body: null\n    - hash: 991cbf6b7f055f5588dff0e6da06653aa5d8803a\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update etcher-sdk to 4.1.28\n      body: null\n    - hash: 5e5f82c4b529e90a26adad6ffdb7386bf1a13321\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Disable ext partitions trimming on 32 bit windows until it is fixed\n        change-type: patch\n      subject: Update etcher-sdk to 4.1.29\n      body: null\n- version: 1.5.105\n  date: 2020-08-26T11:11:17.000Z\n  commits:\n    - hash: b7f8c8368c1e79b15725edf5580ca7385d397dc7\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Fix settings button not being clickable\n      body: null\n    - hash: 34489f0d6667bcde4382ce20e5b4b9e4d31912ce\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update etcher-sdk to 4.1.25\n      body: null\n    - hash: 27e560c96130b328c120941dfc5bbb5f3ee73e96\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update rendition to ^18.4.1\n      body: null\n    - hash: fff9452509d16956b126f413f1f1ebe9c7c2289e\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Spinner for URL selector modal\n        change-type: patch\n      subject: Spinner for URL selector modal\n      body: null\n    - hash: 92dfdc6edd6f214aa50500d56f0ef6ecc062de44\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: URL selector cancel button cancels ongoing url selection\n        change-type: patch\n      subject: URL selector cancel button cancels ongoing url selection\n      body: null\n    - hash: 55cafb92681f24dc08d91ad5b5ab41528871b062\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update etcher-sdk to 4.1.26\n        change-type: patch\n      subject: Update etcher-sdk to 4.1.26\n      body: null\n    - hash: a17a919c37603d61fa6fe43229c285967a938722\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove unused SafeWebvuew.refreshNow property\n      body: null\n    - hash: 8ed5ff25a5bafd73810f902a7974462538d16b2d\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove unused FeaturedProject.state.show\n      body: null\n    - hash: a485d2b4df990a4e31b39c54be303c3b019e0ec1\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove FeaturedProject class, replace with SafeWebview\n      body: null\n    - hash: c9bfd350ed039902f54cb306bc10a7a1464d9684\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove unused FlashStep.props.isWebviewShowing\n      body: null\n    - hash: 2c07538f8f6c232969f3410931ed82cb3575c67a\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Simplify MainPage\n      body: null\n- version: 1.5.104\n  date: 2020-08-21T12:59:25.000Z\n  commits:\n    - hash: a7c34315562342b93942987a0cb25249bf611fad\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove unused error message\n      body: null\n    - hash: 9797a2152de30b5c9ee8d17fbf1947184cab4077\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update electron to v9.2.1\n        change-type: patch\n      subject: Update electron to v9.2.1\n      body: null\n    - hash: 46663e3a6f4624ca4de0784a068e4c003c97770a\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove no longer used @types/bluebird\n      body: null\n    - hash: 6eab47259e3c47c86f36bf2f9f236c88491dd29b\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove no longer used @types/request\n      body: null\n    - hash: 7f9add3f1e813c4a3827dd1804f7c2e933869599\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove no longer used nan\n      body: null\n    - hash: 548475996c36baca13737df49c10571518ebff85\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove duplicated styled-system\n      body: null\n    - hash: 24c8ede746a3939fc18fa821bc9f3e8d5d52437d\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove unused part of Makefile\n      body: null\n    - hash: 08716efbd5d7e949cbc5476e9b1215b9f00fade3\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update rendition to 18.1.0\n      body: null\n    - hash: a24be20e952ac041755b8e29c84cd72d1149d6c9\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Fix writing config file\n        change-type: patch\n      subject: Fix writing config file\n      body: null\n    - hash: 6cb914e9697030136086d00ac2f87ce28582342c\n      author: Alexis Svinartchouk\n      footers:\n        chanelog-entry: Update etcher-sdk to v4.1.24\n        change-type: patch\n      subject: Update etcher-sdk to v4.1.24\n      body: null\n- version: 1.5.103\n  date: 2020-08-19T11:55:07.000Z\n  commits:\n    - hash: 3b105d5a6a1436a085af9456bfaba81469c15d85\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update etcher-sdk to ^4.1.20\n      body: null\n    - hash: 0bf1ec495800f03602be18f73bb8674ef18017b9\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Remove Bluebird\n        change-type: patch\n      subject: Remove Bluebird\n      body: null\n    - hash: 482c29bc2abc960a36536dabc6e74176c2e22c60\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update dependencies\n      body: null\n    - hash: f8e21e2338b3f97589ea23f8d5699409d207317a\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: User regular stream in lzma-native instead of readable-stream\n        change-type: patch\n      subject: User regular stream in lzma-native instead of readable-stream\n      body: null\n    - hash: 76fa698995337847af9bc750262ad6517dcebfd5\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Optimize svgs\n        change-type: patch\n      subject: Optimize svgs\n      body: null\n    - hash: f2a37079eb36c4b07c722afbb46389d63b440803\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Don't use lodash in child-writer.js\n        change-type: patch\n      subject: Don't use lodash in child-writer.js\n      body: null\n    - hash: 481be42eb5bf2ed71fa4734a75e29f7c9277e6df\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update etcher-sdk to ^4.1.22\n      body: null\n    - hash: 140f3452ed2494a8dc449b54c3d6fcfa96ed3c49\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Don't import WeakMap polyfill in deep-map-keys\n        change-type: patch\n      subject: Don't import WeakMap polyfill in deep-map-keys\n      body: null\n    - hash: 281f1194561123f138a77064934c405f3d72aa04\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Replace native elevator with sudo-prompt on windows\n        change-type: patch\n      subject: Replace native elevator with sudo-prompt on windows\n      body: null\n    - hash: a3322e9fd75b7db0f6a745a2bdea2452a18c8bfe\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: \"Set module: es2015 in tsconfig.json\"\n        change-type: patch\n      subject: \"Set module: es2015 in tsconfig.json\"\n      body: null\n    - hash: ac2d4ae8f32071e94fe56e1011fd32569526c344\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Move linting and testing into package.json\n        change-type: patch\n      subject: Move linting and testing into package.json\n      body: null\n    - hash: fbacb8187d64f13d624776fed70f2c7943cd500d\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update etcher-sdk to ^4.1.23\n        change-type: patch\n      subject: Update etcher-sdk to ^4.1.23\n      body: null\n    - hash: 1f44f3944f7a802dc7dd78fb06cd83b18637b151\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update electron to 9.2.0\n        change-type: patch\n      subject: Update electron to 9.2.0\n      body: null\n    - hash: 540fe9060907e70aa02a88745670e98f7932baca\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Fix running tests on Windows\n      body: null\n    - hash: 0c59168ceb799c62366a649fe3ad4b467f0721f6\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Change isFocused check to isVisible in tests\n      body: null\n    - hash: 5fbaa3a3db1789eda064659b7a6d2b2aa2821e38\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update @balena/udif, don't bundle htmlparser2 into the writer\n      body: null\n    - hash: 9f29dc8b76793b7fe34970602bf9634e0ce5f0dd\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update rendition  to ^17\n        change-type: patch\n      subject: Update rendition  to ^17\n      body: null\n    - hash: bc092114c1f7645cd1efdce947359ff61d0d2171\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Don't use more than a 8th of the system memory as buffers\n      body: null\n    - hash: 88ae9fcbd1a067cd5c4659f30904c7ce6e8c3dde\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update dependencies\n      body: null\n- version: 1.5.102\n  date: 2020-07-27T15:55:15.000Z\n  commits:\n    - hash: 175e41de8d162a94005d157b6df9b36de10fa799\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update rendition to ^16.1.1\n        change-type: patch\n      subject: Update rendition to ^16.1.1\n      body: null\n    - hash: 5eac622b8c74ac3c3ad78b34d9e60c45205768a6\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Use strict typescript compiler option\n        change-type: patch\n      subject: Use strict typescript compiler option\n      body: null\n    - hash: 7d53d0aadcac2d07336afd255de0965ea5666f19\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Use tslib\n        change-type: patch\n      subject: Use tslib\n      body: null\n    - hash: 170126a490e805b9d14fa2b3e747cba3277cbae9\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Remove no longer used .sass-lint.yml\n        change-type: patch\n      subject: Remove no longer used .sass-lint.yml\n      body: null\n    - hash: e72049d6e8cfc073ae539ab3b16ef9ecf0382fbf\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Remove font awesome unused icons from the generated bundle\n        change-type: patch\n      subject: Remove font awesome unused icons from the generated bundle\n      body: null\n    - hash: dc9351713cd4e78513781c3a8c31a0b822f78451\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Stop using request, replace it with already used axios\n        change-type: patch\n      subject: Stop using request, replace it with already used axios\n      body: null\n    - hash: 3218fc2c8352ebf710c87ae4fb086cc9e576b6db\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Split main process and child-writer js files\n        change-type: patch\n      subject: Split main process and child-writer js files\n      body: null\n    - hash: 963fc574c3569127da7cfce75642e50d5b226c3e\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Centralize imports in child-writer\n        change-type: patch\n      subject: Centralize imports in child-writer\n      body: null\n    - hash: 512785e0a96c5c24792a034fbb2b56c2c67926ab\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Remove bluebird from main process, reduce lodash usage\n        change-type: patch\n      subject: Remove bluebird from main process, reduce lodash usage\n      body: null\n    - hash: 44c74f33d933141b5dde1929fb3f421347d2a32e\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Electron 9.1.1\n        change-type: patch\n      subject: Electron 9.1.1\n      body: null\n    - hash: 3f59d35fb6c5f9215715ccbc44b7443dd73e58c9\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Fix flashing truncated images, fix flashing large dmgs\n        change-type: patch\n      subject: Update etcher-sdk to ^4.1.19\n      body: null\n- version: 1.5.101\n  date: 2020-07-09T16:37:27.000Z\n  commits:\n    - hash: 9b71772e3532b57ff57dc5944f190ba4363f5d1b\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Refactor UI grid to use rendition\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Refactor UI grid to use rendition\n      body: null\n    - hash: 76086a8f915c4784198be38373b19f63511144d2\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Rework and move flashing view elements\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Rework and move flashing view elements\n      body: null\n    - hash: 8ce9eac7040e217f0e8a5c48e1d55cb338da6852\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Remove bootstrap & flexboxgrid\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Remove bootstrap & flexboxgrid\n      body: null\n    - hash: 00f193541d9efe87de94e90e2b86cbce8dfa0865\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Restyle modals\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Restyle modals\n      body: null\n    - hash: 3ca50a1e2d95c73890009ffe1df9243a9a9df045\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Refactor UI without bootstrap & flexboxgrid\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Refactor UI without bootstrap & flexboxgrid\n      body: null\n    - hash: 098ca9a9a1fb4e06211e95925bd559c7c336d55e\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Remove unused warning in settings\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Remove unused warning in settings\n      body: null\n    - hash: 8560189a1e11b5f572abd4859341bb52961517ce\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Remove unused scss\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Remove unused scss\n      body: null\n    - hash: 784dd03ba758d7fa5e217875bf300aa45d545d32\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Convert sass to plain css\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Convert sass to plain css\n      body: null\n    - hash: 394d3e0bf2d52ee2415b3e1996ebd17992323b7f\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Update etcher-sdk to v4.1.16\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Update etcher-sdk to v4.1.16\n      body: null\n    - hash: 692274691ee23a34be3c5db130e0432edea375dc\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove non relevant comment\n      body: null\n    - hash: ba29d76a000cdd9a60f09394f431c89b1ca05848\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update electron to 9.0.5\n      body: null\n    - hash: 05d0f7142da807e4c6f603b7f49f8d19b02c592c\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update rendition to 15.2.4\n      body: null\n    - hash: 953f572b53b93ebe21bfe0f8ce0ad456541dfdb1\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Fix modal not showing overflowing elements\n      body: null\n    - hash: c8737806c0e6e2022ba4d4654110bd23d00b6470\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove unused packages\n      body: null\n    - hash: e5ee0f1961a06ec662882cdc86ece35761ef74ed\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Mount source drive if automountOnFileSelect is set\n      body: null\n    - hash: 391e4444d4a3f65c48b844dafc7a438b36fab482\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Deselect the image if the source drive is removed\n      body: null\n    - hash: 9bde38df5ad3d0e1b59038e55637cbc0e26f0ff6\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update etcher-sdk to 4.1.17\n      body: null\n    - hash: 5c5273bd6cd426d0d424d29fc51ec4b4d45c5b48\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: autoSelectAllDrives setting\n      body: null\n    - hash: 630f6c691c02917c4c52e0bce4a01f37ae243416\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Resize modal to show content appropriately\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Resize modal to show content appropriately\n      body: null\n- version: 1.5.100\n  date: 2020-06-22T16:08:48.000Z\n  commits:\n    - hash: f8cc7c36b4888babf65e65ba6f622e28306505aa\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Add warning color to Flash! button\n      body: null\n    - hash: 71c7fbd3a28b84821f23d34e190d9b0365e96be2\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Rework target selector modal\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Rework target selector modal\n      body: null\n    - hash: b0c71b21b3a4e25bc062df60c6bba94ebd97170a\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Merge unsafe mode with new target selector\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Merge unsafe mode with new target selector\n      body: null\n    - hash: af9d3ba9f120a6768535ba4f2f6f6e18f87c9679\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Update rendition to v15.0.0\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Update rendition to v15.0.0\n      body: null\n    - hash: 7aec8a4ae23b9b2646e840dd6547f07fd92801e2\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Refactor styles\n      body: null\n    - hash: 2dc359b19c34019c1fdeac3bcbfab1a339975d79\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Make TargetSelectorModal a React.Component\n      body: null\n    - hash: e39fed1f258f53d19a7e03d44f65eedec1e5263a\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Fix source-selector image height\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Fix source-selector image height\n      body: null\n    - hash: d63f5eca0d35164dab69ba1a4d57743442a08f09\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update rendition to 15.2.1\n      subject: Update rendition to 15.2.1\n      body: null\n    - hash: 9444f0e1b121bf8ac65f6b77ca92be26b06a38e1\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Stricter types in target-selector-modal.tsx\n      body: null\n    - hash: 6554ccf0f8f90dfe9aefefcb512b275cee8650c9\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Sticky header in target selection table\n        change-type: patch\n      subject: Sticky header in target selection table\n      body: null\n    - hash: 92cd3d688d0492f961e6214e9ad20790774ab631\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update etcher-sdk to v4.1.15\n        change-type: patch\n      subject: Update etcher-sdk to v4.1.15\n      body: null\n    - hash: a360370c4e861a1b60e174790acfa82f795fb868\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update electron to v9.0.4\n        change-type: patch\n      subject: Update electron to v9.0.4\n      body: null\n    - hash: 07fde0d73ffd38b05315d3fa4f953f9bb97922b8\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Don't mutate usbboot drives when updating progress\n      body: null\n    - hash: 7165a8190b4a7d57dbfaeb7748fb28826f4a8cd1\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update electron-notarize to v1.0.0\n        change-type: patch\n      subject: Update electron-notarize to v1.0.0\n      body: null\n    - hash: 129e7e20e8bba1381be071c80abfeb0dde25e517\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update mocha to v8.0.1\n        change-type: patch\n      subject: Update mocha to v8.0.1\n      body: null\n    - hash: 5a45f8b122046ebfb8a29af4b49d0bb74f2b8afe\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update target selector ok button label to show the number of selected\n        devices\n      body: null\n    - hash: 406955ca3eb948b6be7c56dea79e4166a6c88738\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Add .vhd to the list of supported extensions, allow opening any file\n        change-type: patch\n      subject: Add .vhd to the list of supported extensions, allow opening any file\n      body: null\n    - hash: 14e4cbf749b40664eb30f6678cfcd9fc28f7b140\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Add icon to plug targets in targets modal\n      body: null\n    - hash: b32c4ee728adcb00d38f286beb456c3d8ecb6b8f\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update partitioninfo to 5.3.5\n        change-type: patch\n      subject: Update partitioninfo to 5.3.5\n      body: null\n    - hash: ba16995070491690f3060b3b75a7ca07e70ead9a\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Show system drives last\n      body: null\n- version: 1.5.99\n  date: 2020-06-12T12:29:12.000Z\n  commits:\n    - hash: f01f1ddd7a4c5fdb141e5e20472357525a73a9d0\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Inline all svgs\n        change-type: patch\n      subject: Inline all svgs\n      body: null\n    - hash: 03e3354d500fd7d5af342cc15977ece233bb2461\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update electron to 9.0.3\n        change-type: patch\n      subject: Update electron to 9.0.3\n      body: null\n    - hash: 62b42e92549dfbc40d9d1ee7ad6ea84974e0d745\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update node-raspberrypi-usbboot to 0.2.8\n        change-type: patch\n      subject: Update node-raspberrypi-usbboot to 0.2.8\n      body: null\n- version: 1.5.98\n  date: 2020-06-10T20:34:03.000Z\n  commits:\n    - hash: b1376dfa73fe9f450c0c0d3be33d7912ef991a52\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update etcher-sdk to ^4.1.13\n        change-type: patch\n      subject: Update etcher-sdk to ^4.1.13\n      body: null\n    - hash: 52bdd02a4b7b17e5821f96faa04d2c280d7e27c9\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Check that argument is an url or a regular file before opening\n        change-type: patch\n      subject: Check that argument is an url or a regular file before opening\n      body: null\n    - hash: 59e37182be060c008f5801cfc1eef7a5ee32224c\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Use between 2 and 256MiB for buffering depending on the number\n          of drives\n        change-type: patch\n      subject: Use between 2 and 256MiB for buffering depending on the number of drives\n      body: null\n- version: 1.5.97\n  date: 2020-06-08T15:05:58.000Z\n  commits:\n    - hash: 5f5c66e3f2132a63347397a7ff2f6a2360f8f7c1\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Allow skipping notarization when building package (dev)\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Allow skipping notarization when building package\n      body: null\n    - hash: f0bbd1a1cda2ea1ef1cf87cf8f82c0d4f6de647a\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Fix windows ia32 rebuild\n      body: null\n    - hash: b7e82f7694989dd525eacb98b4589048d846848b\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Fix sudo-prompt promisification\n        change-type: patch\n      subject: Fix sudo-prompt promisification\n      body: null\n    - hash: 28f9954661f28a9391fa83bf6b58fc9b5a208fe3\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update etcher-sdk to ^4.1.6\n        change-type: patch\n      subject: Update etcher-sdk to ^4.1.6\n      body: null\n    - hash: 7e7a66911644549b085294ac86ea3d1d2a09efed\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Simplify spectron tests\n      body: null\n    - hash: 1449478c5b5b062e601f9d24bb8e0c83b418f82c\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Read image path from arguments, register `etcher://...` protocol\n        change-type: patch\n      subject: Read image path from arguments, register `etcher://...` protocol\n      body: null\n    - hash: f983d88e52757d653f20eed694738796891b1e49\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update etcher-sdk to ^4.1.8\n        change-type: patch\n      subject: Update etcher-sdk to ^4.1.8\n      body: null\n    - hash: 29e2e9c65749671b08fa5369f7a8a8687da557ff\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Avoid random access in http sources\n        change-type: patch\n      subject: Avoid random access in http sources\n      body: null\n    - hash: b749c2d45a91de51adec307838af2acafc2033d3\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Fix flash from url on windows\n        change-type: patch\n      subject: Fix flash from url on windows\n      body: null\n    - hash: 3fa961197165b773000127ae156480cc75ac6716\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Don't check child-writer stderr, rely on the exit code instead\n      body: null\n    - hash: 3259a8206f6259cff6fccaa384f6d3db6126ee68\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update electron to v9.0.2\n        change-type: patch\n      subject: Update electron to v9.0.2\n      body: null\n    - hash: fcc9c5e5772cf8a01dcbf81e6e12d446fd6cd1c9\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update node-gyp to ^7.0.0\n      body: null\n    - hash: f05f9d33f9b3b3d7dfdbf6ee93f531908fdef24f\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Use @types/copy-webpack-plugin\n      body: null\n    - hash: b43ec4414e7b624b81bd9b2525c92ed6265829f9\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update @types/terser-webpack-plugini to ^3.0.0\n      body: null\n- version: 1.5.96\n  date: 2020-06-03T13:04:33.000Z\n  commits:\n    - hash: afa29a0ed181a3bdcc97c622183cc896ba35e258\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Remove unused styles\n        change-type: patch\n      subject: Remove unused styles\n      body: null\n    - hash: 0ebfecc60c45d785d9cf130336d43780ab1d27ac\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Make FlashStep a PureComponent\n      body: null\n    - hash: e9f9f9013721b5b37c6cd8f3d4b5f725cae5d939\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update rendition to ^14.13.0\n        change-type: patch\n      subject: Update rendition to ^14.13.0\n      body: null\n    - hash: 95ff5c98a81a86262a72f0b2ba48234c456894fe\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Change font to SourceSansPro and fix hover color\n        change-type: patch\n      subject: Change font to SourceSansPro and fix hover color\n      body: null\n    - hash: 6db0172a5001642c17fe76252d02789a308d073f\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove useless StepSelection component\n      body: null\n    - hash: 4880275e7bbc3705c3454dc007a758622e27f6f0\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Simplify FlashAnother button\n      body: null\n    - hash: f5c7dc932a2f25989499419c65d2a5ddd091eec9\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove unused css class\n      body: null\n    - hash: 34349f64d5cae3b70a0245c407e4470a2950b354\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update progress bar style\n        change-type: patch\n      subject: Update progress bar style\n      body: null\n    - hash: ba21da4f0bc1d1a972a8246b58ede81782a42d35\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Add effective speed in flash results\n        change-type: patch\n      subject: Add effective speed in flash results\n      body: null\n    - hash: 9c25cc663abcd197849f0a5b0f325b4b10bc14d1\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove unused styles\n      body: null\n    - hash: a4366556c02f9d19be156e1495c1efbffc15b8f7\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Remove writing speed from finish screen\n        change-type: patch\n      subject: Remove writing speed from finish screen\n      body: null\n    - hash: 10b028355fe8e4d456e0217f92112cf46e8f0e82\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Fix ia32 builds for windows\n        change-type: patch\n      subject: Fix ia32 builds for windows\n      body: null\n- version: 1.5.95\n  date: 2020-06-01T10:37:37.000Z\n  commits:\n    - hash: bb6d909949f040cc272b99da7058c106218f0605\n      author: Juan Cruz Viotti\n      footers:\n        changelog-entry: \"spectron: Make tests pass on Windows Docker containers\"\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <juan@balena.io>\n      subject: \"spectron: Make tests pass on Windows Docker containers\"\n      body: |-\n        The Spectron test that we have that checks that the browser window is\n        visible fails when ran inside a Windows Docker container.\n        In particular, the `isVisible()` function returns `false` when running\n        in a headless Windows machine.\n        However, the `isMinimized()` function returns `false`, the `isFocused()`\n        function returns `true`, and we can fetch the expected browser window\n        bounds, so we can use all those values in conjunction to reformulate the\n        test case and avoid `isVisible()`.\n        The results should be pretty much the same, and the assertions will pass\n        inside Docker Windows containers.\n- version: 1.5.94\n  date: 2020-05-27T21:10:43.000Z\n  commits:\n    - hash: e33172060f8c45d817b3cf7a761129760954bf65\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update etcher-sdk to ^4.1.4\n        change-type: patch\n      subject: Update etcher-sdk to ^4.1.4\n      body: null\n    - hash: 11bda8e76a576064c6e7e64cfc7dfa453eb56575\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove electron-builder patch now that\n        https://github.com/electron-userland/electron-builder/pull/4993 is\n        merged\n      body: null\n    - hash: 4e08cf38797c2a1136905077fe11423e9ac24bca\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Fix flash from url (broken in 1.5.92)\n        change-type: patch\n      subject: Fix flash from url (broken in 1.5.92)\n      body: null\n    - hash: 4752fa6dd2b302ba2edf3763be86bd3ae58a2ec7\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Stop checking file extensions\n        change-type: patch\n      subject: Stop checking file extensions\n      body: null\n    - hash: aee3a0a2812c48b02e23490fa2c33cf74b74f5c8\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Show image name and path in image name modal\n      body: null\n- version: 1.5.93\n  date: 2020-05-25T17:33:57.000Z\n  commits:\n    - hash: d5df3de1d76abb1fa50622e123ab5e3e43cb4f66\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update electron to v9.0.0\n        change-type: patch\n      subject: Update electron to v9.0.0\n      body: null\n    - hash: bf26d4ec9577f94a7a3a2cc754d6c549367341ee\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove dead code\n      body: null\n    - hash: 880e56e563bd0843685f64aa6a1afc1e0ae2c09c\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Strip out comments from generated code\n        change-type: patch\n      subject: Strip out comments from generated code\n      body: null\n    - hash: 688e7fff9c9a1682c5475d97033a89eab489091e\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update electron-builder to v22.6.1\n        change-type: patch\n      subject: Update electron-builder to v22.6.1\n      body: null\n    - hash: c0a4fb16e26444460ea457dbec2440a2f49f5149\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update dependencies\n      body: null\n    - hash: ed3b7f79714458b0ec5021d9adf4524cfd5ca9ae\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Patch electron-builder to fix signing on macos\n      body: |-\n        Remove this once\n        https://github.com/electron-userland/electron-builder/pull/4993 is\n        merged\n- version: 1.5.92\n  date: 2020-05-25T10:07:46.000Z\n  commits:\n    - hash: 1ebc8e936247c2cf87a07243d952f60a5b13c548\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Webpack everything, reduce package size\n        change-type: patch\n      subject: Webpack everything, reduce package size\n      body: null\n    - hash: 33d48fe4f7152eef318703b7afabcec498183b01\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Remove unneeded font formats\n        change-type: patch\n      subject: Remove unneeded font formats\n      body: null\n    - hash: b1fd539d25bd96bdcecdba58037d904c5577eb17\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Remove unneeded fortawesome from main.scss\n        change-type: patch\n      subject: Remove unneeded fortawesome from main.scss\n      body: null\n    - hash: 2692104ccd7493ae8596fc70ee0313bdf5f3ad37\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Disable asar packing on all platforms\n        change-type: patch\n      subject: Disable asar packing on all platforms\n      body: null\n    - hash: 09a6a340c9f730cae011940a5d109e2265e58a02\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Use electron.app.getAppPath() instead of reading it from argv\n          in catalina-sudo\n        change-type: patch\n      subject: Use electron.app.getAppPath() instead of reading it from argv in\n        catalina-sudo\n      body: null\n- version: 1.5.91\n  date: 2020-05-21T14:22:55.000Z\n  commits:\n    - hash: c9cbe41f9eb38f5db65427ee17066d2700b199ae\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Minor fix - Init isSourceDrive param in correct place\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Init param in correct place\n      body: null\n    - hash: 31bd8ce7ae5b4b627209ece4ef850f695a2e8c25\n      author: Rob Evans\n      footers:\n        fixes: \"#3160\"\n        change-type: patch\n        changelog-entry: Fix undefined image from DriveCompatibilityWarning\n      subject: Fix undefined image from DriveCompatibilityWarning\n      body: null\n- version: 1.5.90\n  date: 2020-05-20T15:23:37.000Z\n  commits:\n    - hash: d90e3a816e0cd9b23cee6af999730e12c6c49954\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update leds behaviour\n        change-type: patch\n      subject: Update leds behaviour\n      body: null\n    - hash: b71482284f2cedfab7fc920bd0426992b0e123d7\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove commented code\n      body: null\n    - hash: f9cbff1eec963b8dbf98d4016964a73f072e2e5a\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: ProgressButton is a PureComponent\n      body: null\n    - hash: a3a9edd41a0e570b996f58ff6379e53e2f8a3fc3\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Make Flash component a class & rename it FlashStep\n      body: null\n    - hash: 52f80293a29ba841112cd5cb75a13e5d6b877ea2\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove dead code\n      body: null\n    - hash: 72c9d616fd2aa05f4589e9af8385cb56f5beb16e\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove useless comment\n      body: null\n- version: 1.5.89\n  date: 2020-05-14T09:53:05.000Z\n  commits:\n    - hash: c5c0d46ab8d9c2e9fa9186ae5bce77cd360e785b\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update @types/mocha 5 -> 7\n        change-type: patch\n      subject: Update @types/mocha 5 -> 7\n      body: null\n    - hash: 4257e696dacf19fcd6dd48d85d1c29ea7e5a8aa0\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update @types/semver 6 -> 7\n        change-type: patch\n      subject: Update @types/semver 6 -> 7\n      body: null\n    - hash: 84f003d907b0372430ef894faca06d36a2734ab6\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update @types/sinon 7 -> 9\n        change-type: patch\n      subject: Update @types/sinon 7 -> 9\n      body: null\n    - hash: b1cbf547110912399749708ed6ecc737928b4e57\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update @types/tmp 0.1.0 -> 0.2.0\n        change-type: patch\n      subject: Update @types/tmp 0.1.0 -> 0.2.0\n      body: null\n    - hash: 7bd8b0c1526878913e9fab71fa571bfde782856b\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Remove no longer used chalk dev dependency\n        change-type: patch\n      subject: Remove no longer used chalk dev dependency\n      body: null\n    - hash: 7099a36bdb7fb47387efa053d3f641c87d1eaaa6\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update electron-notarize 0.1.1 -> 0.3.0\n        change-type: patch\n      subject: Update electron-notarize 0.1.1 -> 0.3.0\n      body: null\n    - hash: 8782c706408dff9d74c77fd351a4e42a14be9dc7\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Remove no longer used html-loader dev dependency\n        change-type: patch\n      subject: Remove no longer used html-loader dev dependency\n      body: null\n    - hash: a09e029216df198674cd18db7bc7b8e1d4767836\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update husky 3 -> 4\n        change-type: patch\n      subject: Update husky 3 -> 4\n      body: null\n    - hash: f1214e6ffd47b839cd48a47e9ad5616cef860f17\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update lint-staged 9 -> 10\n        change-type: patch\n      subject: Update lint-staged 9 -> 10\n      body: null\n    - hash: 5ab69dfb7fc284e21ac02b19b8d138f4ef8bae54\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update node-gyp 3 -> 6\n        change-type: patch\n      subject: Update node-gyp 3 -> 6\n      body: null\n    - hash: b0af9d535a06bff5d0823e4fe6ed919055c6dadf\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update sinon 8 -> 9\n        change-type: patch\n      subject: Update sinon 8 -> 9\n      body: null\n    - hash: ad421eae117d24d5edf3ef325ab40a1c3231ff9b\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update ts-loader 6 -> 7\n        change-type: patch\n      subject: Update ts-loader 6 -> 7\n      body: null\n    - hash: 627adb1755de5bc3db9608cf8f7da2d3309796c4\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update @types/node 12.12.24 -> 12.12.39\n        change-type: patch\n      subject: Update @types/node 12.12.24 -> 12.12.39\n      body: null\n    - hash: 92801133503d696c83ea0a2acaeef1cd1602263b\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update all dependencies minor versions\n        change-type: patch\n      subject: Update all dependencies minor versions\n      body: null\n    - hash: 943765bd4d79cba1644c98c22790321c8b9711f8\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Fix drive selector modal padding\n        change-type: patch\n      subject: Fix drive selector modal padding\n      body: null\n- version: 1.5.88\n  date: 2020-05-12T17:28:12.000Z\n  commits:\n    - hash: b23bfc2f6e588e851cc345f2bdaf9aef2c2bd37a\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update uuid v3 -> v8\n        change-type: patch\n      subject: Update uuid v3 -> v8\n      body: null\n    - hash: 6db800d6d2a54964bd761c2d27aef3ae1dc83465\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update tmp 0.1.0 -> 0.2.1\n        change-type: patch\n      subject: Update tmp 0.1.0 -> 0.2.1\n      body: null\n    - hash: 82a0b8de0c914b3e467298df1f53da911558708f\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update semver 5 -> 7\n        change-type: patch\n      subject: Update semver 5 -> 7\n      body: null\n    - hash: 50586cdb42cbe0debc4af83657806856e52ffdb1\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update debug 3 -> 4\n        change-type: patch\n      subject: Update debug 3 -> 4\n      body: null\n    - hash: ef5762864f1340e069f456fb070274d1e94caadf\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update redux 3 -> 4\n        change-type: patch\n      subject: Update redux 3 -> 4\n      body: null\n    - hash: 917ff89d9dfdb676401d8eb447ec682d4713dcf5\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update electron-updater 4.0.6 -> 4.3.1\n        change-type: patch\n      subject: Update electron-updater 4.0.6 -> 4.3.1\n      body: null\n    - hash: bfb61338718fde79abd2a0b11ca588368f567ebb\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update rendition 12 -> 14, styled-system and styled-components 4 -> 5\n        change-type: patch\n      subject: Update rendition 12 -> 14, styled-system and styled-components 4 -> 5\n      body: null\n    - hash: 483d7b6e587157153b63a0ab1a35d9b644003096\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update roboto-fontface 0.9.0 -> 0.10.0\n        change-type: patch\n      subject: Update roboto-fontface 0.9.0 -> 0.10.0\n      body: null\n- version: 1.5.87\n  date: 2020-05-12T11:45:32.000Z\n  commits:\n    - hash: 6e20b6034e2a79c0b96ef39b280cdad8d03f7b4d\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update etcher-sdk to ^4.1.3 to fix issues with some bz2 files\n        change-type: patch\n      subject: Update etcher-sdk to ^4.1.3 to fix issues with some bz2 files\n      body: null\n- version: 1.5.86\n  date: 2020-05-06T15:46:41.000Z\n  commits:\n    - hash: 4a6a471345117d33f37f4397de26ed33c04a1120\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Fix theme warnings\n        change-type: patch\n      subject: Fix theme warnings\n      body: null\n    - hash: 71e02ef8339071b95628e1dfa4f3e62519f29d91\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Prefer balena-etcher to etcher-bin on Arch Linux\n        change-type: patch\n      subject: Prefer balena-etcher to etcher-bin on Arch Linux\n      body: null\n- version: 1.5.84\n  date: 2020-05-05T16:43:37.000Z\n  commits:\n    - hash: 4d3eb2887c20a7b9f74b94a690ae8abe52aa378a\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Fix notification icon path\n        change-type: patch\n      subject: Fix notification icon path\n      body: null\n    - hash: f84cde7d0403060f1bdffe176ec91a999768b566\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update etcher-sdk to ^4.0.1\n      body: null\n    - hash: eb47f1227adfe3f142260c96a8e20ed6d28cd34a\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Fix libpango dependency name on debian\n      body: null\n    - hash: 5de4fe3d235172fe271e89c22ecb0cd45efd489b\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Don't depend on lsb for the rpm package\n      body: null\n    - hash: ebd37b9e2f6968bce0a41a05abac8cfe3ab161c4\n      author: Rich Morin\n      footers:\n        change-type: patch\n      subject: Correct two nomenclature errors\n      body: >-\n        PC keyboards have \"Alt\" keys; Mac keyboards have \"Opt\" keys.\n\n        Although it's possible to use a PC keyboard on a Mac, it's unusual.\n\n        In any case, all of the macOS (not \"Mac OS\" for some years now)\n        documentation refers to the \"Opt\" key.\n    - hash: ea11f179542794294f773f503d83dad3a10cda56\n      author: Tom\n      footers:\n        changelog-entry: Including Arch / Manjaro install instructions\n        change-type: patch\n        signed-off-by: Tom Carrio <tom@carrio.dev>\n      subject: \"docs: Including Arch / Manjaro install instructions\"\n      body: null\n    - hash: 49491b9b8c34ac7bcdbc1b957f50ee676100084e\n      author: TheRealTachyon\n      footers:\n        change-type: patch\n      subject: Update to README.md\n      body: Just a simple addition of instructionsfor proper installation on OpenSUSE\n        Linux.\n    - hash: 7971a003cc2d86d31839407ea87d1e27e2eba653\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update copyright years\n      body: null\n- version: 1.5.83\n  date: 2020-04-30T12:04:53.000Z\n  commits:\n    - hash: ee62b9a4c762b793bde2d7472bfe5f5a61b4de30\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Decompress images before flashing, remove trim setting, trim\n          ext partitions\n        change-type: patch\n      subject: Decompress images before flashing, remove trim setting, trim ext\n        partitions\n      body: null\n    - hash: 9bf58c89d4adadfe6d3d7c45a109542fa8e079e1\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update resin-lint -> @balena/lint\n      body: null\n    - hash: 745a2f18864b9235e168971f1f48c26c5f9a1e4a\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove no longer used settings and checks\n      body: null\n    - hash: 795b8614adc0287d73a2766ff493238bdbab91bc\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Send applicationSessionUuid and flashingWorkflowUuid by default in\n        logEvent\n      body: null\n    - hash: ba39ff433d550ec36e71e311ac9da14f40ce0a34\n      author: Alexis Svinartchouk\n      subject: remove update lock\n      body: null\n    - hash: ffe281f25d1d7496a349f176cac043ebd5890e3d\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Simplify settings\n      body: null\n    - hash: 44fc429f64c54bb0c790dba48411b71f6af13bfe\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Factorize duplicated configUrl code\n      body: null\n    - hash: e62add68938fa6449943bf9822e0ca6f50e2d68f\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove some `any`s\n      body: null\n- version: 1.5.82\n  date: 2020-04-23T17:45:47.000Z\n  commits:\n    - hash: 8f39dbf6b120516106b8d44cec34828350b3adb2\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: none\n        changelog-entry: Add staging percentage for v1.5.81\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Add staging percentage for v1.5.81\n      body: null\n    - hash: dbe6fe442d00bcf7f501e8fd5c3c0354b7312777\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: none\n        changelog-entry: Trigger update for v1.5.81\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Trigger update for v1.5.81\n      body: null\n    - hash: 124e8af649c8596dfd7ee28da887d73c1a133d84\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Add flash from url workflow\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Add flash from url workflow\n      body: null\n    - hash: 94a0be3b057d9e0974dc78bbdd886a8849626407\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Refactor buttons style\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Refactor buttons style\n      body: null\n    - hash: ac2e973cb0f289e1367f1a14388d35da79c9a378\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Add generic error's message\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Add generic error's message\n      body: null\n    - hash: 39ed67d667cd75262c8d90216c9c5e855232f9fb\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Allow http/https only for Flash from URL\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Allow http/https only for Flash from URL\n      body: null\n- version: 1.5.81\n  date: 2020-04-16T16:28:59.000Z\n  commits:\n    - hash: 7eddb16f2f2899159a2216828b3c4e6084daa748\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update etcher-sdk to use direct IO\n        change-type: patch\n      subject: Update etcher-sdk to use direct IO\n      body: null\n    - hash: 63ad3739fd133adf44a378282145d4c92e5e3ea6\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Fix FlashResults component\n      body: null\n    - hash: d63df5a15639aab258abbddb6b5b01fcc3ccc4b4\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update bluebird\n      body: null\n    - hash: 82a3c37c16d73ad71417e3cd5ceab6081c415d13\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove no longer needed ts-ignore comments, fix typos\n      body: null\n    - hash: 52cf6375eb86be24cd3cc5901bab9c19d510b5ce\n      author: Wilson de Farias\n      footers:\n        changelog-entry: \"docs: Update macOS drive recovery command\"\n        change-type: patch\n      subject: Fixes the Command for macOS drive recovery\n      body: >-\n        Changes the documentation to update the disktutil command which didn't\n        fix my case, cause the boot partition was broken.\n\n        This way it rewrites the drive into a FAT32 partition editable in\n        Unix/Windows.\n    - hash: b3f25c176b1bdb487d1a7bf111d7f170fe008842\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        changelog-entry: Add average speed in flash results\n        change-type: patch\n      subject: Add average speed in flash results\n      body: null\n- version: 1.5.80\n  date: 2020-03-24T13:51:52.000Z\n  commits:\n    - hash: b4b099ecb19578d3d359bff6ce9e99265156e3f8\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Fix sass files path for lint-sass\n        change-type: patch\n      subject: Fix sass files path for lint-sass\n      body: null\n    - hash: 21181f011fc5068bd7d4a610e5beb9b2cecddb8b\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update electron to v7.1.14\n        change-type: patch\n      subject: Update electron to v7.1.14\n      body: null\n    - hash: 8b2f06442aa5ad8ed6a9a414ef7e7035e0b245d1\n      author: Anthony Rouneau\n      footers:\n        change-type: patch\n      subject: Update README to use port 443 to get keys from keyserver.ubuntu.com\n      body: null\n    - hash: 4ee83d9da49667d5238394e5997211dfc77a980e\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Use zoomFactor to scale contents in fullscreen mode\n      subject: Use zoomFactor to scale contents in fullscreen mode\n      body: null\n    - hash: be729c87af68b0822b2c0fac04112bdc1b743fc5\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove useless if\n      body: null\n- version: 1.5.79\n  date: 2020-02-20T17:31:35.000Z\n  commits:\n    - hash: d8cb8f78154910f46b70f4b2537d57169b1a0b60\n      author: Alois Klink\n      footers:\n        change-type: patch\n        changelog-entry: Fix error when launching from terminal when installed via apt.\n        fixes: https://github.com/balena-io/etcher/issues/3074\n      subject: \"fix(afterPack): error on launch from deb terminal\"\n      body: |-\n        When installing balena-etcher via apt on Debian/Ubuntu,\n        the command `balena-etcher-electron` fails with the error:\n        line 3: /usr/bin/balena-etcher-electron.bin: No such file or directory\n        This is because the /usr/bin/balena-etcher-electron is a symlink\n        to /opt/balenaEtcher/balena-etcher-electron, but the script looks\n        for balena-etcher-electron.bin in the symlink directory, not the\n        actual script location directory.\n        This commit uses `$(dirname \"$(readlink -f \"${BASH_SOURCE[0]}\")\")` to\n        find the real location of the balena-etcher-electron script without\n        symlink, so that balena-etcher-electron.bin is correctly found.\n    - hash: 0b20a1eeaa0ef02a0df65d90e66ba5a6f794edf6\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Remove \"Download the React DevTools for a better development\n          experience\" message\n        change-type: patch\n      subject: Remove \"Download the React DevTools for a better development\n        experience\" message\n      body: null\n- version: 1.5.78\n  date: 2020-02-19T17:27:31.000Z\n  commits:\n    - hash: 55dcfc1a8503229e9be85599bba0d9c89d593052\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update drivelist to 8.0.10 to fix parsing lsblk --pairs\n        change-type: patch\n      subject: Update drivelist to 8.0.10 to fix parsing lsblk --pairs\n      body: null\n- version: 1.5.77\n  date: 2020-02-17T20:15:55.000Z\n  commits:\n    - hash: ed90f21188ad1a67bd645045b5425b45012e4290\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Running `make lint` will now fix the typescript files\n      body: null\n    - hash: 94d262263cbaebdbc5e70ceb0213fa13b7266fac\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: The RGBLed module has been moved to a separate repository\n        change-type: patch\n      subject: The RGBLed module has been moved to a separate repository\n      body: null\n    - hash: 93d319275f1b139fce11ae8eccb82e636ad82708\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Fix imports in lib/start.ts\n      body: null\n    - hash: 42032964146effb7d66c043d79a41de41fb042e4\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Fix error message not being shown on write error\n        change-type: patch\n      subject: Fix error message not being shown on write error\n      body: null\n    - hash: 7991d4076083c135a531b78a9a1ccec5137e333d\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Specify flashImageToDrive return type\n      body: null\n- version: 1.5.76\n  date: 2020-02-06T13:53:15.000Z\n  commits:\n    - hash: 45262583e6cbe41cf9f54c3f8a378c15c5ccd0af\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update etcher-sdk to ^2.0.17\n        change-type: patch\n      subject: Update etcher-sdk to ^2.0.17\n      body: null\n    - hash: 07be84498545c1288054169ec2280ddb870a527c\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Fix image drop zone, remove react-dropzone dependency\n        change-type: patch\n      subject: Fix image drop zone, remove react-dropzone dependency\n      body: null\n    - hash: 6f58344e7bec8347182f9ac8d151931f48669c01\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Prefix temp permissions script name\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Prefix temp permissions script name\n      body: null\n- version: 1.5.75\n  date: 2020-02-05T12:35:11.000Z\n  commits:\n    - hash: fdec65e9bdf849b52030a9f1ea16e4654c5397e7\n      author: Omar López\n      footers:\n        fixes: \"#3056 #3057 #3058\"\n        change-type: patch\n        changelog-entry: Initialize leds object map\n      subject: Initialize leds object map\n      body: null\n- version: 1.5.74\n  date: 2020-02-04T22:15:40.000Z\n  commits:\n    - hash: 9caa42d25703a98e624a3674bd803c9b28e29fba\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove unused settings.assign function\n      body: null\n    - hash: 6fcd9e15950b35130bacc42b1a8c811e4b920169\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove settings.getDefaults function\n      body: null\n    - hash: 571a3533fb839cb4386cf4a5f467cef776ffab6c\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Load settings before rendering the app\n      body: null\n    - hash: c09237f0c3e424344da3316abedc0a89fb2be237\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Sort devices by device path on Linux\n        change-type: patch\n      subject: Sort devices by device path on Linux\n      body: null\n    - hash: 990dcc9d5a97baf8bc6f5ee2c8eadb97b60d31b5\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Fix loading driveBlacklist settings\n      body: null\n    - hash: f2705a611d63e048fea55d472db9c7a790721d8a\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update mocha and electron-mocha\n      body: null\n    - hash: af64579eb2fa8e78cb7e0ef9825f1c518e43fc51\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update resin-lint to ^3.2.0\n      body: null\n    - hash: a22ea0b82b87ac90b8640c58d846f802e7ef0535\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update scripts submodule to prevent electon-mocha crashes on CI\n      body: null\n    - hash: 2aa6c83714e9557c86de3717bd3387dd0fb15e83\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update electron to 7.1.11\n        chanege-type: patch\n      subject: Update electron to 7.1.11\n      body: null\n    - hash: 81e80572d8f7769d20d2854cbe6923e3483b11ac\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: A warning about the selected image does not prevent the selection\n      body: This was introduced in 1.5.72\n    - hash: c200a0c7ac19e97f65f689a42c53443ce8feaad7\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Compress deb package with bzip instead of xz\n        change-type: patch\n      subject: Compress deb package with bzip instead of xz\n      body: \"7za fails on ia32 CI with \\\"ERROR: Can't allocate required memory!\\\"\"\n    - hash: cb8168de41ce3323e43b1e486e91936e7f129f41\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Etcher pro leds feature\n        change-type: patch\n      subject: Etcher pro leds feature\n      body: null\n    - hash: 227bad9e997ac890338bc23fc4a9a7e906c5d6e7\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Keep leds sysfs files open\n      body: null\n- version: 1.5.73\n  date: 2020-01-29T13:54:19.000Z\n  commits:\n    - hash: 945cd7ff8e0b811607ef457edca4ec3ec1242e5e\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update electron to v7.1.10\n        change-type: patch\n      subject: Update electron to v7.1.10\n      body: null\n    - hash: fc694b90b6a59d4761cf3329120cdedec6ea37a6\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Target es2018\n      body: null\n    - hash: 2bdcae72090969040725a01b28e45f6a3282162d\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove unused BUILD_TEMPORARY_DIRECTORY scripts parameter\n      body: null\n- version: 1.5.72\n  date: 2020-01-17T15:36:41.000Z\n  commits:\n    - hash: 2c227d347567eab36ab9ed05b0a290d5b591d48d\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: none\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Trigger update for 1.5.71\n      body: null\n    - hash: 05c2f5bebd2896875b5f4a7f4e4eac976c86da67\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Remove no longer used closestUnit angular filter\n        change-type: patch\n      subject: Remove no longer used closestUnit angular filter\n      body: null\n    - hash: 65293ea5e4eec7f75c97d0f4027c2913dc73d821\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove no longer used ModalService\n      body: null\n    - hash: b71824c5e895969b1c8750d29ff085999819e10b\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove no longer used angular-if-state\n      body: null\n    - hash: 04e0b56dd5f87a7e53813f90fa19ea49d2f11608\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Remove no longer used angular svg-icon component\n        change-type: patch\n      subject: Remove no longer used angular svg-icon component\n      body: null\n    - hash: 54fda697ce9dc5340dd182cecde9938c00fd4a8c\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove no longer used .section-footer-main css rules\n      body: null\n    - hash: c27be733a98de78e44ba8af2f9d488a440e0b101\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove no longer used angular-ui-bootstrap\n      body: null\n    - hash: e2f5775b07c0c3afe8c17119f81c7d556e7b103e\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove no longer needed angular specific utils.memoize\n      body: null\n    - hash: 2cd60af841c15eeb133622b83d07a036905d4ae9\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove no longer used angular flash-results component\n      body: null\n    - hash: 3a7d770f6d106f337bbb4c7d8af158abf430d76c\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove no longer used angular flash-another component\n      body: null\n    - hash: 315051c14c3b1a3be1d5ddc7949781d5537e2c4e\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove useless 'use strict' from a ts file\n      body: null\n    - hash: 146bfaa9debbe0f291bdcbaf126fc7e24f730eac\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove unused StateController.previousName\n      body: null\n    - hash: 26d0e463674dc51267e48f545ccde78d3e7c9e79\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Convert angular SafeWebview to typescript\n      body: null\n    - hash: d5eb679cf06754a3209bb0e3f672361a5dcd231f\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove remaining angular\n      body: null\n    - hash: 47fd12e7a441704f0546e1ae503b7649d10bff7d\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove html-angular-validate\n      body: null\n    - hash: f31cb49e2a4b496a27d498cc1cd3945712ae6e3f\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Don't use prop-types in drive selector\n      body: null\n    - hash: 233a2e640063c23b12f5dd4a43011e3926924198\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Convert menu.js to typescript\n      body: null\n    - hash: b4a60cfee2b7b9e8704daa9d88530d4fe9a15490\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove unused styled-components.js\n      body: null\n    - hash: 255fae3a9010e5aabb89b4557a2d29b922db0af7\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Convert middle-ellipsis.js to typescript\n      body: null\n    - hash: b266a727266427bd9879958c639136e67a17063c\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Convert window-network-drives.js to typescript\n      body: null\n    - hash: ddd1ff0101dd0005d671f8b8e8aca53c63dbf472\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Convert progress-status.js and window-progress.js to typescript\n      body: null\n    - hash: 13dfb090b5c09e3dd50402d49d801d573ab98686\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Convert open-external.js to typescript\n      body: null\n    - hash: c1e24406d9ecbbbc0e371cc6605396d7711e22a5\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Convert notification.js to typescript\n      body: null\n    - hash: 596b316d6532487ed82b896455ca6da9c1cc7b5d\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Convert update-lock.js to typescript\n      body: null\n    - hash: fadfadd9e9bcb5035d1825274c9034e402e96a0b\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Convert exception-reporter.js to typescript\n      body: null\n    - hash: a5825373e14004450feb5a42a2d47ea072ec0523\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Convert analytics.js to typescript\n      body: null\n    - hash: 0377faadd615be4804b1648b372c623a9470ae44\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Convert drive-scanner.js to typescript\n      body: null\n    - hash: f366a681592a062cee1c2537fcd6e10f518c34ed\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Convert theme.js to typescript\n      body: null\n    - hash: ef491e1e961451a33b05cb7be922a84e9db12a67\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove no longer used lib/gui/app/models/files.js and its tests\n      body: null\n    - hash: e50974a86a5ddf580d043f0d344cce431eb287e2\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Convert local-settings.js to typescript\n      body: null\n    - hash: 109d84302cc247dc75894f437e8cb313417684a7\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove no longer used storage.js and its tests\n      body: null\n- version: 1.5.71\n  date: 2020-01-14T16:15:05.000Z\n  commits:\n    - hash: b4fb82066b0746945f30bf3a72d78f319d7a578c\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Update resin-corvus to 2.0.5\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Update resin-corvus to 2.0.5\n      body: null\n    - hash: 171a5b17935b5fb0995fbe3f8f9c158b0a062a1b\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Update scripts submodule\n      body: null\n    - hash: 12b5536e22457c69c33073b4b937bfa1a235aae5\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Don't webpack package.json as analytics tokens are interted after\n        webpacking\n      body: null\n- version: 1.5.70\n  date: 2019-12-13T18:25:53.000Z\n  commits:\n    - hash: 5cd3c5fcc086d619a35ae6a4930412a60569e20c\n      author: Lucian\n      footers:\n        change-type: patch\n        changelog-entry: Use React instead of Angular for image selection\n        signed-off-by: Lucian <lucian.buzzo@gmail.com>\n      subject: Refactor image-selection\n      body: null\n    - hash: 1d15d582d99fbffb870dd564673da73a70a59088\n      author: Stevche Radevski\n      footers:\n        changelog-entry: \"chore: move flash step to React\"\n        change-type: patch\n        signed-off-by: Stevche Radevski <stevche@balena.io>\n      subject: \"chore: move flash step to React\"\n      body: null\n    - hash: abfc6be84d971670fd2914432caaa42263cfe260\n      author: Thodoris Greasidis\n      footers:\n        change-type: patch\n        changelog-entry: Convert the drive selection step to React\n        signed-off-by: Thodoris Greasidis <thodoris@balena.io>\n      subject: Convert the drive selection step to React\n      body: null\n    - hash: 8177e980147e7154319edb30b0e3304e3d13f6bd\n      author: Thodoris Greasidis\n      footers:\n        change-type: patch\n        signed-off-by: Thodoris Greasidis <thodoris@balena.io>\n      subject: Refactor the DriveSelector to use async-await\n      body: null\n    - hash: 641dde81e51c2c95edd212dae8ef242a8c27f380\n      author: Lucian\n      footers:\n        change-type: patch\n        changelog-entry: Use React instead of Angular for image selection\n        signed-off-by: Lucian <lucian.buzzo@gmail.com>\n      subject: Refactor image-selection\n      body: null\n    - hash: 00536cba3aea1a59c2ce595d9b1fabaade0ecff9\n      author: Lucian\n      subject: Refactor Warning modal in image selection\n      body: null\n    - hash: 21d9d31a27939eb6997faa78b510a6c7e375ebed\n      author: Stevche Radevski\n      footers:\n        change-type: patch\n        signed-off-by: Stevche Radevski <stevche@balena.io>\n      subject: Use rendition modal for warning and errors when flashing\n      body: null\n    - hash: 996c2b55a426987bbea1821f24754cea31af3bd1\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Run make sass\n      body: null\n    - hash: b6fb44d6a51aac748479c2a1d7a80255f35cce1b\n      author: Lucian\n      footers:\n        signed-off-by: Lucian <lucian.buzzo@gmail.com>\n      subject: Fix bug where images can't be reselected\n      body: null\n    - hash: a7a7f83e3e08b95c16a1b4783c5692aa9962b440\n      author: Lucian\n      footers:\n        signed-off-by: Lucian <lucian.buzzo@gmail.com>\n      subject: Fix link hover color\n      body: null\n    - hash: 177f10f76d3846d8c0c7eca35582e938b728e370\n      author: Lucian\n      footers:\n        signed-off-by: Lucian <lucian.buzzo@gmail.com>\n      subject: Refactor tooltip modal to use react\n      body: null\n    - hash: fc597abbc98fa498108fe7688892a66a620d42e9\n      author: Lucian\n      footers:\n        signed-off-by: Lucian <lucian.buzzo@gmail.com>\n      subject: Add sourcemap and elevate theme provider\n      body: null\n    - hash: ffb26ba67f063a87b922bf5905029547672c7299\n      author: Lucian\n      footers:\n        signed-off-by: Lucian <lucian.buzzo@gmail.com>\n      subject: Remove unused methods from drive selector component\n      body: null\n    - hash: 330405ae42575aec428c051d69915b676873988e\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove tooltip-modal scss import\n      body: null\n    - hash: 07fc7af911bbc647e0aa56446989b7f51da6c337\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove experimental file picker\n      body: null\n    - hash: 28b51a9b460df0c2a8fb37b11859065517c9a5b9\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove unused imports in main.js\n      body: null\n    - hash: 84fe5004a9fbe4cd73d6c3d8e556de6ba4250f77\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove broken settings shortcut from menu\n      body: null\n    - hash: 8e47829905ec4b707f99bbdff705a23b398835df\n      author: Stevche Radevski\n      footers:\n        change-type: patch\n        signed-off-by: Stevche Radevski <stevche@balena.io>\n      subject: Move the main controller to React\n      body: null\n    - hash: 4e1f0719519f6e87cd7ca81a98b61c479a78397a\n      author: Stevche Radevski\n      footers:\n        change-type: patch\n        signed-off-by: Stevche Radevski <stevche@balena.io>\n      subject: Change Flash and Driveselector extension to .tsx\n      body: This is so the git history is preserved for the file\n    - hash: 388852d6b783c428df18a8f4ce44a512ed57e858\n      author: Stevche Radevski\n      footers:\n        change-type: patch\n        signed-off-by: Stevche Radevski <stevche@balena.io>\n      subject: Move a couple of files to typescript and remove unnecessary $timeout\n      body: null\n    - hash: 9f4e0ce92018d68911a208392bf53dbb476857c6\n      author: Stevche Radevski\n      footers:\n        change-type: patch\n        signed-off-by: Stevche Radevski <stevche@balena.io>\n      subject: Add husky and lint-staged to run linting on commit\n      body: null\n    - hash: c9c9c50d6c35485f965712ad0599fbe7c5d2a25c\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Rework finish page with React\n      body: null\n    - hash: 68d9542816fdfe7be49f3e8404ab970b96b9535b\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Convert FlashAnother & FlashResults to typescript\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Convert FlashAnother & FlashResults to typescript\n      body: null\n    - hash: 84e45caa6c3c4699612324b0ae64cdd76951664e\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n        changelog-entry: Rework lib/gui/app/styled-components to typescript\n      subject: Rework lib/gui/app/styled-components to typescript\n      body: null\n    - hash: 992b8a6fb6d3d1bfa4f0fdd85f3cc5d03c75a58f\n      author: Stevche Radevski\n      footers:\n        change-type: patch\n        signed-off-by: Stevche Radevski <stevche@balena.io>\n      subject: Fix layout when flashing\n      body: null\n    - hash: 2f0ce3ee375967af9201502b9192445957b04be0\n      author: Alexis Svinartchouk\n      subject: Only run prettier on ts and tsx files\n      body: null\n    - hash: fe230e7d3094a5f8e761108c3b1550dbdd125d9c\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Rename resin -> balena\n      body: null\n    - hash: 67eb593164065b04124ae5ea738f272185c19a0f\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove manifest-bind\n      body: null\n    - hash: 3bdac794b31a2b8a0efce8a8ae04f2fa1f3d3c14\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: React header\n      body: null\n    - hash: 4c931278b8dbf1e80e5680eca93687635e8bdce9\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove angular os-open-external directive\n      body: null\n- version: 1.5.69\n  date: 2019-12-10T11:33:29.000Z\n  commits:\n    - hash: 1408dd48a1c2f4c551f3d4dd39cf7ec4c09f17b3\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Don't add --no-sandbox when ELECTRON_RUN_AS_NODE true\n        change-type: patch\n      subject: Don't add --no-sandbox when ELECTRON_RUN_AS_NODE true\n      body: null\n- version: 1.5.68\n  date: 2019-12-09T09:41:54.000Z\n  commits:\n    - hash: 7d284a7e189f2f545d8cb169122be0afe977fa5d\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Add version in settings modal\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Add version in settings modal\n      body: null\n- version: 1.5.67\n  date: 2019-12-06T11:48:18.000Z\n  commits:\n    - hash: 2ef38fe06ddd86a54ca00c6b68cf277d3b96f182\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Fix elevation on macos in development\n        change-type: patch\n      subject: Fix elevation on macos in development\n      body: null\n- version: 1.5.66\n  date: 2019-12-03T16:28:10.000Z\n  commits:\n    - hash: 1626c01ff4bc611a11df65d41a2222bb14266f0b\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n        changelog-entry: Update electron to 6.0.10\n      subject: Update electron to 6.0.10\n      body: null\n    - hash: d071bf8ade4e49cf65328af7e1547e890ca0c09f\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update electron-mocha to ^8.1.2, remove acorn\n        change-type: patch\n      subject: Update electron-mocha to ^8.1.2, remove acorn\n      body: null\n    - hash: 9488468b67256f2eaf365300efc06cdbbc12b58c\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Remove node-pre-gyp patch that is no longer needed with electron 6\n        change-type: patch\n      subject: Remove node-pre-gyp patch that is no longer needed with electron 6\n      body: null\n    - hash: caf09e749881a2665051f2d339a286495b47e947\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Remove no longer needed xml2js\n        change-type: patch\n      subject: Remove no longer needed xml2js\n      body: null\n    - hash: 2c2057b5cbb390e43b8e6b9d4a22d34cf0f1a528\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update mocha, remove nock\n        change-type: patch\n      subject: Update mocha, remove nock\n      body: null\n    - hash: 07a6e409173b919f12f85fcc86823db44df3b8cd\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Remove no longer needed pkg dev dependency\n        change-type: patch\n      subject: Remove no longer needed pkg dev dependency\n      body: null\n    - hash: 1be1a2b8f7df4caf1b53795099f7e2b5c4b3c133\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Require angular-mocks only when needed\n        change-type: patch\n      subject: Require angular-mocks only when needed\n      body: null\n    - hash: 1098f8cb1e7e209cc29cb7b3953dacf9fa671bf6\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Use the same entrypoint for etcher and the child writer\n        change-type: patch\n      subject: Use the same entrypoint for etcher and the child writer\n      body: null\n    - hash: 994d311ed37afe6ff22ba810602a30426215066c\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update nan to ^2.14\n        change-type: patch\n      subject: Update nan to ^2.14\n      body: null\n    - hash: cf6863b2c6d5d3e115222bbaa0ae81911e1d0bb5\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update dependencies, get node-usb from npm\n        change-type: patch\n      subject: Update dependencies, get node-usb from npm\n      body: null\n    - hash: cddd068887ac48cf4a9856c4b3a671092d3cb913\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update spectron to ^8\n        change-type: patch\n      subject: Update spectron to ^8\n      body: null\n    - hash: 707c20513ea27cd67b0a6c44a94759fa9c594b39\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Simplify electron-builder files config\n      body: null\n    - hash: 4f36b00ec366a6d753f646bedbb60bf61f5a691b\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Simplify webpack config\n      body: null\n    - hash: 5b22fcc2f5a74839aac5151e7edb8d99ba06b8eb\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove unused script\n      body: null\n    - hash: 2f828b1d39c8c91ec69b991de7b329c8092bdd9e\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Wrapper script for linux to add --no-sandbox when running as root\n      body: null\n    - hash: 26e827e4dcae0ee3083016b5f8b7f37b9145f955\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update electron to 6.1.4\n      body: null\n    - hash: 18fb9c9de36d15dfaedd20d06c08294994b758d1\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Package dll files (needed for lzma_native on windows)\n      body: null\n    - hash: 59230a0f9e54b4885e8f6b4b100f5e7a9acd7e4f\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Fix windows elevation module import\n      body: null\n    - hash: bcbbb64042b5d37f911be5c879503a6b1b3364d7\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update dependencies after rebase\n      body: null\n    - hash: 062723bf15d5d4e17add01360a9de6c02d10a8c2\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Fix typing in settings.tsx\n      body: null\n    - hash: 220b7f6d53163db224b373d6d064593c2a2b60fa\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove usage of deprecated componentWillReceiveProps\n      body: null\n- version: 1.5.65\n  date: 2019-12-03T10:06:44.000Z\n  commits:\n    - hash: 4c0a079d1e4abcc054ddb74b3a34a39a6d5085d1\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Refactor settings page into modal\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Refactor settings page into modal\n      body: null\n    - hash: 3b0794606530f201bab6d0e0aec15d6f420b006a\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Convert settings modal to typescript\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Convert settings modal to typescript\n      body: null\n- version: 1.5.64\n  date: 2019-11-27T14:09:44.000Z\n  commits:\n    - hash: 572f7d826a4efb96e893e955d42b32c0d5582024\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n        changelog-entry: Use bash instead of sh for running the elevated process on\n          Linux and Mac\n      subject: Use bash instead of sh for running the elevated process on Linux and Mac\n      body: null\n- version: 1.5.63\n  date: 2019-11-08T13:00:14.000Z\n  commits:\n    - hash: 88b7665b7fdcf5b716125fc823834f94fd869e20\n      author: Dimitrios Lytras\n      footers:\n        changelog-entry: Introduce an FAQ file\n        change-type: patch\n        signed-off-by: Dimitrios Lytras dnlytras@gmail.com\n      subject: \"docs: Introduce an FAQ file\"\n      body: Much needed file in order to generate the FAQ section for the website\n        using Landr\n- version: 1.5.62\n  date: 2019-11-06T17:35:43.000Z\n  commits:\n    - hash: c0d1899ad36284ba9b5c03385454115ad4db4589\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update drivelist to 8.0.9\n        change-type: patch\n      subject: Update drivelist to 8.0.9\n      body: null\n- version: 1.5.61\n  date: 2019-11-06T01:55:47.000Z\n  commits:\n    - hash: c4944f31d651fd8e40c8edcd54d7d6960b14fc06\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Notarize app on macOS\n      subject: Notarize app on macOS\n      body: null\n    - hash: 64a28f891fa8a9da47581bb67540a07caac1404b\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Don't pack files in an asar archive on macOS\n      body: null\n    - hash: 9b82891abb86fc27c3df531fa6e1086192de4f03\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Use sudo instead of sudo-prompt on macOS >= Catalina\n      body: null\n    - hash: 1ee2eb05ebc9d3c77048f0a688af8351a2b62cd8\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update electron-builder to ^22\n      body: null\n    - hash: 1b8380c5dc3fff14057a44ed442e317979274636\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update scripts repo as electron-builder's build command was renamed\n        electron-builder\n      body: null\n    - hash: d494cee0da8e985601b62a537c1ff79059691150\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Don't spell check scripts\n      body: null\n    - hash: f372fba1fd346d86d6c6995bd5101d5faeb6a55f\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Don't use electron-is-running-in-asar, fix AppImage builds\n      body: null\n- version: 1.5.60\n  date: 2019-10-18T11:31:04.000Z\n  commits:\n    - hash: 831e7af9ed338376a220b7749f83ecd88602e052\n      author: Matthew McGinn\n      footers:\n        changelog-entry: Upgrade ext2fs to 1.0.30\n        change-type: patch\n        signed-off-by: Matthew McGinn <matthew@balena.io>\n      subject: \"ext2fs: upgrade ext2fs to 1.0.30\"\n      body: null\n- version: 1.5.59\n  date: 2019-10-14T13:34:13.000Z\n  commits:\n    - hash: 5151d751a3d77918aeaa1cfb73d16a9e1d4ceda3\n      author: Roman Mazur\n      footers:\n        changelog-entry: Catch console log messages from SafeWebView\n        change-type: patch\n        signed-off-by: Roman Mazur <roman@balena.io>\n      subject: Catch console log messages from SafeWebView\n      body: |-\n        This simplifies debugging of the content loaded by Etcher,\n        including analysis of loaded analytics libraries.\n- version: 1.5.58\n  date: 2019-10-10T10:06:54.000Z\n  commits:\n    - hash: dda2f6eb7016851ef6e601769ba5e29ec0646818\n      author: Dimitrios Lytras\n      footers:\n        changelog-entry: Remove leftover GH-pages configuration file\n        change-type: patch\n        signed-off-by: Dimitrios Lytras dnlytras@gmail.com\n      subject: \"docs: Remove leftover GH-pages configuration file\"\n      body: null\n- version: 1.5.57\n  date: 2019-09-17T13:23:43.000Z\n  commits:\n    - hash: 93ea4efb3321302fa0efd5ae8c435e1b3906d5c8\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n        changelog-entry: Fix entrypoint when options are passed to electron\n      subject: Fix entrypoint when options are passed to electron\n      body: null\n- version: 1.5.56\n  date: 2019-08-20T14:41:51.000Z\n  commits:\n    - hash: 02bd8ed4594325838c8f2d3124c29fbb5f272afc\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Fix windows portable download\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Fix windows portable download\n      body: null\n- version: 1.5.55\n  date: 2019-08-20T11:21:43.000Z\n  commits:\n    - hash: f6c01722572e52140558040694ebbce10c2ec560\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n        changelog-entry: Update etcher-sdk to ^2.0.13\n      subject: Update etcher-sdk to ^2.0.13\n      body: null\n- version: 1.5.54\n  date: 2019-08-19T11:06:40.000Z\n  commits:\n    - hash: 8c2c4e233af0fbda2dd85266f7f7ce7fa15c98ba\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Fix auto-updater check for updates\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Fix auto-updater check for updates\n      body: null\n- version: 1.5.53\n  date: 2019-08-06T12:43:26.000Z\n  commits:\n    - hash: 8df5d972fc219fbe1ab567eaeb46e2c7d5be16e6\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Allow typescript files\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Allow typescript files\n      body: null\n    - hash: 865ea0ddd2a6f28acd1988645a97a2941e66e5c6\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: none\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Trigger update for 1.5.52\n      body: null\n- version: 1.5.52\n  date: 2019-07-23T12:56:48.000Z\n  commits:\n    - hash: b5d04a2031a766a203ce1998a1e401a6d0a8b963\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Don't use wmic's ProviderName if it's empty\n        change-type: patch\n      subject: Don't use wmic's ProviderName if it's empty\n      body: null\n- version: 1.5.51\n  date: 2019-06-28T13:02:52.000Z\n  commits:\n    - hash: b99b0d4bf86e9eb72d321ec64da3eee1811effbb\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n        changelog-entry: Update sudo-prompt to ^9.0.0\n      subject: Update sudo-prompt to ^9.0.0\n      body: null\n- version: 1.5.50\n  date: 2019-06-14T13:41:30.000Z\n  commits:\n    - hash: da548f59d18c081279eb5009bc8c979172c35045\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Replace promise chains with async/await in child-writer\n      body: null\n    - hash: 52a325881402001f148902db0c36075cb74aae5c\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Option for trimming ext partitions on raw images\n        change-type: patch\n      subject: Option for trimming ext partitions on raw images\n      body: null\n- version: 1.5.49\n  date: 2019-06-13T16:39:31.000Z\n  commits:\n    - hash: c5dc869c032f76aec005bf2d7c4f94c12fd586c2\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n        changelog-entry: Make window size configurable\n      subject: Make window size configurable\n      body: null\n- version: 1.5.48\n  date: 2019-06-13T14:26:49.000Z\n  commits:\n    - hash: ef4d2fcc7287db74c483691d563658de7dffbb3a\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Don't use sudo-prompt when already elevated\n        change-type: patch\n      subject: Don't use sudo-prompt when already elevated\n      body: null\n- version: 1.5.47\n  date: 2019-06-12T13:28:09.000Z\n  commits:\n    - hash: 3236d6b934f5e23b089145482f512564c4f45a4b\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Upgrade rendition to v8.7.2\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Upgrade rendition to v8.7.2\n      body: null\n    - hash: 33df23fc8cd02a1f74cb3fc232e2ad16345a8d6d\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Upgrade styled-system to v4.1.0\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Upgrade styled-system to v4.1.0\n      body: null\n    - hash: 543ba51d3cdc4d6e17dfab106c85980f92ffabd1\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Use rendition theme property for step buttons\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Add first rendition theme configs\n      body: null\n    - hash: 17f83135c57a6ff283e70f19b8477bcb11422fc2\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Rework drive-selector with react + rendition\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Rework drive-selector with react + rendition\n      body: null\n- version: 1.5.46\n  date: 2019-06-09T14:07:38.000Z\n  commits:\n    - hash: 6dae2a604ff25281939bd8962bb019adf430e0b3\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n        changelog-entry: Update ext2fs to 1.0.29\n      subject: Update ext2fs to 1.0.29\n      body: null\n- version: 1.5.45\n  date: 2019-06-04T09:56:25.000Z\n  commits:\n    - hash: d382f030f0ad0ddc2b64104b42ae0177d6ddf8c5\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n        changelog-entry: Empty commit to trigger build\n      subject: Empty commit to trigger build\n      body: null\n- version: 1.5.44\n  date: 2019-06-03T18:14:46.000Z\n  commits:\n    - hash: 6d8346b13a9fb9e99c4f65af22b1baf851f7e66f\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n        changelog-entry: Fix elevation on windows when the path contains \"&\" or \"'\"\n      subject: Fix elevation on windows when the path contains \"&\" or \"'\"\n      body: null\n- version: 1.5.43\n  date: 2019-05-28T18:57:07.000Z\n  commits:\n    - hash: de5bee29efa673b8237ccef45ec9805cfa9cd361\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Revert \"Include sass in webpack configs\"\n      subject: Revert \"Include sass in webpack configs\"\n      body: This reverts commit 156c25cea19bc4a382bb7ce672304546ce476d37.\n- version: 1.5.42\n  date: 2019-05-28T14:38:56.000Z\n  commits:\n    - hash: 156c25cea19bc4a382bb7ce672304546ce476d37\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Include sass in webpack configs\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Include sass in webpack configs\n      body: null\n- version: 1.5.41\n  date: 2019-05-27T13:57:19.000Z\n  commits:\n    - hash: 3fccd52884e82c4e7b57872ca0c3043cf13fc15c\n      author: Mateusz Hajder\n      footers:\n        change-type: patch\n        changelog-entry: waffle.io removal and adding a link to the license\n      subject: waffle.io removal and adding a link to the license\n      body: null\n- version: 1.5.40\n  date: 2019-05-27T10:14:10.000Z\n  commits:\n    - hash: f815e8511fafabbe1d73b8bbef4d7a8b57c8049d\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: windows installer and portable version support both ia32 and x64\n        change-type: patch\n      subject: Build packages that support both ia32 and x64 on windows\n      body: null\n    - hash: bed6643437d4005f0e87966dd79099b4cfc18e3f\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove some unused files from the packages\n      body: null\n- version: 1.5.39\n  date: 2019-05-14T10:25:05.000Z\n  commits:\n    - hash: aa527350067e3dc7460f8b5f893a755d4b8f8380\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Add clean-shrinkwrap script to postshrinkwrap step\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Add clean-shrinkwrap script to postshrinkwrap step\n      body: null\n    - hash: ffb89c7e5bebaa2bc3539560ad45a0de046b45eb\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Update scripts submodule to v1.5.2\n      body: null\n- version: 1.5.38\n  date: 2019-05-13T22:45:00.000Z\n  commits:\n    - hash: 0b5017f992e7fb94677772462884945d94260c6b\n      author: Carlo Maria Curinga\n      footers:\n        change-type: patch\n        changelog-entry: Add mention to usbboot compatibility\n        signed-off-by: Carlo Maria Curinga carlo@balena.io\n      subject: add mention to usbboot devices support\n      body: null\n- version: 1.5.37\n  date: 2019-05-13T17:51:01.000Z\n  commits:\n    - hash: 3402c9f601216474a4acd729fac465a98265c1ac\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Bump react dependency to v16.8.5\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Bump react to v16.8.5\n      body: null\n- version: 1.5.36\n  date: 2019-05-13T12:32:52.000Z\n  commits:\n    - hash: 50a34e2f4c748da4deb2a1184304761ddf209f32\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update etcher-sdk to ^2.0.9\n        change-type: patch\n      subject: Update etcher-sdk to ^2.0.9\n      body: null\n- version: 1.5.35\n  date: 2019-05-10T17:27:32.000Z\n  commits:\n    - hash: 9cb27a616ac9d9ccb93455677d0f52e36dae46d1\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Downgrade electron 4.1.5 -> 3.1.9\n        change-type: patch\n      subject: Downgrade electron 4.1.5 -> 3.1.9\n      body: null\n- version: 1.5.34\n  date: 2019-05-10T10:19:18.000Z\n  commits:\n    - hash: e80106d8f8e68149949055cb3e32a891b93c79a1\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: \"win32: fix running diskpart when the tmp file path contains spaces\"\n        change-type: patch\n      subject: Update etcher-sdk to ^2.0.7\n      body: null\n    - hash: 6386f852586a5eb450b942dc43f41f316da2e99e\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Use https url for fetching config, avoid redirection\n        change-type: patch\n      subject: Use https url for fetching config, avoid redirection\n      body: null\n- version: 1.5.33\n  date: 2019-04-30T19:14:28.000Z\n  commits:\n    - hash: 9d78da941ba168325c7a72e658bd6bf8d6a8f234\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Fix gzipped files verification percentage and dmg verification.\n        change-type: patch\n      subject: Update etcher-sdk to ^2.0.5\n      body: null\n- version: 1.5.32\n  date: 2019-04-30T16:03:22.000Z\n  commits:\n    - hash: 792fab20e68a3428dbf1c6d1052c9ebd472b05f6\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Export NPM_VERSION variable in Makefile\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Export NPM_VERSION variable in Makefile\n      body: null\n    - hash: 8a2db8bced4781f992c64b62adcc28dfe11a1434\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Add CODEOWNERS file to repository\n      body: null\n- version: 1.5.31\n  date: 2019-04-30T10:52:46.000Z\n  commits:\n    - hash: 88f543dd2583bcbf50e2f569bd19edbbd300fc24\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update electron to 4.1.5\n        change-type: patch\n      subject: Update electron to 4.1.5\n      body: null\n    - hash: 1fcde5a17c1efbd7d5a23bcab4b3fa1a8a36347e\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update etcher-sdk to ^2.0.3\n        change-type: patch\n      subject: Update etcher-sdk to ^2.0.3\n      body: null\n- version: 1.5.30\n  date: 2019-04-24T11:58:38.000Z\n  commits:\n    - hash: 63c047009f6d3b8d20ef291bc4ce036c48aaf03b\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove useless returns and unused parameter\n      body: null\n    - hash: 1f7e4c886b4f85579a53f96f3039ec38097d673d\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Don't show a dialog when the write fails.\n      subject: Don't show a dialog when the write fails.\n      body: There is already an error modal and the error detail will be shown in the\n        console.\n- version: 1.5.29\n  date: 2019-04-22T07:08:09.000Z\n  commits:\n    - hash: 3d3b4f4a46875c1e411b45156c8965d20214677d\n      author: Giovanni Garufi\n      footers:\n        change-type: patch\n        changelog-entry: Add support for auto-updating feature\n        signed-off-by: Giovanni Garufi <giovanni@balena.io>\n      subject: Add electron autoupdater\n      body: null\n    - hash: 7e2c62c520e8264fa3886c7bdd1dbe52f47c95a8\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Fix mixpanel events sampling rate\n      body: null\n    - hash: 428c7774029a8fdc9905ecabb109cfd57887328c\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Fix npm-shrinkwrap.json\n      body: null\n- version: 1.5.28\n  date: 2019-04-19T11:44:53.000Z\n  commits:\n    - hash: 2c835437e9f2c9e688bb713af64c7cd083c469a8\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update etcher-sdk to ^2.0.1\n        change-type: patch\n      subject: Update etcher-sdk to ^2.0.1\n      body: null\n    - hash: d95401e614ba96cd2d2173e5564508466d75edf9\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update electron-builder to ^20.40.2\n        change-type: patch\n      subject: Update electron-builder to ^20.40.2\n      body: null\n- version: 1.5.27\n  date: 2019-04-16T14:28:39.000Z\n  commits:\n    - hash: 11def54adb917b72da61b7a1a0fe5eab8be9d7f2\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: \"(Windows): Fix reading images from network drives when the tmp\n          dir has spaces\"\n        change-type: patch\n      subject: Fix reading images from network drives on windows when the tmp dir has\n        spaces\n      body: null\n- version: 1.5.26\n  date: 2019-04-12T17:42:13.000Z\n  commits:\n    - hash: 6e72c0719050d980f56ccd8a0e158f586ef1ffd8\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: \"(Windows): Fix reading images from network drives containing\n          non ascii characters\"\n        change-type: patch\n      subject: Fix reading images from network drives containing non ascii characters\n      body: null\n- version: 1.5.25\n  date: 2019-04-10T11:24:58.000Z\n  commits:\n    - hash: 6a9b7395419e2cf978dc6e02fef4e8265a225c7f\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: New parameter in webview for opt-out analytics\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: New parameter in webview for opt-out analytics\n      body: null\n- version: 1.5.24\n  date: 2019-04-08T13:25:40.000Z\n  commits:\n    - hash: fc1c1b402b96cbb07be8a8136d735608a89fccf4\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Add sample property to Mixpanel events\n      body: null\n    - hash: 24a83260ca3494814ad880de565996af2d938417\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Update building scripts to latest master\n      body: null\n    - hash: 3e236996c807d7ba0d35f76443fdedd9063e1ba4\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update resin-corvus to ^2.0.3\n        change-type: patch\n      subject: Update resin-corvus to ^2.0.3\n      body: null\n- version: 1.5.23\n  date: 2019-04-03T10:17:18.000Z\n  commits:\n    - hash: 15fc8ab2e798cf632a8cf5982c37f7faa247e49d\n      author: Giovanni Garufi\n      footers:\n        change-type: patch\n        changelog-entry: Configure versionbot to publish repo metadata to github pages\n        signed-off-by: Giovanni Garufi <giovanni@balena.io>\n      subject: Set publishMetadata in repo.yml\n      body: |-\n        This will cause VB to publish metadata about the repo to its gh-pages\n        branch on merge\n- version: 1.5.22\n  date: 2019-04-02T16:51:38.000Z\n  commits:\n    - hash: db771bc2cc2b262a6bd7f35b7d93d8456ad6ee06\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: \"(Windows): Use full path to wmic as some systems don't have it\n          in their PATH\"\n        change-type: patch\n      subject: Use full path to wmic as some systems don't have it in their PATH\n      body: null\n- version: 1.5.21\n  date: 2019-04-02T14:42:01.000Z\n  commits:\n    - hash: 40de7f5d5462239de3d2e8df9005b06881c7d646\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Fix error when config.analytics was undefined\n        change-type: patch\n      subject: Fix error when config.analytics was undefined\n      body: null\n- version: 1.5.20\n  date: 2019-04-01T16:00:28.000Z\n  commits:\n    - hash: ec015da7959ce321bb29306e240d7516d57862e0\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: 'Avoid \"Invalid state percentage: null\" errors'\n      body: null\n    - hash: 34c98d1dcde836f58b4dd2e489c9775cf32729b5\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: 'Avoid \"Error: There is already a flash in progress\" errors'\n        change-type: patch\n      subject: Use async/await in flash.js\n      body: 'Avoid a rare race condition leading to \"Error: There is already a flash\n        in progress\" messages'\n    - hash: cafaa9ff2255815bcf6cba9d03ca5198541df5e3\n      author: Giovanni Garufi\n      footers:\n        change-type: patch\n        changelog-entry: Reformat changelog\n        signed-off-by: Giovanni Garufi <giovanni@balena.io>\n      subject: Delete versionist.conf\n      body: |-\n        Versionist will now look at repo.yml and inject the versionist config\n        corresponding to the type\n    - hash: 164fd8f02226b6ebf28c6d73a4690f19ca0c6f50\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Don't try to flash when no device is selected\n        change-type: patch\n      subject: Don't try to flash when no device is selected\n      body: null\n    - hash: b61109a269ad12946c62e913becee94946b09081\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Fix reading images from network drives on windows\n      body: null\n- version: 1.5.19\n  date: 2019-03-28T14:47:03.000Z\n  commits:\n    - hash: bceb7c77d1ab9a80a276c0967f00d838b6aa774e\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Better reporting of unhandled rejections to sentry\n        change-type: patch\n      subject: Better reporting of unhandled rejections to sentry\n      body: null\n    - hash: 39573ada545bbf7798e691249f6f7ea498c29dd4\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update resin-corvus to ^2.0.2\n        change-type: patch\n      subject: Update resin-corvus to ^2.0.2\n      body: null\n- version: 1.5.18\n  date: 2019-03-26T23:40:23.000Z\n  commits:\n    - hash: 03b1a2dcff69de681bdc3c405b8c73496f888993\n      author: Giovanni Garufi\n      footers:\n        change-type: patch\n        changelog-entry: Update build scripts\n        signed-off-by: Giovanni Garufi <giovanni@balena.io>\n      subject: Update scripts\n      body: null\n- version: 1.5.17\n  date: 2019-03-26T08:45:29.000Z\n  commits:\n    - hash: d078055e4059c4a3a64b225a4ceda6f287f40f29\n      author: Giovanni Garufi\n      footers:\n        change-type: patch\n        signed-off-by: Giovanni Garufi <giovanni@balena.io>\n        changelog-entry: Automatically publish github release from CI\n      subject: \"Set publish: github in repo.yml\"\n      body: null\n- version: 1.5.16\n  date: 2019-03-25T16:31:06.000Z\n  commits:\n    - hash: 52caae8f059e9bb8c5b61e4982f4e4b6ee578d43\n      author: Giovanni Garufi\n      footers:\n        change-type: patch\n        signed-off-by: Giovanni Garufi <giovanni@balena.io>\n        changelog-entry: Add repo.yml for CI\n      subject: Add repo.yml\n      body: null\n    - hash: 15f87edc96b57a4cc7e15ecde91d78be399e1d21\n      author: Giovanni Garufi\n      subject: Update .gitattributes to always use LF for EOL in json files\n      body: null\n    - hash: 195f07c09fdfae4b617c3023ebd9bb49f209f7c7\n      author: Giovanni Garufi\n      footers:\n        change-type: patch\n        signed-off-by: Giovanni Garufi <giovanni@balena.io>\n      subject: Update scripts\n      body: null\n- version: 1.5.15\n  date: 2019-03-21T00:19:15.000Z\n  commits:\n    - hash: 0c2eb1caaba7046aaabe92b18a2774e05bc20e4f\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        changelog-entry: Show the correct logo on usbboot devices on Ubuntu\n        signed-off-by: Juan Cruz Viotti <juan@balena.io>\n      subject: \"etcher-sdk: Upgrade to 1.3.11\"\n      body: null\n- version: 1.5.14\n  date: 2019-03-20T17:09:35.000Z\n  commits:\n    - hash: 33fb79e0de5968d20b0f48cd2c42def39569257f\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update etcher-sdk to ^1.3.10\n        change-type: patch\n      subject: Update etcher-sdk to ^1.3.10\n      body: null\n    - hash: fc9282fff7625d814014fc14a4a91eb223106f37\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove versionist from dev dependencies\n      body: null\n- version: 1.5.13\n  date: 2019-03-18T18:02:31.000Z\n  commits:\n    - hash: 818b4666875826a3f3c98e72bfe19844bd87ba9d\n      author: Giovanni Garufi\n      footers:\n        change-type: patch\n        signed-off-by: Giovanni Garufi <giovanni@balena.io>\n        changelog-entry: Update build scripts\n      subject: Update scripts\n      body: null\n- version: 1.5.12\n  date: 2019-03-15T17:12:02.000Z\n  commits:\n    - hash: 3cfa6988abee5eae209e9a5252e638ed8f3accc0\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        changelog-entry: Update build scripts\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Update build scripts\n      body: null\n    - hash: 7d715fdca07337ba0b502a5abe40df96da11dfa4\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Disable node gyp rebuild while running electron-builder\n      body: null\n- version: 1.5.11\n  date: 2019-03-12T18:00:52.000Z\n  commits:\n    - hash: 091bddbad88d7b5f5d625ae89dbf0206fac37843\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Remove no longer used travis and appveyor configs\n        change-type: patch\n      subject: Remove no longer used travis and appveyor configs\n      body: null\n    - hash: 94e91723f4c47cf76797db906ffb33eb7071d2ff\n      author: David Lozano Jarque\n      footers:\n        changelog-entry: Fixed broken Hombrew cask link for etcher\n        change-type: patch\n      subject: Update PUBLISHING.md\n      body: Fixed broken Hombrew cask link for etcher\n- version: 1.5.10\n  date: 2019-03-12T15:29:01.000Z\n  commits:\n    - hash: 66b19677bf1e57455242b5e62ffcadee06b97eb6\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Use APPDIR from env in the child writer\n      body: null\n    - hash: 2e1763f19aa33ef90057374d997fcc3be7bdc5c9\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Fix Makefile\n      body: null\n    - hash: 7f8f38ddf154ac9d68f51d6055f47d2e378fa7f7\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update resin-scripts\n        change-type: patch\n      subject: Update resin-scripts\n      body: null\n- version: 1.5.9\n  date: 2019-03-06T15:56:46.000Z\n  commits:\n    - hash: a979ae3ced134731d15f8cd1de3f049c120a6e5d\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update etcher-sdk to 1.3.0\n        change-type: patch\n      subject: \"upgrade(etcher-sdk): Update etcher-sdk to 1.3.0\"\n      body: null\n    - hash: 3b16c06f70e9c1b57aa9c93be7098123d2549853\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: \"upgrade(scripts): Use master branch of resin-scripts\"\n      body: null\n- version: 1.5.8\n  date: 2019-03-01T19:00:24.000Z\n  commits:\n    - hash: ac463e0f65acb7e4cccb8c10f72ffb2d9d6149fa\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update ext2fs to 1.0.27\n        change-type: patch\n      subject: \"upgrade(ext2fs): Update ext2fs to 1.0.27\"\n      body: null\n- version: 1.5.7\n  date: 2019-03-01T16:05:34.000Z\n  commits:\n    - hash: 388fc2f7d980ec24d76e7155f770732f4c2707dd\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Remove screenshot\n      body: null\n    - hash: 136ca282eb3ebd4251da28780ff56ee2f660272e\n      author: Robert Vojta\n      footers:\n        changelog-entry: Fix disappearing modal window\n        change-type: patch\n        signed-off-by: Robert Vojta <robert@balena.io>\n      subject: \"fix(gui): Fix disappearing modal window\"\n      body: null\n    - hash: 1d6958a67e24d1148b70f09ffbc0df70dda83583\n      author: Robert Vojta\n      footers:\n        changelog-entry: Fix blurred background image\n        change-type: patch\n        signed-off-by: Robert Vojta <robert@balena.io>\n      subject: \"fix(osx installer): Fix blurred background image\"\n      body: null\n    - hash: 16e8aa2447d15dde98336b14710aa704f2030929\n      author: Robert Vojta\n      footers:\n        change-type: patch\n        signed-off-by: Robert Vojta <robert@balena.io>\n      subject: Fix AppImages link\n      body: null\n    - hash: e73a57745215cf73829ce1ede225a05f49cbff39\n      author: Robert Vojta\n      footers:\n        change-type: patch\n        signed-off-by: Robert Vojta <robert@balena.io>\n      subject: Fix electron links\n      body: null\n    - hash: b6ad6e0a85a84b081327d5adb49d4b2e3164bd8d\n      author: Robert Vojta\n      footers:\n        change-type: patch\n        signed-off-by: Robert Vojta <robert@balena.io>\n      subject: Fix macOS version requirements\n      body: null\n    - hash: 3cdb0f840e29da2b2275148e4e86a177dda7b12f\n      author: Robert Vojta\n      footers:\n        change-type: patch\n        signed-off-by: Robert Vojta <robert@balena.io>\n      subject: Fix electron links\n      body: null\n    - hash: 8e96adeda90404e6a4564dde0cd0292b82f1e212\n      author: Robert Vojta\n      footers:\n        change-type: patch\n        signed-off-by: Robert Vojta <robert@balena.io>\n      subject: Fix copyright year\n      body: null\n    - hash: 90838c99fc376398eb7c0e80b71bbe84e728f259\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Add missing line for supporting flashing CM3+\n      body: null\n    - hash: fea230cfabc5de2d75c850ce7209789e9bd04c6f\n      author: Robert Vojta\n      footers:\n        changelog-entry: Update docs\n        change-type: patch\n        signed-off-by: Robert Vojta <robert@balena.io>\n      subject: \"fix(docs): Update macOS contributing info\"\n      body: null\n- version: 1.5.6\n  date: 2019-03-01T10:44:47.000Z\n  commits:\n    - hash: 2614f3261c59c1070dfdaad9409bf265a14b28fc\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Target electron 3 runtime in babel options\n        change-type: patch\n      subject: Target electron 3 runtime in babel options\n      body: This saves around 40KiB in generated/gui.js\n- version: 1.5.5\n  date: 2019-02-28T12:10:25.000Z\n  commits:\n    - hash: 4317892421dff1e8d53ed10a3546885e368fea7e\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Update etcher-sdk to 1.1.0\n        change-type: patch\n      subject: Update etcher-sdk to 1.1.0\n      body: null\n    - hash: 6b6a0d7b4f55bc5809ae46d6eb9743a8c3cbdcef\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Avoid `Invalid percentage` exceptions\n        change-type: patch\n      subject: Avoid `Invalid percentage` exceptions\n      body: null\n    - hash: f0374cf9d9dfb533d16adc29389359834f16f082\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Fix error message not showing when an unsupported image is selected\n        change-type: patch\n      subject: Fix error message not showing when an unsupported image is selected\n      body: null\n    - hash: 5299d958f29f3386090936625b1a33b568c13e47\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Fix error when event.dataTransfer.files is empty\n        change-type: patch\n      subject: Fix error when event.dataTransfer.files is empty\n      body: null\n    - hash: dd583a176fefb3346093bd89932cf06b9a61a74c\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Don't pass undefined sockets to ipc.server.emit()\n        change-type: patch\n      subject: Don't pass undefined sockets to ipc.server.emit()\n      body: null\n- version: 1.5.4\n  date: 2019-02-28T10:01:03.000Z\n  commits:\n    - hash: 09e6c6422dfee471d69b854aa1603a20f9a48974\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Add missing step for submodule cloning in README\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Add missing step for submodule init & update\n      body: null\n- version: 1.5.3\n  date: 2019-02-27T21:09:03.000Z\n  commits:\n    - hash: caeb84f58bc2286d0b004ad8d219302c77979c14\n      author: Giovanni Garufi\n      footers:\n        change-type: patch\n        signed-off-by: Giovanni Garufi <giovanni@balena.io>\n        changelog-entry: Throw error if no commit is annotated with a changelog entry\n      subject: Throw error if no commit is annotated with a changelog entry\n      body: null\n    - hash: 8e372f1e93f7c5e56a2bcf5a881d0ea8aa5f1062\n      author: Giovanni Garufi\n      subject: Fix changelog\n      body: null\n    - hash: 1f3a02b83ddef6e26678cca5b96bc57f2f3db8e1\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Bump version in npm-shrinkwrap.json\n      body: null\n- version: 1.5.2\n  date: 2019-02-26T14:17:27.000Z\n  commits:\n    - hash: 3be702907806f1eed2f9e5506a68507eea039d39\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Enable versionist editVersion\n      body: null\n- version: 1.5.1\n  date: 2019-02-25T11:04:33.000Z\n  commits:\n    - hash: 90c8483df8147390c1941c7dfbc881409fc0afc8\n      author: Giovanni Garufi\n      footers:\n        changelog-entry: Removed lodash dependency in versionist.conf.js\n        change-type: patch\n        signed-off-by: Giovanni Garufi <giovanni@balena.io>\n      subject: Remove lodash dependency in versionist.conf.js\n      body: null\n- version: 1.5.0\n  date: 2019-02-21T16:13:28.000Z\n  commits:\n    - hash: c88245954d7cf167eca87e18ef07bc2675b56207\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Integrate etcher-sdk\n      body: null\n    - hash: db119d523065ca130372c2686b94804b812a0d44\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Allow flashing from sources for which we don't know the compressed size\n      body: \"* don't show any percentage or eta, show the bytes written instead\"\n    - hash: 41a7fc4de52a5a7c5e430f0f1ebc1aa4ad821cbd\n      author: Alexis Svinartchouk\n      footers:\n        change-type: minor\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Show raspberry pi usbboot update progress in devices list\n      body: null\n    - hash: 082c77586f60772cb53302f3ed16232545bdd375\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Handle the last fail as an error if all devices failed\n      body: null\n    - hash: 34b7c1be812376c86f04fb3e6dafab8a4ca9d180\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove usage of old sdk in supported-formats\n      body: null\n    - hash: da072e7621fd57e09d6a60c429f17a4d24c8cd72\n      author: Alexis Svinartchouk\n      footers:\n        change-type: major\n      subject: Update etcher-sdk and use it in the cli\n      body: null\n    - hash: ce9f14262173cc218c95a24e74e47f79263680cf\n      author: Alexis Svinartchouk\n      footers:\n        change-type: major\n        changelog-entry: Upgrade to Electron v3\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Replace imageStream with etcher-sdk in the react file selector\n      body: null\n    - hash: 43319853ef7a58b62fa284ebb814ac083263a99e\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Remove lib/sdk and its tests\n      body: null\n    - hash: bf29312ecf98bf6f6bd683899ddd404acd0245c9\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: lint\n      body: null\n    - hash: 3c007cea34caf078f9e108b460c73f27e86cfd8b\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: Update etcher-sdk and load DriverlessDeviceAdapter on windows\n      body: null\n    - hash: ccc9076a8073c4ecadc5b268450ea79b543920d2\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(lib): Fix use of non-existent dependency\"\n      body: null\n    - hash: d65dc6ccacbf95459cbd7ebdfdbefeb5890b8153\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(test): Turn SDK integration tests for the GUI back on\"\n      body: null\n    - hash: 6d79a8e23a3cf55fd76c832af2204c40acbb9f9d\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(lib): Fix MIME type exclusion condition\"\n      body: |-\n        As `mime.extension()` returns `false`, instead of `null` or `undefined`,\n        this condition simply needs to check for truthyness.\n    - hash: a8f8c2cd859eb12432fdcb2331d0b4c42c1adc20\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(test): Sort supported extensions to fix order mismatch\"\n      body: null\n    - hash: ef456960155554b74b2c8aabe8974293f5697c2d\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): Update mime-types 2.1.15 -> 2.1.18\"\n      body: |-\n        This update includes a previously missing mapping for gzip\n        (`application/gzip`), which contributes to fixing gzip compressed\n        image detection in the new SDK\n    - hash: 911d3a91883e8abbd4fe09af8c78961b884bb501\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(test): Sort compressed extensions before comparing\"\n      body: null\n    - hash: bc028ed41fbb7c0a65dc6656cca72b6ddc970382\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): Update etcher-sdk git ref\"\n      body: null\n    - hash: a4dfa5f281bff5220013bd1e461fb5c38ab68c86\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(store): Restore drive object validity check\"\n      body: null\n    - hash: 700341f9cc07ddac89ba8c7d9c98346561b60fd9\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: \"fix(store): Lowercase extensions before comparing\"\n      body: null\n    - hash: 8cc33b46bbb950f18f775fbd6f8186be3609ab1b\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: \"fix(package): remove diskpart helper, it is in the sdk now\"\n      body: null\n    - hash: c37270ea081c83d628b2204c97428cb65f6b390e\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: feat(driverless) show driverless devices\n      body: null\n    - hash: 73e4827249f52107e4138f9575d8f469de901d27\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: \"fix(tests): Remove throw if no percentage or eta test\"\n      body: |-\n        Since 25916200f2864a9b137325f919c0f8ef5d62fa60 we can handle a progress\n        state with no percentage or eta.\n    - hash: e85251d2e37a317d1a0fae64a8eb1447640fc443\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Fix incorrect drives list on Linux\n        signed-off-by: Jonas Hermsmeier <jhermsmeier@gmail.com>\n      subject: \"fix(image-selection): Only trigger digest loop after setting image\"\n      body: null\n    - hash: 8c8a0bf8eb64bd9a8bd5019ac6337665ee5e9959\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n        signed-off-by: Alexis Svinartchouk <alexis@resin.io>\n      subject: \"upgrade(package): Update to etcher-sdk@0.1.7\"\n      body: Also update the shrinkwrap file\n    - hash: 7ca3e2b5199bf79ec33f17828a96b89d410a071b\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n        signed-off-by: Alexis Svinartchouk <alexis@resin.io>\n      subject: \"fix(tests): Fix gui tests\"\n      body: null\n    - hash: c16fbb5b474ae8364ba648897b5176f81b799cff\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n        signed-off-by: Alexis Svinartchouk <alexis@resin.io>\n      subject: \"upgrade(package): Update to etcher-sdk@0.1.9\"\n      body: null\n    - hash: bf3d069aad6ebc81a76c596f80d05bb15550e26a\n      author: Alexis Svinartchouk\n      subject: \"upgrade(package): Update to etcher-sdk@0.1.13\"\n      body: null\n      footers:\n        change-type: patch\n        signed-off-by: Alexis Svinartchouk <alexis@resin.io>\n    - hash: 9fa32df3a68d8fe3c8a8ffa9b408846fe4543143\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n        signed-off-by: Alexis Svinartchouk <alexis@resin.io>\n      subject: \"fix(gui): Allow undefined eta\"\n      body: null\n    - hash: 2525456d8b4c70e028365dbaff1a8ff21365ed83\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n        signed-off-by: Alexis Svinartchouk <alexis@resin.io>\n      subject: \"fix(shared): Fix getDriveImageCompatibilityStatuses() and tests\"\n      body: null\n    - hash: 9b76abe2ed4f4398bbe6baf5513c773b43ff948e\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n        signed-off-by: Alexis Svinartchouk <alexis@resin.io>\n      subject: \"fix(gui): Allow drives to be objects\"\n      body: This fixes an error when plugging usbboot devices.\n    - hash: f2ca997195ca71764085bc359abd4c4cc6e12d0f\n      author: Alexis Svinartchouk\n      footers:\n        changelog-entry: Changed “Drive Contains Image” to “Drive Mountpoint Contains Image”\n        change-type: patch\n      subject: Change \"Drive Contains Image\" label.\n      body: |-\n        Use \"Drive Mountpoint Contains Image\" instead as the image may not be on\n        this drive but on a drive mounted in one of the mountpoins of this\n        drive.\n        We still don't want to allow flashing this drive in that situation.\n    - hash: 2dc4fef4d3c7a71ca66dc4c9be93f0ff12157469\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Update scripts to build on other Linux distros\n      body: null\n    - hash: e946f388c00c4c1ddfbd29495236727dd85d7415\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: ProgressBar.disabled prop is a boolean\n      body: null\n    - hash: 25b814e796337df638c013980461e0cbc6b25267\n      author: Agnieszka Domanska\n      footers:\n        change-type: patch\n        signed-off-by: amdomanska <aga@resin.io>\n      subject: \"docs: Add info about required npm version\"\n      body: Npm 3.10 version is required to install dev tools correctly on Linux.\n    - hash: 1c8c36a2240a2bd7ba0faa2d5773ac4991d32460\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Update nodejs req to 6.11 (fixes package build)\n      body: null\n    - hash: 6143023502c5319d0278a264ee3a1dfd4ce68a88\n    - hash: a8a75f22b2a0297c468bd4058f31eb663310703e\n    - hash: d07d535993460521d7d6a0b3c2c716e10d1134d0\n    - hash: 268c5302e8bc42068b3ae2b717e4872cfeed88a8\n    - hash: 8630af7646159fd697d4c0e81cf2c7fdaef09131\n    - hash: 98a8588c1b7388a8fe9e9fb79611ec13bd0fe47c\n    - hash: a42e81cf8c4a1171bb7d7dc5104d3a6792a25853\n    - hash: e68dbcf4ee940f2d03f84efe4d5c63e44fea5827\n    - hash: caf5f10326a65bc560294872c823e2d8ecdc6a66\n    - hash: 5ae93bf6d0611fa930765729c16587e5fd93a6e0\n    - hash: 47f2336673672f6b47466f8056ce1b28c320833e\n    - hash: 21f1f4e50334f2f801b6c058e4eeefe366cc213b\n    - hash: 4f7cc7dd6b864fb9643e803cf5b5dabc805be26f\n    - hash: d3c2cd42157b004c80f432de4003e3f393caeb3d\n    - hash: 254b48265106b1eb0212e9137f5cbaed1ca77341\n    - hash: a541c863be774cd2e6acb27c94c3527973bb3b19\n    - hash: c50553fbf6c00edfd4ce4ee7b5c07295ffb9dad2\n    - hash: b270d819a8edd8fbd5ea4da8b4da9ae6bdcbd1c8\n    - hash: 7d2ba45620134f0c72f1a85bf5f084defc0426e1\n    - hash: 47937d6aaa2dc30513e08f51768d303a536cdfa0\n    - hash: 6b270885bffa9f5b8adb2241c754bb5f5d1b7ef9\n    - hash: 63967d15586e5a9e84aa48b98e1bf665f1fba18d\n    - hash: fd765443e4228285e2ac59d153cfe391f1bc79d4\n    - hash: 8d79103392e1cd22865138f2abecdeda5b8e626e\n    - hash: 871db09447c04532768c0da29555536c5e2f1b44\n    - hash: 73f64d93b197d333fd70507b6299940ef1809536\n    - hash: a237bfd9303377b234b40e4769a190cf2f41acd5\n    - hash: aaccd10c2a177dfba91aaf3155e5898128790ad7\n    - hash: 65d86460cbb56cb3cd307bddd07bdd12f8536a35\n    - hash: 645e114a1fc7121bc78044a13f702f337a6c579e\n- version: 1.4.9\n  date: 2018-12-23T14:54:07.000Z\n  commits:\n    - hash: b8756edd29730448d45b20cacbfbf7ee43570926\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: New dmg package background assets\n      body: null\n    - hash: d71b3fe1bc669ac0e475e0cc8becd072a637d8c5\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: v1.4.9\n      body: null\n    - hash: ad4226ace7ac585738b516174eedeefc25295a15\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Invert analytics event probability\n      body: null\n    - hash: 87533f441715074b5fa40f69f74687a37945de73\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Remove forwarding of SafeWebview console messages\n      body: null\n    - hash: 22acc5ae96f73d0d4babaae3655b0c7bfd3ce130\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: minor\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Customize Mixpanel configs\n      body: null\n    - hash: cf722427ab0221e18c6e109ffe10c7e2b6aef890\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Added React component for the Flash Another button\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Restyle success screen and enlarge UI elements\n      body: null\n    - hash: 64ec6d0e58f4893712c5574661f323866a67dd5c\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: minor\n        changelog-entry: Added React component for the Flash Results button\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Convert flash results component to React\n      body: null\n    - hash: dd8ef288f78776f718953bebca01a85b664fdd04\n      author: Chris Crocker-White\n      footers:\n        change-type: patch\n        signed-off-by: Chris Crocker-White <chriscw@balena.io>\n      subject: Update URLs in GUI to balena\n      body: null\n    - hash: caf5a8917ca6c41a4a27cf0f1afd333a5ea11ce0\n      author: Chris Crocker-White\n      subject: Merge branch 'master' into chrisys-patch\n      body: null\n    - hash: db8d2953cb46004020a6f7068f65c28dbe967a58\n      author: Randall Wood\n      subject: Update MacOS installation instructions.\n      body: Homebrew/homebrew-cask#55358 changed the name used for installation.\n    - hash: 7565e809b072de476b20450ad68212918eeb6a55\n      author: Otavio Salvador\n      footers:\n        signed-off-by: Otavio Salvador <otavio@ossystems.com.br>\n      subject: Add `.wic` image extension as supported format\n      body: |-\n        The `.wic` is a widely used image format in the OpenEmbedded / Yocto\n        Project ecosystem and is straightforward to be supported.\n    - hash: 948a04122afc6ad81ae0636046fbcb3d692c6d9b\n      author: Eate\n      subject: Updated Chocolatey section\n      body: Previously, the section header was a \"###\" header, and I changed it to a\n        \"####\" header like all the other install variants so it is the same\n        level header. I also added uninstall instructions like the other\n        sections had.\n    - hash: 7354fa30500970e3e090efa02b332e822a0d87ad\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Use explicit names for safe-webview events\n      body: null\n    - hash: 6d0fea19835ef20d14c80f809782e46ed0160e98\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Fix update notifier error popping up on v1.4.1->1.4.8\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: \"fix(GUI): Fix update notification error\"\n      body: Remove \"this\" and use \"exports\" instead\n    - hash: 5419b4b732a6ea71dccc5bf075011ba34fd9c1e1\n      author: Jacob\n      subject: Use https for fetching sub modules\n      body: This switches over the sub module to using https instead of ssh. It\n        simplifies a lot for people packaging the application and you won't need\n        to have ssh configured correctly.\n    - hash: a52d7452503314f46e4698d9d1a732f1c16a4a89\n      author: Lorenzo Alberto Maria Ambrosi\n      subject: Merge branch 'master' into gitmodule-https\n      body: null\n- version: 1.4.8\n  date: 2018-11-23T17:52:19.000Z\n  commits:\n    - hash: 9a83bd4267a95568f132024c77e4362207021285\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: v1.4.8\n      body: null\n    - hash: 20996b153d3977c1bd78d1b505f044c9d86c9a73\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Reject drives with null size (fixes pretty-bytes error)\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: \"fix(GUI): Reject drives with null size\"\n      body: null\n    - hash: 2017df9ec65c934ee95391813c5461b5db0553e9\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Added featured-project while flashing\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: \"feat(GUI): Add featured-project component\"\n      body: null\n    - hash: 76af6e975e0eca5d31a9e15edea6bdda8a28d1e8\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Add flashing info while showing webview\n      body: null\n    - hash: afd888e14d3611e35111aff364cf20293f84943f\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Moved back the write cancel button\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: \"fix(GUI): Fix styling issues with buttons\"\n      body: null\n- version: 1.4.7\n  date: 2018-11-13T14:49:43.000Z\n  commits:\n    - hash: 2158772e3b979c4bb2a186f757c1f19e00242ebd\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: \"lint: don't run codespell on svg files\"\n      body: null\n    - hash: 7fb382bee0239d4fdc34a29867c0088a172b38ed\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n      subject: \"fix(usbboot): Limit usbboot transfers to 1MiB\"\n      body: null\n    - hash: 6e9deeba5b040eb1d7f2d818131331a38d7f8c9c\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: major\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: v1.4.7\n      body: null\n    - hash: dd8b7e42d6bbda88b0ff6686e39e8bc8f5e16268\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        changelog-entry: Modify versionist.conf.js to match new internal commit guidelines\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: \"fix(versionist): Adapt versionist.conf.js to new guidelines\"\n      body: null\n    - hash: a3f7239c1b50b69202ec186f0a5cee08a9cd5fe4\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Add balena iconset & osx installer background\n      body: null\n    - hash: c4c4d347cfbd83457ff2ca98eec50a0ef1de0d1a\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@balena.io>\n      subject: Update application name & copyright\n      body: null\n    - hash: a229c9e10e7deb16fdc0fa60697de185c8a01b06\n      author: Lucian Buzzo\n      footers:\n        change-type: patch\n        signed-off-by: Lucian Buzzo <lucian.buzzo@gmail.com>\n      subject: \"docs: Fix typo in contributing guidelines\"\n      body: null\n    - hash: 2907cd173bb045677b8f57560b0e0bcb3331d6c4\n      author: amdomanska\n      footers:\n        change-type: minor\n        signed-off-by: amdomanska <aga@resin.io>\n      subject: \"refactor(GUI): Convert Select Image button to Rendition\"\n      body: Convert Select Image button to Rendition component\n- version: 1.4.6\n  date: 2018-10-29T22:29:23.000Z\n  commits:\n    - hash: c1a8b0c30322ea3412bd418c1475e46255b2e9bb\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: v1.4.6\n      body: null\n    - hash: c366fbde22efa33d79135033975dba596908aa0d\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Put flash cancel button in foreground\n      body: null\n    - hash: 9cc65a386bf6887df5b29261533464dccb0f0017\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Add new logos\n      body: null\n    - hash: 8eb11a8957bc40b29007b1778a072e59a856f805\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Change resin.io to balena.io\n      body: null\n    - hash: 407325b8ceadc26fab11527d53187f0d2287b16b\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Fix incorrect file constraint path\n      body: null\n    - hash: cb701a7bbccff076f5f7f55e8de68be867ed7e0f\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Change spectron port\n      body: null\n    - hash: c2c59f4a9e997133e20a1d6e041fb796cb92dbb6\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: Enable React lint rules\n      body: null\n    - hash: fd5385b127b09bb912263629f745cecf240b691f\n      author: Alexis Svinartchouk\n      footers:\n        signed-off-by: Alexis Svinartchouk <alexis@resin.io>\n      subject: \"fix: Fix 64 bit detection on arm\"\n      body: null\n    - hash: ac068f353acc53de5ed4edd7b06f5791307abb40\n      author: Alexis Svinartchouk\n      footers:\n        signed-off-by: Alexis Svinartchouk <alexis@resin.io>\n      subject: \"fix: Provide a Buffer to xxhash.Stream\"\n      body: This fixes the digest being a number instead of a buffer.\n    - hash: abf1e4a8ac9d265d6387060e86c13c783fd4e892\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: \"fix: Correct 1.4.5 release date & remove checklist\"\n      body: null\n    - hash: 3855bb4d56ac57a2309f47da74217f55d049d281\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <juan@resin.io>\n      subject: Use Resin CI scripts to build Etcher\n      body: null\n    - hash: b3aab5116ad4b903a200d4c4ff5b07bfcc1861df\n      author: amdomanska\n      footers:\n        change-type: minor\n        signed-off-by: amdomanska <aga@resin.io>\n      subject: \"refactor(GUI): Convert Progress Button to Rendition\"\n      body: Convert progress-button component to Rendition\n- version: 1.4.5\n  date: 2018-10-09T09:42:17.000Z\n  commits:\n    - hash: 7e01eca7f5e5fa60311d805baa9f6e833bddc014\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n        see: https://github.com/resin-io/etcher/pull/1892\n        changelog-entry: Download usbboot drivers installer when clicking a driverless\n          usbboot device on Windows.\n      subject: \"feat(GUI): link to drivers when clicking a driverless usbboot device\"\n      body: |-\n        Step 2 until we support installing the drivers from within Etcher. This\n        also introduces an \"Open drive link\" Mixpanel event.\n    - hash: 207c0d612d7e5f3cc9ccec867c46eeb902f35075\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        signed-off-by: Jonas Hermsmeier <jhermsmeier@gmail.com>\n        changelog-entry: Add font-awesome.\n      subject: \"feat(gui): Add simple confirmation modal\"\n      body: null\n    - hash: b9f9968f8412211e48e3daf6eea5916118f4230c\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        signed-off-by: Alexis Svinartchouk <alexis@resin.io>\n        changelog-entry: Add instructions for installing and uninstalling on Solus.\n      subject: \"feat(gui): Add CTA in drivelist, update drive download modal\"\n      body: null\n    - hash: 49edd1a6dc813494fbce9fc73e4782fd7f8e8f61\n      author: Lorenzo Alberto Maria Ambrosi\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzothunder.ambrosi@gmail.com>\n      subject: \"fix(GUI): Add data on events\"\n      body: |-\n        Application session UUID for global app events\n        Flashing workflow UUID for every flashing session\n        Flash instance UUID for every flashing session\n    - hash: 37b25d84228cd633858f2fd44a8197a953dd26de\n      author: John (Jack) Brown\n      footers:\n        change-type: patch\n        signed-off-by: Jack Brown <jack@resin.io>\n      subject: \"resinci: Set private: true in package.json to avoid running npm builds\"\n      body: null\n    - hash: 0d80957639e5cc0cfa67c28be1e381a197a123aa\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        signed-off-by: Jonas Hermsmeier <jhermsmeier@gmail.com>\n      subject: \"chore(webpack): Set NODE_ENV to production\"\n      body: This enables production builds for React\n    - hash: e9760c21007a6388b9758a1825cf5f151afb2e06\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        signed-off-by: Alexis Svinartchouk <alexis@resin.io>\n      subject: \"fix(gui): Fix missing promisify in file picker model\"\n      body: null\n    - hash: 31cd33f86c010ecdc398e3c2b290fdec67aeb6cc\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        signed-off-by: Alexis Svinartchouk <alexis@resin.io>\n      subject: \"upgrade(package): Update winusb-driver-generator\"\n      body: |-\n        This updates `winusb-driver-generator` to the latest version,\n        which supports building under VS 2015 and running under Electron 2.0+\n    - hash: 1bb86fe4a84b9bb6acad4c8886dd482e8903e81b\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@resin.io>\n      subject: \"feat(gui): Enable device specific constraints for file selection\"\n      body: |-\n        This adds the ability to restrict the file selection to a given device,\n        only making its mountpoints accessible.\n    - hash: f9805f3bc741a94076f16408e4611cf6ce9fcea4\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        signed-off-by: Salvatore Zappalà <salvatore@salvatorezappala.info>\n      subject: \"fix(app): Fix settings being unavailable when packaged\"\n      body: |-\n        This fixes an issue where the settings model would be missing\n        from Etcher when packaged, as it's used in two different contexts;\n        namely the webpack bundle and the main process.\n    - hash: 0cabac1eed033e63a0dae9ae52a82091e4d5a7ad\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@resin.io>\n      subject: \"refactor(gui): Add separating borders to file selector\"\n      body: |-\n        This adds thin gray borders to the control surfaces in\n        the file selector for better visual distinction\n    - hash: c0ec74bbb794534b3b3afa02e3fde789b84397e7\n      author: Jonas Hermsmeier\n      footers:\n        change-type: minor\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@resin.io>\n      subject: \"feat(gui): Add full filename to file selector\"\n      body: This adds the display of the full filename to the file selector.\n    - hash: c3ff03054238a4973c961f7c234b6211e0857b5c\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        signed-off-by: Michael Angelos Simos <michalis@resin.io>\n      subject: \"refactor(gui): Refactor file picker fs I/O\"\n      body: |-\n        This refactors the experimental file picker to avoid fs i/o\n        in as many places as possible to improve performance.\n        Further, rendering performance is improved by avoiding unnecessary\n        element state changes invalidating components.\n        Also, recent files & favorites have been temporarily disabled\n        due to lack of need for Etcher Pro.\n    - hash: 2f4a7352d98e9aeafbda7b908756f6f5fcf0ec24\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        signed-off-by: Michael Angelos Simos <michalis@resin.io>\n      subject: \"fix(webpack): Exclude all node externals / node_modules\"\n      body: |-\n        This adds `webpack-node-externals` to exclude node_modules,\n        immensely reducing bundle size and avoiding complex exclusion rules\n        for the etcher-sdk\n    - hash: 2fb8ad146f4d8c8d9fc14d726c162d0e6e336277\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@resin.io>\n      subject: \"fix(gui): Fix an inifinite digest loop trigger\"\n      body: |-\n        This fixes a guard against infinite digest loop triggering\n        that was erronously dropped during a rebase.\n    - hash: da23740f17da045827001d62259bdd066e528dc0\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        signed-off-by: Lorenzo Alberto Maria Ambrosi <lorenzoa@resin.io>\n      subject: \"upgrade(package): Update lodash to 4.17.10\"\n      body: |-\n        This updates `lodash` to mitigate a prototype pollution vulnerability.\n        See https://nodesecurity.io/advisories/577\n    - hash: 92d969b0756dc0fc5e43d4bdfd0b9d84b017aeb2\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        signed-off-by: Alexis Svinartchouk <alexis@resin.io>\n      subject: \"fix(gui): Fix error with empty drive blacklist\"\n      body: |-\n        This fixes an error occuring if the drive blacklist\n        is empty, and not split correctly\n    - hash: f798fef2122fe1a96939dcd11070288a4731a360\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        signed-off-by: Jonas Hermsmeier <jhermsmeier@gmail.com>\n      subject: \"fix(GUI): restrict webkit drag to header\"\n      body: |-\n        We ensure that the `-webkit-app-region` attribute is only set to `drag`\n        on the header element and we explicitly disable it on modals, as this\n        has unintended behaviour on a non-draggable window with touch-screens.\n    - hash: 73d287e7ee0c8aac57b652cdfc3c74a948741369\n      author: Jonas Hermsmeier\n      footers:\n        change-type: minor\n        signed-off-by: Jonas Hermsmeier <jhermsmeier@gmail.com>\n      subject: \"feat: Use settings for feature control\"\n      body: null\n    - hash: 6a0198639f3332ced7a12c89278777ebb510ca09\n      author: Jonas Hermsmeier\n      subject: \"chore(app): Use settings instead of env vars\"\n      body: null\n      footers:\n        change-type: patch\n    - hash: 40d84b7a826b9d34ecf824fe3a4101b0f347f2af\n      author: Jonas Hermsmeier\n      subject: \"refactor(local-settings): Log JSON parse errors\"\n      body: null\n    - hash: 9eb3eea3f1c428a477fc2f9559d1cd40beeebcee\n      author: Jonas Hermsmeier\n      subject: \"refactor: Move shared/store.js -> gui/app/models/store.js\"\n      body: null\n    - hash: c2e47ca9dcb792787c1c6f67fc49778ecc785f2b\n      author: Jonas Hermsmeier\n      footers:\n        change-type: minor\n      subject: \"refactor: Remove use of localStorage for local settings\"\n      body: null\n    - hash: 2271f3214089f1bfc93902c0853fac83b4fdc3d3\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"test(settings): Update test specs accordingly\"\n      body: null\n    - hash: 45b62f0e7729344927fb56b23ccee917a3a979f5\n      author: Jonas Hermsmeier\n      subject: \"refactor(gui): Move shared models to app/models\"\n      body: null\n    - hash: b4f2bc1cb391d45c2f5aac471851e9398a5675f7\n      author: Jonas Hermsmeier\n      footers:\n        change-type: minor\n      subject: \"feat(app): Make store change-observable\"\n      body: |-\n        This adds true change observability to the store,\n        as the `.subscribe()` callback triggers with every dispatch,\n        even if the data didn't change.\n        Now `store.observe(onChange)` can be used to only be notified\n        once the state data actually changes\n    - hash: 872cd90dc66b230a77de853d8e491347ba2de045\n      author: Jonas Hermsmeier\n      subject: \"fix(test): Fix lint errors & tests\"\n      body: null\n    - hash: 00ab816791993c309b795ec47aee5a07a7d3fc60\n      author: Jonas Hermsmeier\n      subject: \"fix(app): Fix config path on Windows, typos\"\n      body: null\n    - hash: ed25dd931e65d8eb9b6b92d301978397dc64b040\n      author: Jonas Hermsmeier\n      subject: \"refactor(store): Return unsubscribe directly\"\n      body: null\n    - hash: a90287288051c8d447e715e51467908139200878\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: \"minifix(GUI): move success banner back down\"\n      body: null\n    - hash: 0da17de42262452e2563e3d63b02e289ea309efa\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: \"fix(GUI): file-picker performance and design improvements\"\n      body: >-\n        - Replace onClick arrow functions in all components that use them for\n\n        efficiency reasons: 300-500% speed-up\n\n        - Sort by folders and ignore case for better UX\n\n        - Remove use of `rendition.Button` in files, leading to a 10-20%\n\n        performance increase when browsing files\n\n        - Proper sidebar width and spacing\n\n        - Recents and favorites are now filtered by existence async for a tiny\n\n        performance improvement\n\n        - Make Breadcrumbs and Icon pure components to stop frequent\n        re-rendering\n\n        - Initial support for array constraints\n\n        - Use first constraint as initial path instead of homedir if a\n\n        constraint is set\n\n        - Use correct design height on modal, `calc(100vh - 20px)`\n\n        - Reset scroll position when browsing a new folder\n\n        - Fuse Bluebird `.map()` and `.reduce()` in\n\n        `files.getAllFilesMetadataAsync`.\n\n        - Use `localeCompare`'s own case-insensitive option instead of calling\n\n        `.toLowerCase()` twice on `n-2` files compared.\n\n        - Use 16px font sizes in sidebar and files to match design.\n\n        - Disable `$locationProvider.html5Mode.rewriteLinks`, which seemed to\n\n        take 50ms of the directory changing time.\n\n        - Leave file extension as-is in `files.getFileMetadataSync` and the\n\n        async counterpart for a very minor performance improvement.\n    - hash: d99fe944f3e29484e4ad32d52076a071e2e5b0d4\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"test(eslint): Fix JSX not being linted\"\n      body: null\n    - hash: fc22e9e28a64640ff4ab0d46af79c4e5632f0697\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): Update React to v16\"\n      body: null\n    - hash: 4ddac50d9bd6c89287621be104cefdcb147a07ba\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: \"minifix(GUI): resolve react missing key field warning\"\n      body: We attach key fields where necessary to make the warnings go away.\n    - hash: fffdeb1320b0efa6c5feda5866cce4eb968f18cf\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"chore(package): Add npm run script for webpack\"\n      body: Make life simpler\n    - hash: 201995eb90862d16bcf27a0328bfa1a7b85cbed4\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(diskpart): Fix diskpart argv when tmpdir contains spaces\"\n      body: |-\n        This escapes the diskpart script filename when shelling out,\n        to avoid failure when the username and thus the `os.tmpdir()` path\n        contains spaces.\n    - hash: 2986d85b26bfd8022389bdb34185dbbf1f885559\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: \"fix: ensure file-picker is slicing arrays\"\n      body: |-\n        We ensure the file-picker is slicing arrays when the localStorage values\n        aren't available.\n    - hash: 117a7762e1340a4a54d8f71ff552864fadbea69f\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: \"fix: add missing files module\"\n      body: |-\n        We add a convenience module for file and path operations.\n        Tests included.\n    - hash: 67283821414583a13613d28456704266e50025a7\n      author: Benedict Aas\n      footers:\n        closes: https://github.com/resin-io/etcher/issues/2243\n        change-type: patch\n        changelog-entry: Hide unsafe mode option toggle with an env var.\n      subject: \"feat(GUI): hide unsafe mode option with env var\"\n      body: |-\n        We hide the unsafe mode option toggle with an env var\n        `ETCHER_HIDE_UNSAFE_MODE` that also enables unsafe mode.\n    - hash: c08cf61d0ca0c203c504418502b09a7f3bcf3318\n      author: CherryDT\n      subject: Fix devtools key binding for Windows in SUPPORT.md\n      body: null\n    - hash: c5e5141b219057fcea35ae5bca18111a8ac313e9\n      author: Benedict Aas\n      footers:\n        closes: https://github.com/resin-io/etcher/issues/2264\n        change-type: patch\n      subject: \"feat: blacklist devices by device path\"\n      body: |-\n        We use `devicePath` instead of `device` to blacklist drives using the\n        `ETCHER_BLACKLISTED_DRIVES` environment variable.\n    - hash: 447efc70966b7ee5cda0e4546dbe9e6062486694\n      author: Jonas Hermsmeier\n      footers:\n        change-type: feat\n      subject: \"feat(gui): Add desktop notification setting\"\n      body: |-\n        This adds a setting to disable desktop notifications, to be controlled\n        via configuration file\n    - hash: 2a6670a4046732a3b6387f10143cd7c22345b391\n      author: Benedict Aas\n      subject: \"feat(GUI): use design background and drive size ordering\"\n      body: |-\n        We use the new design background color, and order the drive step size in\n        accordance with the new design as well.\n        Related: https://github.com/resin-io/etcher/issues/2310\n        Change-Type: patch\n        Changelog-Entry: Use new design background color and drive step size\n        ordering.\n    - hash: 6232cc7d49781716f9d3d4b44d760ca5ed4d1fc0\n      author: Benedict Aas\n      footers:\n        related: https://github.com/resin-io/etcher/issues/2285\n        change-type: patch\n        changelog-entry: Add electron-native file-picker component.\n      subject: \"feat(GUI): add electron-native file-picker component\"\n      body: >-\n        We add a file-picker written with Rendition/React. It is activated with\n\n        the `ETCHER_EXPERIMENTAL_FILE_PICKER` environment variable. Further\n\n        customisation can be done with the\n        `ETCHER_FILE_BROWSER_CONSTRAIN_FOLDER`\n\n        variable that takes a path and allows one to constrain the file-picker\n        to\n\n        a folder.\n    - hash: 687e0b563b0dc3619ece4ce49d353d5838a21ff6\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"minifix(gui): Don't check for updates when in resin\"\n      body: |-\n        This disabled Etcher checking for updates & showing update notifications\n        if running under resinOS with update locks enabled\n    - hash: 53f8e9328d3099ec05745cb92b2c4bd883b6f2e5\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"feat(gui): Add ability to set analytics tokens via env\"\n      body: |-\n        This adds the ability to set the Sentry & Mixpanel API tokens\n        via environment variables.\n    - hash: e0ebdc904586aae5afff28ca9d2de71b26db25b2\n      author: Benedict Aas\n      footers:\n        closes: https://github.com/resin-io/etcher/issues/2310\n        change-type: patch\n      subject: \"feat(GUI): use new design blue and spacing\"\n      body: We use the new design blue, spacing, and order of step buttons.\n    - hash: 3d47f494a8ade53195814a0c05b73460b846a0b0\n      author: Jonas Hermsmeier\n      footers:\n        change-type: minor\n      subject: \"feat(gui): Add resin update lock based on inactivity\"\n      body: |-\n        This adds functionality to acquire & release the update lock\n        when running under resinOS, re-using the `ELECTRON_RESIN_UPDATE_LOCK`\n        environment variable from `resin-electronjs`.\n        Further this adds the `ETCHER_INTERACTION_TIMEOUT_MS` env var, to\n        facilitate adjusting the inactivity period required to release the lock.\n    - hash: ad6be11bbca1bbe3f17e207bd94e9cd17624e6b5\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): Bump drivelist 6.1.7 -> 6.2.2\"\n      body: This will enable use of unique device paths on Linux\n    - hash: 7eba1ece2693383a98072d2385ffa90db890034d\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"doc(README): Use ubuntu keyserver for apt-key\"\n      body: |-\n        As pgp.mit.edu has become extremely unreliable, this switches to\n        keyserver.ubuntu.com for retrieval of package keys\n    - hash: 5863319c0bad978b4de16405a7d24a2519b54fec\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"minifix(gui): Only enable Kiosk Mode when FULLSCREEN is set\"\n      body: |-\n        This fixes the `kiosk` setting always being true, and causing\n        the operating system's desktop to disappear.\n    - hash: fb67b71faae29f550c10b4d29ba27f9d44418873\n      author: Benedict Aas\n      subject: \"feat(GUI): blacklist drives with an env var\"\n      body: |-\n        We add an environment variable `ETCHER_BLACKLISTED_DRIVES` that allows\n        us to filter certain drives from ever showing up in Etcher with comma\n        separated device paths, e.g. `/dev/sda,/dev/sdb,/dev/mmcblk0`.\n        Closes: https://github.com/resin-io/etcher/issues/2264\n        Change-Type: patch\n        Changelog-Entry: Allow blacklisting of drives through and environment\n        variable ETCHER_BLACKLISTED_DRIVES.\n    - hash: 9fbf608fadc59b9bda767ea2bb19883bcb08d52b\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Use GTK-3 darkTheme mode.\n      subject: \"feat(GUI): use gtk3 dark theme mode\"\n      body: |-\n        We enable the `darkTheme` mode for GTK-3 applications (mainly Linux)\n        that suits Etcher's dark theme better, making the window title bar dark.\n    - hash: 5eed94a22dc01210257f08b91f03a1ad7fc65b61\n      author: Benedict Aas\n      footers:\n        closes: https://github.com/resin-io/etcher/issues/2307\n        change-type: patch\n        changelog-entry: Add environment variable to toggle fullscreen.\n      subject: \"feat(GUI): add env var to toggle fullscreen\"\n      body: We add an environment variable to toggle Etcher in fullscreen.\n    - hash: 1748bf2e2ae4c5241a4ca5047f2238b330290bae\n      author: Jonas Hermsmeier\n      footers:\n        change-type: minor\n        changelog-entry: Add support for configuration files\n      subject: \"feat(gui): Add ability to read settings from a config file\"\n      body: >-\n        This adds the capability to configure settings via a `.etcher.json`\n        file,\n\n        either in the user's home directory, or the current working directory.\n\n        In the case of the home directory, the config file is\n        `$HOME/.config/etcher/config.json`,\n\n        while on Windows `$HOME/.etcher.json` is used.\n\n        The defined settings are merged with localStorage settings, and\n        preceding\n\n        configuration files.\n\n        If both are present, the current working directory takes precedence.\n    - hash: 2045066b1661b0a5fea2b56042ed853ff1852bd9\n      author: Benedict Aas\n      footers:\n        closes: https://github.com/resin-io/etcher/issues/2263\n        change-type: patch\n        changelog-entry: Show selected drives below drive selection step.\n      subject: \"feat(GUI): show selected drives below drive step\"\n      body: |-\n        We add a list of selected drives below the drive selection step, able to\n        accommodate four lines of drives before scrolling occurs.\n    - hash: 97f878fbc22f218a0313a5837fb9ad48138ea8c5\n      author: Benedict Aas\n      subject: \"feat(GUI): env var toggle autoselecting all valid drives\"\n      body: |-\n        We introduce an environment variable\n        `ETCHER_DISABLE_EXPLICIT_DRIVE_SELECTION` that both enables\n        autoselection of drives and disables explicit drive selection by hiding\n        the buttons allowing this. All valid drives are autoselected, i.e. any\n        drive-image pair that does not result in an error, however warnings are\n        accepted.\n        Closes: https://github.com/resin-io/etcher/issues/2262\n        Change-Type: patch\n        Changelog-Entry: Introduce env var to toggle autoselection of all\n        drives.\n    - hash: c00b7b62d6ea2e1213a0b02722f0c364c2622d7d\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: \"minifix: add jsx files to gitattributes and attribute jviotti\"\n      body: null\n    - hash: 51487125d9e5f9fa94ff952249b3643c17841992\n      author: Benedict Aas\n      footers:\n        closes: https://github.com/resin-io/etcher/issues/2245\n        change-type: patch\n        changelog-entry: Add a button to cancel the flash process.\n      subject: \"feat(GUI): add button to cancel flash process\"\n      body: |-\n        We add a cancel button next to the flash progress bar that gracefully\n        aborts the flash process.\n    - hash: 702658cca5d5bae496a3ce3bc7b151050cd0daef\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: \"minifix(GUI): negate predicate to show help icon\"\n      body: null\n    - hash: be478e77cfc0b7544c20383227f4a48813fe2901\n      author: Benedict Aas\n      footers:\n        connects-to: https://github.com/resin-io/etcher/issues/2263\n        closes: https://github.com/resin-io/etcher/issues/2241\n        change-type: patch\n        changelog-entry: Center content independent to window resolution.\n      subject: \"feat(GUI): center content independent to window resolution\"\n      body: |-\n        We pave way for different sizes of Etcher windows by dynamically\n        centering the content with flexbox.\n    - hash: 03c7998c112a661a0d382827b2611839dc29a156\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: \"feat(GUI): add drive quantity to flash analytics\"\n      body: |-\n        We add a field `driveCount` to the flash analytics events in the image\n        writer.\n    - hash: 6badcefb67192e313d09dccb3f5a07aaf5f1569a\n      author: Alexis Svinartchouk\n      footers:\n        change-type: patch\n        changelog-entry: Load usbboot adapter on start on GNU/Linux if running as root.\n        signed-off-by: Alexis Svinartchouk <alexis@resin.io>\n      subject: \"fix(sdk): Load usbboot adapter on start\"\n      body: null\n    - hash: cdc51f4f3f67b2cbb385e9b6617386e560990f84\n      author: Benedict Aas\n      subject: \"fix(GUI): fix multi-writes analytics\"\n      body: |-\n        We make the analytics block into a function `handleErrorLogging` and\n        use it in the fail event that happens during multi-writes. Previously\n        error events would be handled when single drives were flashed on Promise\n        rejection, instead we now only handle the Promise rejection when all\n        devices fail as a special event.\n        Change-Type: patch\n        Changelog-Entry: Fix multi-writes analytics by reusing existing logic in\n        multi-write events.\n    - hash: b8897e01932d153c350bfde930a76117c4907d6d\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"feat(writer): Use xxHash instead of SHA512 for verification\"\n      body: |-\n        This switches from SHA512 to xxHash for verification hashing,\n        as xxHash provides more throughput.\n    - hash: 150e8112eaf126733a906f0807e17ccf8941a6ac\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"minifix(writer): Increase HWM for verification readstream\"\n      body: null\n    - hash: 046ee2c217cb4c075c8bf47416cd842f4d2259d5\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"doc: Update MAINTAINERS.md with Symantec Whitelisting\"\n      body: >-\n        This adds instructions for submitting Etcher for false positive\n        detection\n\n        to Symantec Endpoint Protection.\n    - hash: bb2dac75040554c0ba2c7e50ff9ecd61608e7d38\n      author: Benedict Aas\n      footers:\n        closes: https://github.com/resin-io/etcher/issues/2247\n        change-type: patch\n        changelog-entry: Allow disabling links and hiding help link with an env var.\n      subject: \"feat(GUI): allow disabling links and hiding help link\"\n      body: |-\n        We allow users to pass an env var `ETCHER_DISABLE_EXTERNAL_LINKS` to\n        disable external links and hide links rendered useless by the change\n        such as the help icon.\n    - hash: e6ea3879c33058a03914f506a00b3eabbab0c666\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Add a convenience Storage class on top of localStorage.\n      subject: \"feat(GUI): add convenience localstorage class\"\n      body: |-\n        We add a class `Storage` and accompanying helper methods that makes\n        localStorage usage easier.\n    - hash: 52cc8cb8fc34c437fb5ec0425d69c1075014b83d\n      author: Benedict Aas\n      subject: reset getAll on error, use setAll\n      body: null\n    - hash: 40df4a94a79cb5a769e04228ac5d59b27370d766\n    - hash: 3ee7a43550d1b4c29d3ebd3128388623d78ef8f4\n    - hash: 661c1f47c3bd3a49e08e9bb49b15db68a23f1bb7\n    - hash: d5514b1aa378799f434f1b6c416c5091b306563a\n    - hash: 5f85258e84f7ab727d47ea61f8ab690a9279a483\n    - hash: abba107e2061caffcb9bd724e6f2f2fd7c455603\n    - hash: 6c61292fc650115a527e0dbfbc1eeead5556a09e\n    - hash: eaf9acf428218aafa6cc59843ead55a178560b26\n    - hash: b3776180335901e8bf03ad933f39eb23b9cb6444\n    - hash: f0242b89f6ee732e9ece90b69542c242a8569f63\n    - hash: 0bc970b217f138842e5253f3ad5f0a72b26bdf41\n    - hash: 81387511fe0051fec7ad2aa46df2311be6782b1c\n    - hash: 26779ef1fb8f5f103338c6effab3b35f18c0606c\n    - hash: c3b5f8a2abbd213a0a314b7907aa38c1406d696e\n    - hash: d3a4753b79c84ffefde136b49e5944770047c964\n    - hash: 553fbf1a77c1ddc6667038e7ea7e64ce2a6ab21b\n    - hash: 12cc0de57156037954ec4f96abb4564d6dc4b879\n    - hash: 3fad7c26faf4b2a40a74c4cdde943154161b8eea\n    - hash: df2216df05653ff9bc0b8ddb7d60e5ad73ce1d76\n    - hash: e76674a399ba3e82d70efaacc8da9c8cd0bad3bb\n    - hash: 0bf063f1374913afd1d1366552767b5878a2ff11\n    - hash: 84df7497114134cee92715f8afe1bd5b242cf1a4\n    - hash: 4c40c8ff30b921c302883db9ae8f267a6d27095d\n    - hash: 417499134596190eafea1e49f40b807c4883efcf\n    - hash: 8f762484f29e5f2e28eaa2865f232643bf1cbcf2\n- version: 1.4.4\n  date: 2018-04-25T15:36:37.000Z\n  commits:\n    - hash: df8bacd82e598339061841d2e5fb051b4eff3928\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(tests): Revert unintended change to raspberrypi-raw.dmg\"\n      body: This file was accidentally changed due to a globally executed search &\n        replace\n    - hash: 597c197ffc939f73bf12e71b013d7b9dd230353d\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: \"minifix: replace succeeded with successful in messages and tests\"\n      body: null\n    - hash: 5a788b04b5698bdd1f2f4eec5100f48bcd271812\n      author: Benedict Aas\n      footers:\n        fixes: https://github.com/resin-io/etcher/issues/2267\n        change-type: patch\n        changelog-entry: Keep single warning-drive-image pairs selected.\n      subject: \"fix(store): keep single warning-drives selected\"\n      body: |-\n        We ensure that drive-image pairs with warnings don't get deselected when\n        there is only one drive available. This happenened because there was no\n        check for any previous selected devices. Comes with a test case.\n    - hash: a8bbe02e2114a03f461281b317c7ed0a57ef9c86\n      author: Jonas Hermsmeier\n      subject: v1.4.4\n      body: null\n    - hash: 2d48010af7611dde1f636abfd5c0335679b521b6\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: \"refactor(GUI): make the finish notification message concise\"\n      body: |-\n        We make the finish notification message print the device name as usual\n        when there's one target, and instead list quantity of successful and\n        failed devices when there are multiple. Previously it would list all\n        device names, and wouldn't specify how many were successful or failures.\n    - hash: c4d7076fe816d57581b0f3845a00f173bb13e457\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: \"refactor: use word successful instead of succeeded\"\n      body: We replace 'succeeded' with 'successful' throughout the codebase.\n    - hash: 4be1f890d3254b4d4e81f7d8450288020f2e1ba4\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: \"fix(GUI): remove success screen dots with a quantity of zero\"\n      body: |-\n        We remove success screen dots that are zero, which mainly means that the\n        error dot disappears as it shouldn't currently be possible to end up\n        with zero successful devices on that screen.\n- version: 1.4.3\n  date: 2018-04-20T13:45:48.000Z\n  commits:\n    - hash: 963f1a11eb8994111b860de4c769725f9ff0ec00\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(gui): Fix zero-zero devices when verify is disabled\"\n      body: |-\n        This fixes a state where the success screen would display\n        zero succeeded and zero failed devices if verification was\n        turned off. This could occur due to the \"done\" event being\n        emitted before the next progress event could set the relevant data.\n    - hash: 1d4ea2164f6fdce9b2b36e79b333e417d816da71\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(gui): De-serialize errors from flashResults\"\n      body: null\n    - hash: b63bb1ac0c5f824aed14fc824367ecec5a00062d\n      author: Jonas Hermsmeier\n      subject: v1.4.3\n      body: null\n    - hash: 3bac0225e5a374a833a1ad0da1f62af9b448620b\n      author: Jonas Hermsmeier\n      subject: \"refactor(usbboot): Move lib/blobs/usbboot/ ->\n        lib/sdk/adapters/usbboot/blobs\"\n      body: null\n    - hash: 4c8b97afb3e4032533cfc1cb168d7513ce72ff51\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(usbboot): Move blob handling to SDK\"\n      body: |-\n        This moves the usbboot blob handling into the SDK to avoid\n        root dirname conflicts through shimmed __dirname in bundled UI\n        and different contexts of execution.\n- version: 1.4.2\n  date: 2018-04-18T21:07:50.000Z\n  commits:\n    - hash: 5867edcc70af54b35436525caf13fc6f0c975a85\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Revert using native binding to clean disks on Windows\n      subject: 'Revert \"feat(lib): Use win-drive-clean instead of diskpart\"'\n      body: |-\n        This reverts commit 47fc1b7357bdb9e9aa8e2d7476690435087d984e\n        in order to prevent a possible regression, until properly investigated\n        and fixed.\n    - hash: b3a7255eed41ab825f270bad622d2f8c0b8ae39a\n      author: Jonas Hermsmeier\n      footers:\n        change-type: fix\n        changelog-entry: Fix usbboot blob loading\n      subject: \"fix(drive-scanner): Fix usbboot blob path when bundled\"\n      body: This fixes the usbboot blobs path when the application is bundled &\n        packaged.\n    - hash: 4190a87171b9baa2576c316131ebcb991dc264f4\n      author: Jonas Hermsmeier\n      subject: v1.4.2\n      body: null\n    - hash: c225dd89c66ee812cbc51f4e9d25b9be85828f97\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(image-writer): Remove use of _.isError\"\n      body: >-\n        `_.isError()` returns `true` for anything that has a `name` and\n        `message`\n\n        property, causing the check here to always keep the plain object as\n        error.\n    - hash: 355373f24df6be0989fad9429c2230166b33a3bf\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Exclude RAID devices from drive selection list\n      subject: \"fix(adapters): Always ignore RAID attached devices\"\n      body: null\n    - hash: 1d44eff896737ba0144e8334666cb28de0addfbe\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): Update drivelist 6.1.5 -> 6.1.7\"\n      body: >-\n        This fixes a ReferenceError that could occur when the DeviceNode was\n        null,\n\n        as well as devices being null when run after the system recovers from\n        sleep / standby.\n    - hash: 6e7484d3dabc2aeaa7cd471822d7019860cc4a5c\n      author: Benedict Aas\n      subject: \"feat(GUI): display succeeded and failed devices on finish screen\"\n      body: |-\n        We display the quantity of succeeded and failed devices using status\n        dots on the finish screen.\n        Change-Type: patch\n        Changelog-Entry: Display succeeded and failed device quantities on the\n        finish screen.\n    - hash: ede510139f2efe4f4c76848507e4b0129daac10d\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(ci): Fix pip installation\"\n      body: |-\n        The pip tarball URL now redirects to another location, which\n        caused `curl` to fail, as the follow-redirects option wasn't specified.\n    - hash: 854bd335b6d26ba40534d091fac02313a3e79c48\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: \"minifeat(GUI): prefix multiple devices label with quantity\"\n      body: |-\n        Change the `Multiple Devices (n)` label on selected devices to a\n        quantity-prefixed form `n Devices`.\n    - hash: cf1dc8681e67161a4a5ebf4500661abe0c99e056\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Make the progress button blue on verification.\n      subject: \"feat(GUI): make the progress button blue on verification\"\n      body: We make the progress button blue on verification.\n    - hash: e1ef3de53c0b4b4373b425174976e5f919e876c2\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: \"feat(GUI): remove unnecessary status dots\"\n      body: |-\n        We remove usage of the status dots except when failed devices occur, in\n        which case we still display the red failed dot and quantity. We also use\n        singular and plural depending on the quantity of failed devices.\n    - hash: cc848ef9f277723e6ef1e91e482103dec16819df\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(child-writer): Fix handling of user errors over IPC\"\n      body: |-\n        This fixes transmission of user errors over IPC, as the `report`\n        property was previously missing. Further it also adds more properties\n        to `errors.toJSON`, like `syscall`, `errno`, etc. and re-uses the method\n        for failure signalling.\n    - hash: d59ebad167392afe689bca0e8cdecb1a38834f05\n      author: Benedict Aas\n      subject: \"fix(GUI): display untitled device when device lacks description\"\n      body: |-\n        We fallback to `'Untitled Device'` when the device lacks a\n        `.description` field.\n        Change-Type: patch\n        Changelog-Entry: Display Untitled Device when the device lacks a\n        description field.\n- version: 1.4.1\n  date: 2018-04-10T22:14:22.000Z\n  commits:\n    - hash: 741f540f773887c5573aaafff3a2102c22ff7caf\n      author: Jonas Hermsmeier\n      subject: v1.4.1\n      body: null\n    - hash: bec61f4ce7388d549d0bebf1bb258cf895a1fad5\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(webpack): Exclude package.json from UI bundle\"\n      body: null\n    - hash: 8050fa58a53f214ba3958cd1da3e99979ff764a2\n      author: John (Jack) Brown\n      footers:\n        change-type: patch\n      subject: Enable nodeGypRebuild for Etcher builds\n      body: |-\n        This will ensure we have all bindings built, even when using cached\n        modules.\n    - hash: 3906816e67f7cd4722ad95e8f48f6dcd1942b0cb\n      author: Jonas Hermsmeier\n      footers:\n        change-type: none\n      subject: \"doc(README): Remove Mac OS from Travis CI badge label\"\n      body: |-\n        This removes the \"mac\" from the Travis CI badge label, as we're not\n        running Mac OS builds on Travis CI anymore.\n    - hash: 950f853fa37c99f542dea6dd25e23c1b75d3860b\n      author: Jonas Hermsmeier\n      subject: v1.4.0\n      body: null\n- version: 1.4.0\n  date: 2018-04-06T18:59:35.000Z\n  commits:\n    - hash: fe43e21484f6356e0709b399d03e8796189d4f61\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Display image size for comparison if drive is too small\n      subject: \"feat(gui): Display image size when drive too small\"\n      body: |-\n        This adds a display of the determined image size to the\n        drive label when the drive has been determined to be too small.\n    - hash: 2f872375efd10efd98461cb0a0833da5f6d408a6\n      author: 林博仁\n      footers:\n        change-type: minor\n        changelog-entry: Remove unused robot protocol\n        signed-off-by: 林博仁 <Buo.Ren.Lin@gmail.com>\n      subject: \"docs: Add WoeUSB as an alternative tool to burn Windows USB images\"\n      body: |-\n        By far WoeUSB is one of the few applications that support Windows image\n        and runs on GNU/Linux so I assume it is worth to mention it.  Additional\n        line wrapping is made to comply to the code conventions.\n    - hash: f119ca683e78818ab1ad791f5d11d8c0d4e69ff9\n      author: 林博仁(Buo-Ren Lin)\n      footers:\n        change-type: minor\n        signed-off-by: 林博仁 <Buo.Ren.Lin@gmail.com>\n      subject: \"docs: Add WoeUSB as an alternative tool to burn Windows USB images(2)\"\n      body: Performing requested change, this commit is supposed to be squashed with\n        the previous one.\n    - hash: 176c6b76cdead2ba6cce8145d1a0e98208d567f2\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Upgrade eslint to use object-curly-newline options.\n      subject: Merge branch 'master' into patch-1\n      body: null\n    - hash: 222257d25d6694343d4804f3a84818aeeab4435d\n      author: Shou\n      footers:\n        change-type: patch\n        changelog-entry: Add drive multi-selection to the store.\n      subject: \"feat: add drive multi-selection in store\"\n      body: |-\n        We lay the foundation for multi-selecting drives by implementing it into\n        the `store` and relevant modules interacting with the `store`.\n    - hash: dd961ad30bd040f658f5e2e78e1e6551cb1acafd\n      author: Shou\n      footers:\n        change-type: patch\n        changelog-entry: Separate SVG component's path and content attributes.\n      subject: \"feat(GUI): separate svg path and content attributes\"\n      body: |-\n        We separate the SVG component path and content into attributes\n        `paths` and `contents` which take lists of strings that are\n        tried until one succeeds. `contents` takes precedence over `paths`,\n        i.e. it is tried first.\n    - hash: f958f3751dc4678511d52d6eb883a859ecdd2954\n      author: Jonas Hermsmeier\n      footers:\n        change-type: minor\n        changelog-entry: Use native code to clean drives on Windows\n      subject: \"feat(lib): Use win-drive-clean instead of diskpart\"\n      body: >-\n        This replaces shelling out to `diskpart` on Windows to clear\n\n        the partition table with `win-drive-clean`, which does so via\n        DeviceIoControl.\n    - hash: abf2dc3efcf214a68c0b0e329d57a3f66bb5d342\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: \"fix: move tabindex attrs to button from within\"\n      body: |-\n        We move the `tabindex` attributes to the button element directly from\n        elements contained within the button element – this is to satisfy the\n        HTML linter.\n        Changelog-Entry: Move tabindex attributes to button elements from\n        contained elements.\n        Change-Type: patch\n    - hash: 07d6fde34eea42d34084c7fc1274d168e6623008\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Replace ng-show/hide with ng-if on main page.\n      subject: \"feat(GUI): replace ng-show and ng-hide with ng-if\"\n      body: |-\n        We replace `ng-show/hide` with `ng-if` on the main page in order to\n        remove unnecessary calls and become more efficient.\n    - hash: 90d32197664e19946998c3e7c3dbe6cf43cf7cbf\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Add icon next to drive size when compatibility warnings exist.\n      subject: \"feat: add icon next to drive on warnings\"\n      body: |-\n        We add an icon next to the drive size that is displayed when there is a\n        drive-image compatibility status message available. We display the first\n        one in the list and importance is then enforced by the order they are\n        added to the list in `drive-constraints`.\n    - hash: 47aef71dc7e8cc29354a0da71943132865c8c6e0\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Add spacing to the drive warning icon.\n      subject: roll back SIZE_NOT_RECOMMENDED change\n      body: null\n    - hash: edf924d012d0c9c598448524cbd0fcdd51387c7d\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Log the banner load event to analytics.\n      subject: \"feat: log the event status of the banner\"\n      body: We add log the banner HTTP load event object to the analytics.\n    - hash: 5e6f7e41e62c16b22dd6956c3482dbe5c9c4e60f\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: only allow 200 OK statuses\n      body: null\n    - hash: 543098cba301030b4e267756fa8c3cb284123a21\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Replace template paths with template contents.\n      subject: \"feat: replace template paths with contents\"\n      body: |-\n        We replace the `templateUrl` fields with `template` fields and thus\n        switch from template paths to template contents in preparation for the\n        Webpack PR.\n    - hash: c9a2a47ee184163e6c2841d0c7a8865691bbdcba\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: test other pages\n      body: null\n    - hash: 1f8e09868d1b2fcbd55f6ee71599740241eff538\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: test modal\n      body: null\n    - hash: bc2ad581baf685797bce901e55628af6635e00fb\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: pass linter\n      body: null\n    - hash: 3498d59258a7002d6e604e79564fcbef383915ad\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Line wrap selector size subtitles wholly\n      subject: fix sanity-checks\n      body: null\n    - hash: f8accd62ed439ce8089af8e837b499bb77b8e720\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Hide the size label given multiple devices.\n      subject: \"feat(gui): Add ref params to homepage links in menu\"\n      body: |-\n        This adds a `ref` param to the URLs in the menu,\n        in order to see where page views are coming from.\n    - hash: 57c4a285d8935e040611a156b36fb6e29df5bea7\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Inline middle-ellipsis package as util.\n      subject: \"doc(github): Update instructions in ISSUE_TEMPLATE\"\n      body: >-\n        This updates the instructions to open the Developer Tools in the issue\n        template,\n\n        as the keyboard shortcuts have changed to their defaults on Linux &\n        Windows\n\n        from [Ctrl]+[Alt]+[I] to [Ctrl]+[Shift]+[I].\n\n        Further, the editor config is updated to allow trailing spaces in\n        Markdown\n\n        files to add trailing spaces to the list items in the issue template, in\n\n        order to avoid people not putting whitespace in between, causing the\n        formatting\n\n        to not be parsed properly.\n    - hash: 3dd646485fa34437ac3adb3caa5a594d439f1f68\n      author: Rohit Upadhyay\n      footers:\n        change-type: patch\n        changelog-entry: Replace Lodash templates with arrow-functions.\n      subject: \"refactor: replace lodash templates #1810\"\n      body: |-\n        We replace the lodash templates with arrow-functions and change the\n        single-argument object into multiple arguments.\n    - hash: dc484d79edd95e868208d4288048608954fdc5d4\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Specify UTF-8 encoding with meta tag.\n      subject: \"fix: specify utf-8 encoding with meta tag\"\n      body: |-\n        We specify the encoding to be UTF-8 with a meta tag such that Electron\n        won't get confused and try any other encodings.\n    - hash: 13eb1718aa36d93c1b77944ea2b5aec8a892db4d\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n        changelog-entry: Add `lib/gui/app` folder to ease into Webpack usage.\n      subject: \"feat(GUI): add app to gui folder structure\"\n      body: We add a `lib/gui/app/` folder to help transition to Webpack usage.\n    - hash: 831c9aee2ac0f9f84780455ab35ea662a4558218\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: fix tests\n      body: null\n    - hash: dc587031ecef10eeeba74379f99c4ef42cef8781\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Expose all flash state fields to the store.\n      subject: remove unnecessary test code\n      body: null\n    - hash: 9c1e32d4ba2bb66be3b8b75d7978f37001bee7f0\n      author: Benedict Aas\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n        change-type: patch\n      subject: pass linter\n      body: null\n    - hash: 25b10490a1be4d616aeeefdd5297dd43757f09bd\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Fix \"Array buffer allocation failed\" when flashing some .dmg images\n      subject: \"upgrade(package): Update udif 0.10 -> 0.13\"\n      body: |-\n        This updates `udif` to 0.13.0:\n        **v0.13.0:**\n        - fix(readstream): Use strict mode for compat with Node 4\n        - refactor(lib): Improve & fix zerofill streaming\n        - test: Add passthrough to check for read/push after EOD\n        - test: Add compression method tests\n        - feat(udif): Add LZFSE compression type constant\n        - fix(readstream): Fix passing on readable stream options\n        **v0.12.0:**\n        - feat(image): Support use of custom `fs` instances\n        - feat(readstream): Stream ZEROFILL & FREE blocks\n        Fixes a buffer allocation failure on large zerofill ranges.\n    - hash: cd697d72056d273ddd88f27e0d2a35acc56c55f8\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Use correct usbboot blob path in AppImages.\n      subject: \"fix(gui): Fix DevTools opening in docked mode\"\n      body: This fixes the Developer Tools opening in docked mode by default.\n    - hash: f57df3f2c13093684dc27dc658b4dde1c595bd0b\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(gui): Fix menu's application name\"\n      body: >-\n        This replaces use of `electron.app.getName()` with the package.json's\n        `.displayName`\n\n        property to ensure the correct application name is displayed when\n        packaged.\n    - hash: cf340f48c3582f3e96f7b2dc16c11f44b7661363\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Fix status dots to their position.\n      subject: \"upgrade(package): Update yargs 4.7.1 -> 11.0.0\"\n      body: This updates `yargs` to 11.0.0\n    - hash: f0e0eaace4feaf577fa237f5e8132794339792c6\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"upgrade(package): Bump debug 2.6.8 -> 3.1.0\"\n      body: This updates `debug` to 3.1.0 due to a RegExp DOS vulnerability.\n    - hash: 8afc87225201992aa921fadf6605aca6991a618e\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: declare Concourse node-cli pipeline's entrypoint\"\n      body: null\n    - hash: 1d89cf2b757e096475989bf064df87103517f7c3\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: encode complete paths to patched file in patches/\"\n      body: |-\n        So that the build system doesn't need to know in advance at which\n        directory the paths needs to be applied.\n        This will make it easier to add patches support to the Concourse\n        pipelines.\n    - hash: 9bb292f38ef860f28a646dec4f1f101801a584d4\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"feat(GUI): bundle the GUI code with Webpack\"\n      body: |-\n        This commit introduces a Webpack configuration file that bundles the GUI\n        code along with its dependencies (except the Etcher SDK and its own\n        dependencies), and uses Babel to add support for JSX (required by the\n        Rendition library).\n        The GUI code that goes into the bundle was moved to `lib/gui/app` so we\n        can easily ignore the whole subdirectory when creating production\n        distributable packages.\n        We now have a new make target called `webpack` that can be used to\n        create the GUI bundle. Such target will be called everytime a package is\n        generated.\n    - hash: bcf0d80c4725c83ffe7840ae162d128ebd984225\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: fix encoding issue\n      body: null\n    - hash: fecccb0b28a923229c6b3bfeb4388f46e148482e\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: fix writing outside of packages\n      body: null\n    - hash: 1862f1905a8314a6322c8c1e2ddab1b4e565e800\n      author: Benedict Aas\n      subject: fix makefile\n      body: null\n    - hash: 6647167d02c30e8c9b924fa4a66320e74933fad7\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: Update shrinkwrap file\n      body: null\n    - hash: 0da123265c2747ead17f271ada149b3c7251b246\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: Fix shrinkwrap file\n      body: null\n    - hash: 9b42960b2fdd3c6a20ff533dce75738c1b2b7333\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: remove version ranges\n      body: null\n    - hash: 2aa37571f0c1fcc7d6bfc7455c0332b82b3b979f\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: shrinkwrap\n      body: null\n    - hash: 936142cf7e41ec03290cc06c3df1028180964d13\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: remove console logs\n      body: null\n    - hash: 69c35f7f79229e723035492ba8ce5b567fd082ce\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: shrinkwrap should see a shrink\n      body: null\n    - hash: 9b4e9fea303364ce2dcb9406232c1223534559a3\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Move the drive selector warning dialog to the flash step.\n      subject: \"feat(GUI): move drive selector warning to flash step\"\n      body: |-\n        We move the drive selector warning to the flash step, and concatenate\n        warning messages when more than one needs to be displayed at once.\n    - hash: 4dd79d338e8e31c3669c8ae869caec9ffd0f3912\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Replace Helvetica as the main font with Roboto.\n      subject: \"feat(CSS): use roboto font instead of helvetica\"\n      body: We replace Helvetica with Roboto as the main font.\n    - hash: 79812234702ef07033993924b1e2c6fd2ec4087d\n      author: Benedict Aas\n      footers:\n        fixes: https://github.com/resin-io/etcher/issues/2078\n        change-type: patch\n        changelog-entry: Use SVG contents list in main template.\n      subject: \"minifix: use svg contents list in main template\"\n      body: |-\n        We use a list instead of element with `svg-icon` in `main.tpl.html`, as\n        required by the `svg-icon` component and will return an error\n        otherwise.\n    - hash: 69e85a7ac657c37475552e31f7733d62dddd6b8c\n      author: Benedict Aas\n      subject: \"fix: stop autoselecting empty value in store\"\n      body: |-\n        We fix store autoselection, which selects an empty value when one\n        drive is selected and then ejected, leaving one drive that is\n        supposed to be autoselectable. Now it instead properly autoselects the\n        last drive.\n        Change-Type: patch\n        Changelog-Entry: Stop store autoselection from selecting empty values on\n        drive ejection.\n    - hash: 82b65399af0f8072a56d1280f948c6173aa28909\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Remove stale JSON object plainifying in store\n      subject: \"minifix: remove stale json object plainifying in store\"\n      body: null\n    - hash: 35772b0370e5ad7eb8d7bb25f407e358f8cbfe04\n      author: Jonas Hermsmeier\n      footers:\n        change-type: minor\n      subject: \"fix(perf): Remove support for CRC32 checksumming\"\n      body: |-\n        As crc32-stream was identified as a massive performance bottleneck,\n        we remove it, and default to Node's crypto API with md5 instead.\n    - hash: 49dd6553fb6e1363dac2546f935790dcbbf8e5d7\n      author: Jonas Hermsmeier\n      subject: \"chore(package): Remove crc32-stream dependency\"\n      body: null\n    - hash: d91d9577774a7a0869d039c29ae95809d5a470f1\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(gui): Disable throttling timers when in background\"\n      body: This disables Electron throttling timers when not in the foreground.\n    - hash: 804ac8b4dce41deaf5f19f46578b1f9e6b84bf0e\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): Update resin-cli-visuals to 1.4.1\"\n      body: >-\n        This updates `resin-cli-visuals` in order to fix drive selection in\n\n        the CLI, which was caused by incompatibility of two different\n        `drivelist` versions\n    - hash: bde1e32e29ae75ccecf7fc3bc1b03efd6e4f67b8\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"doc(CONTRIBUTING): Add webpack step to instructions\"\n      body: null\n    - hash: cb25db2556cd70c06b39ae164304433eaa9268d3\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(image-writer): Fix missing error argv\"\n      body: This fixes a missing error argument being passed in .emit()\n    - hash: 74d9fcdbbc7e7dd94c32382e3d8ea6d5dd88bf3f\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): electron-mocha 5.0.0 -> 6.0.0\"\n      body: null\n    - hash: d12166a87244ed022157d3eb73963b9730b8db2d\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): mocha 3.2.0 -> 5.0.1\"\n      body: null\n    - hash: b7ef95f68c28562792b5abe51103f551b1e76324\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): nock 9.0.9 -> 9.2.3\"\n      body: null\n    - hash: a392d3b1b456f6a3f9fb70dd5e0ae1c7597ee318\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): sass-lint 1.10.2 -> 1.12.1\"\n      body: null\n    - hash: 2604da104d08671742bd4a8b62e07dab1cfb4702\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): versionist 2.8.1 -> 2.13.0\"\n      body: null\n    - hash: 544cd96e3dfb07874f0c5e5e8b3c6ad43fd2d2e4\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): html-angular-validate 0.1.9 -> 0.2.3\"\n      body: null\n    - hash: 201b8dccaa7603552c7741798c97fb3111e1c4a4\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): eslint-plugin-node 6.0.0 -> 6.0.1\"\n      body: null\n    - hash: 55ed4dbc51a0a61f5c23fb2734bac9fe831dbb76\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): eslint-plugin-jsdoc 3.3.1 -> 3.5.0\"\n      body: null\n    - hash: 1cc542255790d37329f2bfda63882b4ac37b5f4c\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): eslint-plugin-import 2.8.0 -> 2.9.0\"\n      body: null\n    - hash: a12bb4ee7ccc87acfc595ae27ea2a18ed1010595\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): mochainon 1.0.0 -> 2.0.0\"\n      body: null\n    - hash: 11a0aa322f277c6cbec1a2ead6b999499d1ee3c2\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"test(available-drives): Fix set expected set property\"\n      body: null\n    - hash: c11205f3cd90b07fe680284f4866345d7b0f0325\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(shrinkwrap): Fix resolved URL of git repo\"\n      body: null\n    - hash: bdd05a3f71a764c3ce5dc1dc39e57c83082375f3\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): Update electron-mocha 6.0.0 -> 6.0.1\"\n      body: See https://github.com/jprichardson/electron-mocha/issues/123\n    - hash: 0b306219c1b17f5ce717900e61fd0b439686d6a1\n      author: Jonas Hermsmeier\n      subject: 'Revert \"upgrade(package): versionist 2.8.1 -> 2.13.0\"'\n      body: This reverts commit 2604da104d08671742bd4a8b62e07dab1cfb4702.\n    - hash: 8a70cb59d1a01e9d1063909e02f61fbc0beaa996\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): Update pkg 4.1.1 -> 4.3.0\"\n      body: null\n    - hash: 4a3bd5fe7aa290a5175749c987664d994d76d7f2\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): Update nan 2.3.5 -> 2.9.2\"\n      body: null\n    - hash: ed18842281bb97a95c1b42ab43f183781d79504c\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): Update bindings 1.2.1 -> 1.3.0\"\n      body: null\n    - hash: d116cd7e90b46a80703a0f6ca839b6e057f80de1\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): Update asar 0.10.0 -> 0.14.2\"\n      body: null\n    - hash: f02c090b8d36a663a8975fe82bd725e1a66785e6\n      author: Jonas Hermsmeier\n      subject: \"fix(package): Fix extraneous dependencies\"\n      body: null\n    - hash: 401c2c7cc1fd6d2be388032bd0414020fba2bd8d\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"chore(package): Update copyright years\"\n      body: null\n    - hash: 81b50161682db77c5d3da6ede27a8f1716db15d4\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(webpack): Fix not resolving .json\"\n      body: null\n    - hash: fcc1f7bc895ff3e403ee1d4b39de0c158fb17c42\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Move memoize function to shared utils.\n      subject: \"refactor: move memoize function to shared utils\"\n      body: |-\n        We move the memoize function to `lib/shared/utils.js` and expose it to\n        modules across the project.\n    - hash: 0f16435f51a4999e2caeb788fe796233a8d7d362\n      author: Andrew Scheller\n      footers:\n        change-type: patch\n      subject: \"fix(scripts): Add missing types to architecture-convert.sh usage\"\n      body: null\n    - hash: c724e4cb20298b99d5c6faed4c7c8f810afb5cf5\n      author: Jonas Hermsmeier\n      footers:\n        change-type: minor\n        changelog-entry: Implement writing to multiple destinations simultaneously\n      subject: \"feat(writer): Impl multi-writes in writer modules\"\n      body: Implement writing to multiple destinations simultaneously\n    - hash: ef634227aac2833241817b1885024b116512bf4e\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"feat(cli): Display number of active cards\"\n      body: null\n    - hash: 3424b996c83b07a502bb8e84c2d3715c4b266450\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(writer): Fix state verification count\"\n      body: null\n    - hash: ff5591c77565bcbfacae6aa60248b7f07719918a\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Add missing name param to verifyNoNilFields JSDoc example.\n      subject: \"minifix: add missing parameter to verifyNoNilFields example\"\n      body: |-\n        We add the missing `name` parameter to the `verifyNoNilFields` JSDoc\n        example.\n    - hash: d9ccc43d15109a9d4d0483b637756a960f19c73e\n      author: Jonas Hermsmeier\n      footers:\n        change-type: minor\n        changelog-entry: Move CLI write preparation logic into SDK\n      subject: \"feat(sdk): Move CLI writer logic into SDK writer\"\n      body: |-\n        This moves the preparation logic from the CLI into the SDK\n        in preparation for further SDK rearchitecturing, and to allow\n        standalone usage of SDK.\n    - hash: 3e4a234b2420870679108338fbab5e212625e9cb\n      author: Andrew Scheller\n      subject: \"chore: fixup 'distclean' rule to also delete `generated` directory\"\n      body: \"Change-type: patch\"\n    - hash: 4e4b7f8de67e8a3bec38fc824cada7a2ba9c3c7b\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: only publish production packages to Bintray\"\n      body: |-\n        The devel channels will be completely deprecated. The deb/rpm snapshot\n        builds will still be accessible through GitHub Releases as part of Resin\n        CI builds.\n    - hash: e3537e54b8c05eadedd91c367492f2ab1fd75c2a\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: 'chore: add \"make webpack\" as a Concourse build step'\n      body: We also have to add the generated directory to the final package.\n    - hash: 8591ff83fd6aa228b516bc0119cf80ce4a0df40f\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(package): Add fsevents to platform specific deps\"\n      body: |-\n        This adds `fsevents` to the platform specific dependencies,\n        in order to avoid shrinkwrap disagreements between platforms.\n    - hash: 53d37404fe5fe65403ec664c4ddbf03f24bbff03\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Resolve JSX files\n      subject: \"feat: resolve jsx files\"\n      body: |-\n        We resolve `.jsx` files such that they get handled by babel and bundled\n        with webpack.\n    - hash: 9dae1c27236a38cfc4a50c714222f38966a5963b\n      author: Benedict Aas\n      subject: \"refactor: consolidate store-state nil-checking\"\n      body: |-\n        We make the nil-checking of store state fields generic through a\n        `verifyNoNilFields` function that throws an error if any fields are\n        nil.\n        Change-Type: patch\n        Changelog-Entry: Consolidate store state nil-checking with helper\n        function.\n    - hash: 4310981c8969ef5d5b5bfa1311c741c2b77909e2\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Make all `.label` tags' text bold and remove need for `<b>` tags.\n      subject: \"fix(GUI): make all class label text bold\"\n      body: |-\n        We make all tags with `.label` have bold text and remove the need for\n        `<b>` tags.\n    - hash: 9c59ecf1950b4dc60566c6f1e593e6eedb7c1693\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Add spacing to the drive-selector warning/error labels.\n      subject: \"feat(GUI): add spacing to drive-selector labels\"\n      body: |-\n        We add a right margin to the drive-selector labels so they look nicer\n        when there are multiple.\n    - hash: 2b66762dec7fa62514cf0a62b42a2b760300c100\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(app): Fix enabling debug output\"\n      body: This fixes enabling debug output via the DEBUG env var\n    - hash: 7063f254c6a352b5ecaf291e58a5f51298a58789\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(cli): Remove O_DIRECT & O_EXCL\"\n      body: |-\n        This removes O_DIRECT and O_EXCL flags from the writer,\n        as O_DIRECT can lead to EINVAL under quite a few circumstances,\n        and O_EXCL has proven to be useless.\n    - hash: b0538099cf38bc30247f4f58eb5e1da3dd17f599\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(lib): Fix debug namespaces\"\n      body: |-\n        This fixes some debug namespaces not being prefixed with `etcher:`\n        and their respective subsystems.\n    - hash: 7c9f15d8a9c4c213168657f5af488ad243ccb1dc\n      author: Jonas Hermsmeier\n      footers:\n        change-type: minor\n        changelog-entry: Consolidate low-level components into Etcher SDK\n      subject: \"feat(sdk): Consolidate low-level components into SDK\"\n      body: |-\n        Changes:\n        - Split out scanner into own file\n        - Move `lib/shared/sdk` -> `lib/sdk`\n        - Move `lib/image-stream` -> `lib/sdk/image-stream`\n        - Move `lib/writer` -> `lib/sdk/writer`\n        - Rename `sdk/standard` -> `sdk/blockdevice`\n        - Move adapters into `sdk/adapters` subdirectory\n    - hash: 94ed9d70124171e965219b47c35774bdc1caff14\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Remove stale `invalidKey` check in store.\n      subject: \"refactor: remove stale invalid key check in store\"\n      body: >-\n        We remove a piece of code checking whether `_.keys` returns any\n        non-string\n\n        values in its array, but per the Lodash documentation `_.keys` always\n        returns an\n\n        array of strings.\n    - hash: 83528df18be32bfe62d3e9e4578101077769a7cf\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): Update node-sass 4.5.3 -> 4.7.2\"\n      body: null\n    - hash: 38310751b67a2d86a6eedd1f8108993559281a05\n      author: Benedict Aas\n      footers:\n        fixes: https://github.com/resin-io/etcher/issues/1916\n        change-type: patch\n        changelog-entry: Warn the user on selection of large drives.\n      subject: \"feat(GUI): warn the user on large drive selection\"\n      body: |-\n        We warn the user when they select a large drive to confirm they want to\n        flash in case the device is important.\n    - hash: 57d23535965384461175918432a08b67cb18187f\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Make the drive-selector button orange on warnings.\n      subject: \"feat(GUI): warning makes drive-selector button orange\"\n      body: >-\n        We make the drive-selector button orange when there is a warning\n        attached\n\n        to the image-drive pair.\n    - hash: 4ce89f97fe02d714ce7f247a6a03ad6d326c3a8a\n      author: Benedict Aas\n      subject: \"refactor(GUI): remove selection-state clear options to simplify\"\n      body: |-\n        We refactor and simplify the selection-state `.clear()` by removing the\n        options argument.\n        Change-Type: patch\n        Changelog-Entry: Remove `selectionState.clear()` options argument to\n        simplify.\n    - hash: 6990d7632a946d038cae75df3435d6f2754a9743\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Support building Etcher on armv8\n      subject: \"fix(Makefile): Support arm64 / armv8 / aarch64\"\n      body: This adds support for 64bit arm cpu architectures.\n    - hash: fbb175608dc13f1295af169ccb46e2f476d36d19\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Increase UV_THREADPOOL_SIZE to allocate 4 threads per CPU\n      subject: \"feat(writer): Increase UV_THREADPOOL_SIZE\"\n      body: |-\n        This increases the UV_THREADPOOL_SIZE to CPUs * 4 to\n        facilitate full write speeds when writing to multiple destinations,\n        in preparation for integrating multi-writes.\n    - hash: 605392522f058f14b551720483313c46866f6b2e\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Rename selection-state and store functions.\n      subject: \"refactor: rename selection state and store functions\"\n      body: We rename functions in `selection-state` and the `store`.\n    - hash: eb0f52cddc6b6a3c5b5cfb869715db4aebeadff9\n      author: Benedict Aas\n      subject: unselect -> deselect\n      body: null\n    - hash: d50bc92909dcb2c2ca46994ba2956b5fb6e55762\n      author: Benedict Aas\n      subject: \"feat(GUI): add descriptive name to modals\"\n      body: |-\n        We add a descriptive name to modals for analytics and debugging.\n        Change-Type: patch\n        Changelog-Entry: Add descriptive name to modals for analytics and\n        debugging.\n    - hash: 7a0d385e12332d33e83941c87c9c8a12ce7cda4f\n      author: Benedict Aas\n      subject: log name in resolve/reject/error\n      body: null\n    - hash: 04352494a05eefca54d6a8655ecc9be4ea568403\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"test: Remove unnecessary `file-exists` dependency\"\n      body: null\n    - hash: 0bc09defa7f347168d60d84c9476752be9c638ca\n      author: Jonas Hermsmeier\n      subject: \"chore(package): Remove unused dependency `trackjs`\"\n      body: null\n    - hash: ab026b1635e21fa416faa92b8bcfa0d1be5317b4\n      author: Jonas Hermsmeier\n      subject: \"test(image-stream): Fix lint error in tester\"\n      body: null\n    - hash: 76f537a636171508ace9ac2ae1159d568837e425\n    - hash: fdd0d781ca206556f27a7cbfae15b0c7bcee3584\n    - hash: 5634954b7e5ad9150994c6ea3a20cc573222f4a4\n    - hash: 39ea2b96c9aa0ee2c64447ba3661dd98323a4fd2\n    - hash: f3c9d9b85336fb9b49674ed81cb10af278f7d1b1\n    - hash: 504826051c4c99bccdd11e054ba4ab17ccdc2c6b\n    - hash: 47fc1b7357bdb9e9aa8e2d7476690435087d984e\n    - hash: 76a05d2dc9e996cddff5b15ed65d9f6cf9142f58\n    - hash: e769ef7d0bac50b438e483e7a15a1e68e0f85b4f\n    - hash: 56d408c195d3760b44e84e5c9249e48b2332b9e4\n    - hash: f756c965fcdd3c99098c4daef88a6f04f8054164\n    - hash: 4869f1f97cbc960caf869e974d7e31db103c3094\n    - hash: 8a92810a69c9f9e59992e4d434714a252045e316\n    - hash: db2bed896a064d4d78383a7f7635896ca58b0a4b\n    - hash: f2424095e034e0bfef1bed04d8ee03a4e41adc1b\n    - hash: ad0b5e758311de5938375b390f9ba4f7584b6d8b\n    - hash: d5a14031c63e6c7d4c5eba793b2e53c4e21596cf\n    - hash: 96c76177af6f37f088708722799042d961c34180\n    - hash: 5754b4c6af79bc96553e950700d465b8290c2d31\n    - hash: f6bfdb2ced96e8e91f1fadf7dda8aed6f4f38179\n    - hash: b83e06ca809d99431f6228ab065c897d4b05174b\n    - hash: c054642f24e48dd02f09b0b0780910c5a7811866\n    - hash: 20bc08630322bec539d926507191dd29ab27b813\n    - hash: 514c8ec665b248dca5cb84365be834da72a13367\n    - hash: 3e6c68728e9c894d4a0351256add4b3ec9a0aff8\n    - hash: 2fc961db2868f365b176cd33584ff8f80299b25b\n    - hash: d01b73a66160b124949976dce7db21c63cfc4ac1\n    - hash: a5aaf760d0613d92934481ae6b5693da383bd05c\n    - hash: 72ca73e42981d79e2167612195d0ab969fcb10b0\n    - hash: fb19facbe5c3d9c1241a6f6301cb72b3144171d0\n    - hash: 92019ae6977963eab0878dac95ed31109078437b\n    - hash: 2dbdbbe3a30fdfa2f45a20a1209d8ab6d57d3764\n    - hash: 40fe3392be09799a03b8a724fef7e3bead1bb0d8\n    - hash: 90cfbe6dc34756c23fc1b091fa5d943259e48118\n    - hash: 1225b23b4029ac185577cee4811bcac36560ba59\n    - hash: 48e3fbae5db397bb6500817281e9f72a55f27518\n    - hash: 3634927ae55065391b20e418e7dd1217ebb07df3\n    - hash: 948283154ac905faf18abd74c1486388294013c9\n    - hash: 477257b46dc7ad8ad0e7bc4815c3745d473640d7\n    - hash: a356f023fe8ca5b6ee679442d1d91f5b76620b05\n    - hash: fac77420b22864859dda748d754a6ffbfd1a63de\n    - hash: 50c88a1422431b3bb0dba58231ec84ff31f1a081\n    - hash: 6dd9d8d69006155c59d6688d42a27a1f83705a5c\n    - hash: 15647eee97f7afd7700445d9b02815e1f7a50e57\n    - hash: 4108979b653a57a03149c8590d1d9b79689c928a\n    - hash: 737b3be5beb645a4d0661adbe63e993c51c2c3ad\n    - hash: 3249af4eaa92d18f8fe088b2f04de22775f71067\n    - hash: 974315868d081bcd92f4c602aaa1491727d8ee86\n    - hash: a7f974ba5c932f6c10ed7319c3c5e7a8fd83c178\n    - hash: 1b56fea16685103b3cbd465f7cf3a8abcb50b7c3\n- version: 1.3.1\n  date: 2018-01-23T14:30:07.000Z\n  commits:\n    - hash: 6bf0e33ab2fae1287aecd8077608419db3c02358\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(lib): Fix readonly property typo\"\n      body: |-\n        This fixes the camelcasing of the `.isReadOnly` property\n        of detected storage devices.\n    - hash: decfddf0084cfca31f7ba11d04bdea70a31c09e8\n      author: Jonas Hermsmeier\n      footers:\n        see: https://electronjs.org/blog/protocol-handler-fix\n        change-type: patch\n        changelog-entry: Update Electron to v1.7.11\n      subject: \"upgrade(package): Update electron 1.7.10 -> 1.7.11\"\n      body: This updates Electron to v1.7.11, mitigating CVE-2018-1000006.\n    - hash: 731bca98eb09b658f86989cc97cf3801dd105556\n      author: Jonas Hermsmeier\n      subject: v1.3.1\n      body: null\n    - hash: 7c67adcbc23eefff17a3f9ba5aaa52665c5e6aeb\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Fix incomplete unmounts after flashing on Linux\n      subject: \"upgrade(package): Bump mountutils 1.3.8 -> 1.3.10\"\n      body: |-\n        This updates `mountutils` from 1.3.8 -> 1.3.10;\n        - fix(linux): Fix partial unmounts on Linux\n        - fix(windows): Link to appropriate libraries\n    - hash: 25573ce2fe937a67dc696b8766c22c611754b9b3\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: stop testing macOS on Travis CI\"\n      body: We will rely on our Concourse instance for that.\n    - hash: e2f99046a8441b8f1d75bc8917d15ac4ce561f5d\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: add node-cli.node Resin CI option\"\n      body: |-\n        This represents the Node.js version that will be used to compile the\n        Etcher CLI.\n    - hash: 92ab18b399f7b9d60bb00dd935495c1b83f3f26e\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: revise Concourse CI related npm scripts\"\n      body: |-\n        - The `concourse-dependencies` and `concourse-build-installers` scripts\n        are not necessary anymore, given that the Electron pipeline already\n        knows how to perform these tasks\n        - The `concourse-test` script will be renamed to\n        `concourse-test-electron` to include the pipeline name (electron), so a\n        single project can be served by more than one pipeline. I'll keep the\n        old `concourse-test` for a bit for backwards compatibility until all\n        Etcher PRs are rebased\n        - There is a new `concourse-test-node-cli` script that will be used by\n        the Node.js CLI pipeline\n        - There is a new `test-cli` target that is supposed to host CLI tests.\n        For now, it just runs the SDK tests in a Node.js environment (instead of\n        in Electron)\n    - hash: 716cc2cfe4b94aef1bcdd9e7366e88fbd52fe995\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Fix selection of images in folders with file extension on Mac OS\n      subject: \"fix(gui): Allow selection of images in folders with extension\"\n      body: >-\n        This fixes selection of images contained in directories with a file\n        extension\n\n        (i.e. \"openSUSE-Leap-42.3-DVD-x86_64.iso\") in the open file dialog.\n    - hash: 6680aaaf41d4fffb75ca93282c09e3b9bdff693b\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Fix Etcher not working / crashing on older Windows systems\n      subject: \"upgrade(package): Bump drivelist 6.0.0 -> 6.0.4\"\n      body: |-\n        This updates `drivelist` to v6.0.4, fixing a crash on Windows 7,\n        among other things:\n        - Fix(windows): Impl IsSystemDevice()\n        - Fix crash on Windows 7\n        - Fix(darwin): Use proper flag to enable extended regexes in `sed`\n        - Fix(darwin): Allow mountpoints containing space characters\n    - hash: 087b28669d0b3caaef70cabaefc8afa6c735efb1\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/jprichardson/electron-mocha/issues/119\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"upgrade: `electron-mocha` to v5.0.0\"\n      body: |-\n        Looks like this will fix an issue where the `electron-mocha` main\n        process fails with an EPERM error on Windows, which we've been\n        experiencing on our Concourse setup.\n    - hash: ff2c65e70683884a1a0b5b0ef0a0cdeeaa1f0373\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Fix \"The specified module could not be found\" on Windows\n      subject: \"fix(usb): Ignore errors if winusb doesn't load\"\n      body: >-\n        Due to some Windows systems missing certain C runtime libraries\n\n        (Visual C/C++ 2012 / 2015 Redistributables), we ignore errors when\n        loading\n\n        this module until we can ensure distribution of those along with it.\n    - hash: 21e595466d5d950d7c38b2411791f756ec6ebdca\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(shrinkwrap): Update unbzip2-stream branch commit\"\n      body: |-\n        The shrinkwrap still contained the commit hash of a commit\n        previous to an npm install bugfix\n    - hash: 8beb24f3f07eab3bee8f901e273f47565f3504b1\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: add .resinci.json builder configuration object\"\n      body: |-\n        This object will eventually replace the `electron-builder.yml` file\n        that's currently present in the root of the project.\n        For now, it contains the `electron-builder` options that are project\n        specific (all the generic bits live in the Electron Concourse pipeline),\n        but in the future we might want to decouple how users configure packages\n        from the `electron-builder` project, instead making the user provide\n        Resin Concourse specific options that are then translated to\n        `electron-builder` (or any other packaging technology we might decide to\n        use) under the hood.\n        Change-Type: patch\n        Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n        Trigger Concourse CI\n    - hash: d172d564bbac208ee863b84a7fae4d6f65c78831\n      author: Benedict Aas\n      footers:\n        changelog-entry: Test that IPC verbosity is off\n        change-type: patch\n      subject: \"feat: test that ipc verbosity is off\"\n      body: |-\n        We test that `ipc.config.silent` is set to `true` so that it doesn't\n        spam `stdout` for users.\n    - hash: 628e6bc3ca0ead91b742ee05bd00e005ae11c874\n      author: Benedict Aas\n      subject: disable eslint no-unused-vars for imports\n      body: null\n    - hash: 2354a921db32add1d3346f49a855f6cb03742309\n      author: Benedict Aas\n      subject: fix image-writer test\n      body: null\n    - hash: 0ddc4c505934ae343d9f0bdbce56739f750bc5c4\n      author: Benedict Aas\n      subject: remove eslint disable line in image-writer test\n      body: null\n    - hash: 53c0d50028eda5bf7bd4255afc1bfd343d3f53f5\n      author: Benedict Aas\n      subject: use existing image-writer spec, append spec to child-writer test file\n      body: null\n    - hash: dbccded8ed0e936fd36a8def8ab648dc8faee646\n      author: Benedict Aas\n      subject: remove const\n      body: null\n    - hash: a1becbf15fa355eab2a5fca23aef1b7d27100455\n      author: Jonas Hermsmeier\n      subject: \"fix(writer): Silence IPC output on stdout\"\n      body: |-\n        This was causing the stdout maxBuffer size to be exceeded\n        when flashing larger images (or having flashes that took a while).\n        Change-Type: patch\n        Changlog Entry: Fix \"stdout maxBuffer exceeded\" error on Linux\n    - hash: 1d85d122eb980afe42bd9c26ae06b2e6b4b97a38\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"doc(MAINTAINERS): Elaborate on the process of releasing\"\n      body: |-\n        This updates the maintainers' doc with a little more detail\n        regarding the release process, to avoid it staying tribal knowledge.\n- version: 1.3.0\n  date: 2018-01-05T21:09:41.000Z\n  commits:\n    - hash: ece9a5666ee5fff52816e590d93fec3a24982402\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"refactor(scripts): Update clean-shrinkwrap script\"\n      body: >-\n        This updates the `postshrinkwrap` script to traverse the dependency tree\n\n        and remove all `from` fields to avoid inconsistent diffs across\n        platforms,\n\n        environments and installs when shrinkwrapping anew.\n    - hash: 619051a4b0cd8995e31838f221386b9b44e6ffc8\n      author: Jonas Hermsmeier\n      subject: \"chore(shrinkwrap): Update npm-shrinkwrap.json\"\n      body: null\n    - hash: fa1c98932371f110541afb5a7994415699850c7d\n      author: Jonas Hermsmeier\n      subject: \"fix(scripts): Ensure `resolved` field in shrinkwrap is HTTPS\"\n      body: null\n    - hash: 4c3575b46312bd84401f40472c7ad6c64e5b09c2\n      author: Jonas Hermsmeier\n      subject: 'fix(scripts): Only strip \"from\" of registry packages'\n      body: null\n    - hash: 98f19e0cba7bf7ce2885a33f6ed7bb75c1066bca\n      author: Jonas Hermsmeier\n      subject: \"fix(clean-shrinkwrap): Fix linter errors\"\n      body: null\n    - hash: 929a3aa1830654930e08ba754134e5a8553136a8\n      author: Jonas Hermsmeier\n      subject: \"chore(shrinkwrap): Update npm-shrinkwrap.json\"\n      body: null\n    - hash: e98c91dd3c6c1d8ca8408acaacf5a9eb8498f6bf\n      author: Andrew Scheller\n      footers:\n        change-type: patch\n        see: https://github.com/resin-io/etcher/pull/1941\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"fix(scripts): fix spelling typo\"\n      body: null\n    - hash: 766a4088cc4d71c31b0590ab3db9f2d9e563a399\n      author: Shou\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n        changelog-entry: Remove Angular dependency from image-writer.\n      subject: \"feat(GUI): remove angular from image-writer\"\n      body: |-\n        We remove Angular from the `image-writer` module by using Redux store\n        updates, subscribing to them while flashing.\n    - hash: ce104fe43cb0b64be289d69c7357776de48dc80f\n      author: Shou\n      footers:\n        change-type: patch\n        changelog-entry: Fix trailing space in environment variables during Windows elevation.\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: remove old references\n      body: null\n    - hash: 1395fe91d686382c41d20faaa7cba7568f7f247b\n      author: Shou\n      footers:\n        change-type: patch\n      subject: use fat arrows instead of functions\n      body: null\n    - hash: 90f118ebbf485d89e807e47aad2f0054cbaf2732\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): Bump mountutils 1.2.2 -> 1.3.8\"\n      body: null\n    - hash: 118a91016e7579ee134836184121885e3553c2a5\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): Bump drivelist 5.2.4 -> 5.2.12\"\n      body: null\n    - hash: 21a95d4fcf17d47264efdd40c9e72a8f4927e2dd\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: re-organize files inside assets/\"\n      body: |-\n        This is the file convention that Resin Concourse will use. I flattened\n        the directory for simplicity.\n    - hash: 6410f8ed57032805c7d281887575e941dc25efd6\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: move updates disabling logic out of the Makefile\"\n      body: |-\n        The Makefile current has logic to disable updates when building deb or\n        rpm packages. To make the Concourse pipeline transition easier, the\n        logic that disables updates on deb and rpm has been moved to the main\n        application code.\n    - hash: 670e6a0fd2f90ff35c46dd849a019027f1b9f0e7\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: declare Concourse dependencies in package.json\"\n      body: Resin Concourse will make sure to provide these during build time.\n    - hash: 756b2e61b75499006f390e4b26dad4db067cc892\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: make `test` npm script run everything we run on the CI services\"\n      body: |-\n        The idea is that the `test` command will replace the recently introduced\n        `concourse-test` script.\n        `concourse-test` will become simply a call to `test` for now to ensure\n        backwards compatibility while we update Resin Concourse.\n    - hash: 9c87e1ff635acfe2c1b18615fc945f7a633ab336\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: add Concourse related NPM scripts\"\n      body: |-\n        Our Electron Concourse pipeline is completely independent from the\n        application its testing (ie we can apply it to any other Electron app we\n        build with ease).\n        In order to keep such genericity, the application under test should\n        provide certain npm scripts that tell Concourse how to do specific tasks\n        on the repo, like install dependencies, in a build-system independent\n        fashion.\n    - hash: 9bce6bc30ae3cb67301b1a7fb91e734ab45d7118\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: get rid of npx\"\n      body: |-\n        We can live without it with a simple `PATH` trick at the top of the\n        Makefile (thanks @lurch!).\n    - hash: 2644f8fb450e885c86ecb61b273f8041bab2a98e\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(package): Fix noodled merge of shrinkwrap file\"\n      body: |-\n        Out of order squash merging resulted in some from-lines\n        not being removed in the npm-shrinkwrap.\n    - hash: 384c74714ab9dc88bc0bae5cecfc04bed6b1a5f3\n      author: Jonas Hermsmeier\n      footers:\n        change-type: minor\n      subject: \"feat(writer): Add read/write retry delays\"\n      body: null\n    - hash: b0b815021d712dab65514355d1d10e9aa1cb8e10\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(writer): Add EBUSY to transient errors on Linux\"\n      body: null\n    - hash: 80f4fc11bdbf23029609cad07456e50d95442241\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        changelog-entry: Don't send analytics events when attempting to toggle a disabled drive.\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"fix(GUI): only emit toggle drive event if drive is selectable\"\n      body: |-\n        Right now we emit \"Toggle drive\" analytics events even when clicking on\n        disable/unselectable drives.\n        The fix is to move the `analytics.logEvent` inside the code path that\n        applies if a drive selection is considered valid.\n    - hash: 9e37223652a722c0074649c745c44ca1e2de53bf\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore(appveyor): build x86 on real x86 machines\"\n      body: |-\n        We do this by using Appveyor's `platform` configuration variable instead\n        of always running on x64 and cross-compiling to x86.\n    - hash: c48b17653492dc11da1b56d7e284634bde56df49\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        changelog-entry: Ensure the writer process dies when the GUI application is killed.\n        see: https://github.com/resin-io/etcher/pull/1843\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"refactor(GUI): remove the intermediate child writer proxy process\"\n      body: |-\n        Etcher currently elevates a child writer proxy that itself spawns the\n        Etcher CLI in robot mode, parses the output, and proxies those messages\n        to the GUI application over IPC.\n        After these set of changes, Etcher elevates a single child writer\n        process that directly communicates back with the GUI using IPC. The main\n        purpose behind these changes is to simplify the overall architecture and\n        fix various issues caused by the current complex child process tree.\n        Here's a summary of the changes:\n        - Stop wrapping the Etcher CLI to perform writing\n        - Remove the robot option from the Etcher CLI (along with related\n        documentation)\n        - Elevate a new `child-write.js` standalone executable\n        - Move the relevant bits of `lib/child-writer` to the `image-writer` GUI\n        module\n        - Remove the `lib/child-writer` directory\n        - Add a new \"Child died unexpectedly\" Mixpanel event\n        - Floor state percentage in the flash state model\n        The above changes made is possible to tackle all the remaining issues\n        where the writer process would remain alive even if the parent died.\n    - hash: d769f7e9f5fe1e80df90f166be869cbca8bbc424\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): Bump electron-builder 19.9.1 -> 19.47.1\"\n      body: null\n    - hash: 5c9a22200771ce06d9541e05baf19d8a8aba95bf\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"refactor(electron-builder): Update configuration & icon asset\"\n      body: null\n    - hash: 837054ca9457149e3e2506900db30f85e3d63cee\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(dockerfile): Add tar/fpm/electron-builder workaround\"\n      body: null\n    - hash: 4174acc03970c7864046f7bedea60266407b3612\n      author: Jonas Hermsmeier\n      subject: \"fix(electron-builder): Add full icon set for Linux\"\n      body: null\n    - hash: 3a61420dc7f13435cb6f9e937baf1db61751bf3d\n      author: Jonas Hermsmeier\n      subject: \"fix(dockerfile): Add missing apt update\"\n      body: null\n    - hash: 2e310285f63a4fc9ec164194b2006cdc3e801a1e\n      author: Jonas Hermsmeier\n      subject: \"fix(dockerfile): Re-order wheezy workaround\"\n      body: null\n    - hash: c35a2141f0e340c1b79d36b86daaddaedcceab03\n      author: Jonas Hermsmeier\n      subject: \"fix(package): Fix shrinkwrap file\"\n      body: null\n    - hash: 64a5ab2aa77fff91a0a6a0de2952bb34722335c5\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(package): Downgrade to electron-builder@19.40.0\"\n      body: null\n    - hash: b7ef95a39a0c877470f87e91b349d43f96e05faf\n      author: Juan Cruz Viotti\n      footers:\n        change-type: minor\n        changelog-entry: Display connected Compute Modules even if Windows doesn't have\n          the necessary drivers to act on them.\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"feat(SDK): display Compute Modules even if host OS has no drivers\"\n      body: |-\n        This is the first step towards full usbboot Windows support. The driver\n        selector dialog will now display disabled devices to represent Compute\n        Modules even when Windows drivers are not installed to act on them.\n        These drives will state \"Missing drivers.\"\n    - hash: 4d4fd8105984d0ac7f03f3aa2b389fe1c64246cd\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Fix disabled native OS window shortcuts\n      subject: \"fix(gui): Re-enable application menu\"\n      body: |-\n        This re-enables the application menu to allow for OS native shortcuts\n        to work again (i.e. hide/minimize window), which also allows us to\n        get rid of the global-shortcuts hack to prevent window reloads.\n    - hash: 9a6680042b947e66858509bb6535c969f8d53147\n      author: Jonas Hermsmeier\n      subject: \"refactor(gui): Update kbd shortcut comment to be less specific\"\n      body: null\n    - hash: bbd34cd76adab1fb7b0bdb989b73b0054ecd5bbf\n      author: Juan Cruz Viotti\n      footers:\n        fixes: https://github.com/resin-io/etcher/issues/1870\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: setup a Spectron integration test suite\"\n      body: |-\n        - Add a `make test-spectron` target\n        - Install `spectron` and `mocha` (since we don't need to run the tests\n        inside an Electron instance like in the case of `electron-mocha`)\n        - Add some example tests\n    - hash: 383263d97a2df04850ac3809aeeb8c6ef5b85d37\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"docs: add high level manual testing script\"\n      body: null\n    - hash: 1e7d1471ed989b2eb28087d64bfa13a2d181f912\n    - hash: 59ad60a3f8bf70c21f43665df74882bef67c27b9\n    - hash: 4e2bc2cdf83b91bcced13ca9d2d56e48b1c721bb\n    - hash: 79d6c5a379d964a99c43a4f08cbad720fb529da9\n    - hash: 40aaa31d29f3298ad77e37a7b8263b3f23220167\n    - hash: f8fc0e5aa6e3f15c453a65279aa5efa01bf738aa\n    - hash: 8cfc0764187050fc3b9aa194f79a3359ee8a6bfe\n    - hash: 24d228bd35dd75fcfdc6663ab7e0da896784bbdc\n    - hash: ff9a1595cf0e4cfcbe82a5839e1b6634d318eae4\n    - hash: c671773ff0086c9f35e741cd2e3fd8853abddab8\n- version: 1.2.1\n  date: 2017-12-07T15:43:58.000Z\n  commits:\n    - hash: 7c9aa6dc909a6308e664f6d4364634c44a205b83\n      author: Shou\n      subject: \"feat(GUI): add progress and status to window title\"\n      body: |-\n        We add the progress percentage to the window alongside the status\n        (validating, flashing).\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n        closes: https://github.com/resin-io/etcher/issues/1427\n        fixes: https://github.com/resin-io/etcher/issues/1439\n        changelog-entry: Add the progress and status to the window title.\n    - hash: 590b0094a49b4fbfbb47640072d834245089cbf1\n      author: Shou\n      footers:\n        see: https://github.com/resin-io/etcher/issues/1772\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n        change-type: patch\n      subject: only call .getFlashState if necessary\n      body: null\n    - hash: 2a47b4e0ce7efc88c6bf7758df85bb5521e1502b\n      author: Benedict Aas\n      subject: remove list usage for string concat\n      body: null\n      footers:\n        change-type: patch\n        changelog-entry: Add the Python version (2.7) to the CONTRIBUTING doc.\n    - hash: 6187b8501a56638520f7f763254b9556192dd770\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: makeTitle -> getWindowTitle, and takes nil param\n      body: null\n    - hash: ec420544769978e99c17420f5c29e02467e39b1a\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Remove duplicate debug enabling in usbboot module.\n      subject: \"minifix: remove duplicate debug enable in usbboot\"\n      body: null\n    - hash: 7b30dfbdb6135dc3ea08605d1658f429401aa02c\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Don't send initial Mixpanel events before \"Anonymous Tracking\"\n          settings are loaded.\n        fixes: https://github.com/resin-io/etcher/issues/1772\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"fix(sdk): Remove event listeners on unsubscribe\"\n      body: null\n    - hash: bf41594ab9b1fcdf08d254cfc97849849fdeb39e\n      author: Andrew Scheller\n      footers:\n        change-type: patch\n        changelog-entry: Fix verification step reading from the cache\n      subject: \"fix: Correct image.size usage in tests and code-comments\"\n      body: image.size is always an object, never a plain number\n    - hash: f4635b8e22fdba88898722ef5bbabc3ef6e75465\n      author: Jonas Hermsmeier\n      footers:\n        change-type: Patch\n      subject: 'fix(sdk): Correct \"subscribe\" typos'\n      body: null\n    - hash: 6404c997cc9dafa8e4c7e6e477cf32cc2ea53d79\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"test(dictionary): Add subsribe -> subscribe\"\n      body: null\n    - hash: 7cf8dff27b61e84060bd79272f39032b16bcadbb\n      author: Benedict Aas\n      footers:\n        change-type: minor\n        reverts: https://github.com/resin-io/etcher/pull/1708\n        see: https://github.com/resin-io/etcher/issues/1819\n        changelog-entry: Remove Linux elevation meant for usbboot.\n      subject: \"fix: rid linux startup elevation\"\n      body: We remove the Linux elevation meant for usbboot device access.\n    - hash: 02e1ac20e39f1a5a2b2bbc6e7be43a7d3288f36d\n      author: Benedict Aas\n      footers:\n        change-type: minor\n        changelog-entry: Display actual write speed\n      subject: complete revert\n      body: null\n    - hash: c0b7acfcccde1e60347d7c2da6bfd6f90281f75d\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-entry: Fix bzip2 streaming with the new pipelines\n      subject: use sdk unsubscribe, .name -> .id\n      body: null\n    - hash: 8c4c84e8cd70405144c9ab120126a0ffbd3fd3ce\n      author: Benedict Aas\n      footers:\n        change-type: patch\n      subject: remove warning\n      body: null\n    - hash: 9ae161b054e245a39cdc73d4718522b1a7f468a0\n      author: Sven Dowideit\n      footers:\n        change-type: patch\n        signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>\n      subject: \"docs: etcher-image-stream was moved to the main etcher repo\"\n      body: null\n    - hash: 0431786194bc9d11fa3621b14dac9a5773de9e0d\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(gui): Don't check elevation on start on Windows\"\n      body: null\n    - hash: 65e44cb610d029d6a354a0c7ffb5a2fb8d948c14\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(scripts): Fix pip install in docker\"\n      body: >-\n        This works around the \"Cannot fetch index base URL\n        http://pypi.python.org/simple/\"\n\n        error by installing pip==9.0.1 directly from the\n        pypi.python.org/packages/\n    - hash: c8b2b652354029cedceda2637bed13fee65f8587\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"fix(usbboot): increase device reboot delay a little bit\"\n      body: null\n    - hash: 61dce0aca9d706a7e5ba453578ab69d572381807\n      author: Jonas Hermsmeier\n      footers:\n        change-type: minor\n      subject: \"feat(sdk): Implement continuous scanning\"\n      body: |-\n        This implements an SDK.Scanner which handles any given\n        adapters and manages the scans. This change enables continuous\n        scanning without the need to `.scan()` scheduling in other places.\n    - hash: 07473a0f213ff5af95754a40106cc64d17e623d3\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"test(Makefile): Update codespell excludes\"\n      body: >-\n        This adds excludes for .dtb, .dtbo, .dat, .elf, .bin, .foo, and\n        xz-without-extension\n\n        to reduce unnecessary warning output in `make lint`.\n\n        ```\n\n        WARNING: Binary file: lib/blobs/usbboot/bcm2709-rpi-2-b.dtb\n\n        WARNING: Binary file: lib/blobs/usbboot/bcm2710-rpi-cm3.dtb\n\n        WARNING: Binary file: lib/blobs/usbboot/bcm2708-rpi-cm.dtb\n\n        WARNING: Binary file: lib/blobs/usbboot/bcm2708-rpi-b.dtb\n\n        WARNING: Binary file: lib/blobs/usbboot/bcm2710-rpi-3-b.dtb\n\n        WARNING: Binary file: lib/blobs/usbboot/bcm2708-rpi-0-w.dtb\n\n        WARNING: Binary file: lib/blobs/usbboot/bcm2708-rpi-b-plus.dtb\n\n        WARNING: Binary file: lib/blobs/usbboot/overlays/dwc2.dtbo\n\n        WARNING: Binary file: lib/blobs/usbboot/raspberrypi/fixup_cd.dat\n\n        WARNING: Binary file: lib/blobs/usbboot/raspberrypi/start_cd.elf\n\n        WARNING: Binary file: lib/blobs/usbboot/raspberrypi/bootcode.bin\n\n        WARNING: Binary file:\n        tests/image-stream/data/unrecognized/xz-without-extension\n\n        WARNING: Binary file:\n        tests/image-stream/data/unrecognized/xz-with-invalid-extension.foo\n\n        ```\n    - hash: f4e0121639d8f2cbcc15b6577ec15d7ecbab7e71\n      author: Juan Cruz Viotti\n      footers:\n        change-type: minor\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"feat(usbboot): add progress property to usbboot scanned drives\"\n      body: |-\n        This commit re-architects the usbboot adapter to prepare the drives in\n        the background, while emitting scan results every 2s, where each drive\n        has a `progress` percentage property.\n    - hash: 684118a758805fdab74b215684c87a745707f595\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"refactor(sdk): add bus number, device address, and ids in usb devices\"\n      body: |-\n        The combination of bus number and device address is the only way to\n        uniquely identify a USB device, so we'll use that for the `device` and\n        `raw` properties.\n        Also, we store the USB vendor and product IDs as properties of the\n        drives, since they will be handy when implementing the prepare function.\n    - hash: 6a566035644a58f252edef9f932635e2b00f68a5\n      author: Benedict Aas\n      footers:\n        change-type: patch\n        changelog-type: minor\n        changelog-entry: Add optional progress bars to drive-selector drives.\n      subject: \"feat(GUI): add optional progress bars to drive-selector drives\"\n      body: |-\n        We show a progress bar for any drive objects with a `progress` field\n        that isn't falsy, e.g. `undefined` or `0`.\n    - hash: 712ecdcc39fe0161ce4e861c85cc9d114d886e4e\n      author: Benedict Aas\n      footers:\n        change-type: none\n      subject: remove debugging conditonals\n      body: null\n    - hash: f3f800df7fd50ecf346f1515cab75bf0cbf6d2ee\n      author: Juan Cruz Viotti\n      footers:\n        change-type: PATCH\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"style(usbboot): wait before scanning drives after the file server phase\"\n      body: |-\n        This is a workaround to prevent the USB device from disappearing after\n        the file server phase, until the resulting block device comes up.\n        By adding a delay after the file server phase, we prevent the USB\n        scanner from getting triggered again, therefore keeping the current USB\n        device visible in the drive selector modal.\n    - hash: 24a10b209cb0014657b33f376bf1d1da90c383ab\n      author: Juan Cruz Viotti\n      subject: \"fix(usbboot): handle device disconnections\"\n      body: |-\n        This commit handles errors that can come up when unplugging the drive\n        halfway through the process. After tons of experimentation, the errors\n        than seem to occur are:\n        - `LIBUSB_TRANSFER_CANCELLED`\n        - `LIBUSB_ERROR_NO_DEVICE`\n        When these errors happen, we can omit the drive, and also not try to\n        close it, since given the device is no longer there, the close operation\n        bails out with a strange error message.\n      footers:\n        change-type: patch\n        changelog-entry: Gracefully handle scenarios where a USB drive is disconnected\n          halfway through the usbboot procedure.\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n    - hash: 41f8ac100a87f73cfd9e28e299af1033d8603a00\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        changelog-entry: Fix `LIBUSB_ERROR_NO_DEVICE` error at the end of usbboot.\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"fix(usbboot): handle LIBUSB_ERROR_NO_DEVICE when claiming a USB\n        interface\"\n      body: |-\n        Consider the following scenario:\n        - Usbboot runs successfully on a device\n        - Before the block device gets a chance to appear, we run usbboot again\n        If we're fast enough, usbboot will try to claim the device interface,\n        but then the drive might not be there anymore, causing a\n        `LIBUSB_ERROR_NO_DEVICE`.\n        This commit addresses that scenario, and simply ignores the drive.\n    - hash: af60720bfd1e850d906af8f37a6e87ef2ea85853\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): Bump resin-corvus to beta.30\"\n      body: |-\n        This updates resin-corvus to v1.0.0-beta.30, fixing an issue\n        with attempting to use https transport in browserland.\n    - hash: 83136c84383866e80526f607df875c20b4e42134\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"doc(CONTRIBUTING): Add note about msvs_version on Windows\"\n      body: |-\n        This adds a small note about setting the `msvs_version`\n        in the npm config on Windows.\n    - hash: 088fd5c76f3520dfec5f7203d537390e902e47dd\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: 'doc(CONTRIBUTING): Remove refence to \"install script\"'\n      body: |-\n        This removes a confusing reference to an \"install script\"\n        in the dependency section.\n    - hash: a5f5fad5407614673f2714963187f777382585a6\n      author: Benedict Aas\n      subject: \"fix: set debug env variable on remote electron process\"\n      body: >-\n        We fix the DEBUG environment variable by setting it on the\n        `electron.remote`\n\n        instead, and we also move the code to `lib/gui/app.js` and away from\n\n        `lib/gui/index.html`.\n\n        Changelog-Entry: Set the DEBUG environment variable on the remote\n\n        electron process.\n\n        Change-Type: patch\n    - hash: 407c23f66275e4ccb875ecaeaf3dc9453dc682eb\n      author: Benedict Aas\n      subject: use debug.enabled, fix drivelist env setting\n      body: null\n    - hash: d51b8502c7f566ed78dd436757620a12feba980a\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"doc(CONTRIBUTING): Add libudev requirement to docs\"\n      body: null\n    - hash: 157039439ed6a768f4d44b7c37c7a6534ed13af5\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Update Electron to v1.7.9\n      subject: \"upgrade(package): Update Electron v1.6.6 -> v1.7.9\"\n      body: This updates Electron from v1.6.6 to v1.7.9\n    - hash: aecf5d287e9ef3b068a9ce0a3e2f749b12ced77a\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"refactor(SDK): make adaptor scan functions event based\"\n      body: |-\n        This change will allow us to start emitting progress events out of the\n        adaptors scan functions.\n    - hash: 2f0dabf8ce9dcd1afbcfd8b9fc7f772c2f5845c0\n      author: Jonas Hermsmeier\n      subject: \"refactor(sdk): Make adapters event emitters\"\n      body: null\n    - hash: e3bcee42cb8e6654350287f3eae4a673951a1620\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"fix(GUI): improve usbboot USB device branding\"\n      body: |-\n        - Add a loading SVG icon while usbboot is running\n        - Make the device description more user friendly\n    - hash: 4ca1d3e96ccfcde579fdd81d4a8964bf270a9edf\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"fix(GUI): don't show the \\\"too small\\\" badge if the size is null\"\n      body: |-\n        Some devices don't have a size, like USB devices in the usbboot adaptor.\n        The `.isDriveLargeEnough()` correctly returns `false` in this case,\n        however we don't want to show the `TOO SMALL` badge for aesthetics\n        purposes.\n        So if a drive has a size that equals `null`, we don't allow such drive\n        to be selected, and we don't show a badge for it.\n    - hash: 4f4e9c43fd723b38602303b5aa20a49a401d31c7\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"fix(GUI): don't display hyphen in drive selection entry if no size\"\n      body: |-\n        Some drives, like usbboot USB devices, don't have a size associated with\n        them, which results in the drive selection widget showing a hyphen with\n        nothing at the side, which looks a bit weird.\n    - hash: bce1b9316345776536c339e86a97d5424b5cdba4\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: 'refactor(GUI): generalize the concept of a \"pending\" drive'\n      body: |-\n        This commit introduces a boolean `disabled` property rather than a\n        `pending` flag. Making this distinction clearer means that we can now\n        treat pending drives in different ways needed to improve the usbboot\n        experience.\n        Also, for usbboot, this commit removes the \"pending\" badge and uses a\n        more descriptive drive description instead.\n    - hash: c4fc45a9c9247ce113cab37c9a7cbb4b75ddccf4\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"fix(usbboot): opening device debug message prints undefined\"\n      body: |-\n        We have a debug message that prints `device.name`, which is not a valid\n        property, and therefore the debug logs show `undefined` instead of the\n        USB id pair.\n    - hash: 773f90724cfe4597fa9d30e02b8ecc62afd84354\n      author: Juan Cruz Viotti\n      footers:\n        change-type: minor\n        changelog-entry: Increase the flashing speed of usbboot discovered devices.\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"feat(usbboot): add new files that provide better speed\"\n      body: |-\n        We currently ship with `bootcode.bin` and `start.elf` from the Raspberry\n        Pi Foundation, which provide a writing speed of about 6 MB/s. This PR\n        includes new boot files by resin.io that boost the speed to ~20 MB/s.\n    - hash: 2ea95972e7ab5486561d25dfd38d8b78eb1aa57c\n      author: Niklas Higi\n      footers:\n        changelog-entry: Make sure the progress button is always rounded.\n        change-type: patch\n      subject: \"fix(GUI): make sure progress button is always rounded\"\n      body: |-\n        At the moment the progress button which has slightly rounded corners\n        allows the \"__bar\" to overflow. This causes the corners to become\n        angular again which looks weird. I set the button's \"overflow\" to\n        \"hidden\" to fix this issue.\n    - hash: 120522672aad94a3e623935783ba994602454bec\n      author: Juan Cruz Viotti\n      footers:\n        change-type: minor\n        changelog-entry: Add eye candy to usbboot initialized devices.\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"feat(GUI): add some branding to usbboot-discovered devices\"\n      body: |-\n        - Add a nice icon in the drive selector dialog when a device has been\n        discovered through usbboot\n        - Change the name of usbboot-initialized devices to \"Compute Module\"\n    - hash: caf38142cac1f5d6e8bf79c7f66ac4b891e2432f\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"fix(sdk): set usbboot control transfer timeout to infinite\"\n      body: null\n    - hash: 65a3f0ed897cf30f1d6ce8da12c2327fef431064\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"fix(sdk): increase bulk transfer usb timeouts\"\n      body: |-\n        We experienced timeouts when sending big files (ie ~14 MBs). Setting the\n        timeout to 0 makes the timeout infinite.\n    - hash: 2bda96d08ff156b27420ce67dc810252e8f98aac\n      author: Gergely Imreh\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"fix(sdk): usbboot command typos\"\n      body: null\n    - hash: 5fd166ea31b21124d83cefbc4fcb7350659a314e\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io-modules/drivelist/pull/229\n        change-type: patch\n        changelog-entry: Fix permission denied issues when XDG_RUNTIME_DIR is mounted\n          with the `noexec` option.\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"upgrade: drivelist to v5.2.4\"\n      body: null\n    - hash: 01382d676ded6dd325bfc0759a6b26f3c7cdcb93\n      author: Josh Leeb-du Toit\n      footers:\n        change-type: patch\n        link: https://github.com/resin-io/etcher/pull/1753\n        fixes: https://github.com/resin-io/etcher/issues/1454\n      subject: \"fix(CLI): add check for drive flag with yes flag\"\n      body: |-\n        Add an options check for the `drive` flag to appear with the `yes` flag.\n        If the `yes` flag appears without the `drive` flag then a user error\n        will be thrown.\n    - hash: 991568d8892bf19e78be9489be8b11b86d40bfea\n      author: Jonas Hermsmeier\n      footers:\n        change-type: minor\n      subject: \"feat(image-stream): Support .bin image extension\"\n      body: This adds support for selecting images with a `.bin` file extension.\n    - hash: cc9c8a81321b92474a0d8dd1d707028dc4807c00\n      author: Shou\n      subject: \"feat(GUI): use tabindex and focus to navigate\"\n      body: |-\n        We make navigating with the tab key easier by highlighting focused\n        elements more visibly, adding `tabindex` attributes to elements, and\n        making `open-external` links respond to keyboard events.\n        Change-Type: minor\n        Changelog-Entry: Improve tab-key navigation through tabindex and visual\n        improvements.\n        Connects-To: https://github.com/resin-io/etcher/issues/1734\n    - hash: 531ba669a42a66f0ebfebe70edf59e37b36a1d7a\n      author: Shou\n      subject: outline with 10s timeout\n      body: null\n    - hash: 975b970c9d16b7d67ba1aafd32e5b31c11db99c1\n      author: Shou\n      subject: use orange \"warning colour\" as outline\n      body: null\n    - hash: bb02cb831bb979ed07ae982b1e0db47febb17634\n      author: Shou\n      subject: smaller outline on settings buttons, fix order on settings page\n      body: null\n    - hash: bf6f77d8a6d0f20921cefe9faa67dde39ead8ee0\n      author: Shou\n      subject: allow selection in drive-selector\n      body: null\n    - hash: 6a5b00540643b3d86744bd4e823fd231dcc86baa\n      author: Benedict Aas\n      subject: fix typo, better tabindexes\n      body: null\n    - hash: 6b16a2b13fb027604101e6d5654060a3b4b83aac\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Fix Etcher being unable to read certain zip files\n      subject: \"upgrade(node-stream-zip): 1.3.4 -> 1.3.7\"\n      body: |-\n        This fixes RangeErrors occurring with some zip files.\n        **Changes:**\n        - Fixed compatibility with node.js v0.10\n        - Fix error unpacking archives with a special comment\n        - Fix descriptive error messages\n    - hash: 3bd8374c734f1a4922796e376e313e2ded7600e2\n      author: Jonas Hermsmeier\n      subject: \"refactor(image-stream): Remove Promise props resolve\"\n      body: |-\n        This removes `Bluebird.props()` from the image type handlers,\n        as it's just a remnant when some properties in the return value\n        were Promises that needed resolving.\n        Change-Type: patch\n        Connects To: #1724\n    - hash: 3b793c85f512642ddfbe28898b214ec63ec6a18c\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix: Support raw images without secondary file extension\"\n      body: |-\n        This allows selection of images without a secondary file extension\n        (i.e. `example.gz`, compared to `example.img.gz`) by defaulting to `img`\n        in the image-stream handlers, should no secondary extension be found.\n        Further this adjusts `.getPenultimateFileExtension()` to return `null`\n        if the detected penultimate extension is not a known file extension.\n    - hash: dd88a82892b408f5bc04f36b3a915cbf8a896223\n      author: Jonas Hermsmeier\n      subject: \"chore(package): Bump resin-corvus to 1.0.0-beta.29\"\n      body: |-\n        This updates `resin-corvus` to version 1.0.0-beta.29, switching\n        Mixpanel and Sentry analytics to HTTPS transports.\n        Changes:\n        - fix(sentry): Default to HTTPS transport\n        - fix(mixpanel): Use HTTPS transport\n        - test: Use standardjs for linting\n        - doc(README): Add CI & npm badges\n        - fix(ci): Fix Appveyor Node version matrix\n        - refactor: Ensure Node 4 compatibility\n        Change-Type: patch\n        Connects To: #1718\n    - hash: 6ed2bec76f1a67fe29547db10ff308d2d5829c26\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: pass a dictionary to codespell.py\"\n      body: The `-` option loads the default dictionary.\n    - hash: e301ac4cff34c20995780b8b791d772b3b32121c\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1703\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"docs(README): execution -> executable\"\n      body: null\n    - hash: 673fabfcb003d8f193b67d714bc31b2d5f483161\n      author: Juan Cruz Viotti\n      footers:\n        fixes: https://github.com/resin-io/etcher/issues/1699\n        change-type: patch\n        changelog-entry: Try to use `$XDG_RUNTIME_DIR` to extract temporary scripts on\n          GNU/Linux.\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"upgrade: drivelist to v5.1.8\"\n      body: null\n    - hash: 5d458d9e3a6ee048dffd252f19d5e8baf9f571b3\n      author: Juan Cruz Viotti\n      footers:\n        fixes: https://github.com/resin-io/etcher/issues/1706\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: fix CLI packaging snapshot relative directory\"\n      body: |-\n        The current CLI releases are broken. Seems that `pkg` creates the\n        application snapshot based on the current working directory, so at the\n        moment, the snapshot gets created based on the root of the project,\n        rather than based on the dist/Etcher-cli-* directories, causing the\n        native add-ons to not be resolved correctly.\n    - hash: 796515afda968b8fd6e0f8a04d2cb770505fad05\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io-modules/mountutils/pull/45\n        change-type: patch\n        changelog-entry: Retry ejection various times before giving up on Windows.\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"upgrade: mountutils to v1.2.2\"\n      body: null\n    - hash: ffc807b00f15adfa42ff53388093d267d61073ab\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1686\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: 'feat(GUI): support new \"pending\" drive flag'\n      body: |-\n        We recently added a \"pending\" flag to all drives that represents whether\n        the drive is ready for selection or not. This flag will be used by the\n        \"usbboot\" flashing adaptor, which will emit various \"pending\" USB\n        devices while it converts them to block devices that can actually be\n        flashed.\n        In terms of the GUI, the following visible changes were made:\n        - Drives with a `pending: true` property will be disabled in the drive\n        selector window\n        - Drives with a `pending: true` property have a \"PENDING\" red badge\n    - hash: 2b5b2ed74a8122fdbdc71e9a2453a917792b929b\n      author: Shou\n      footers:\n        changelog-entry: Add a sudo-prompt upon launch on Linux-based systems.\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"feat: add sudo-prompt to start on linux\"\n      body: |-\n        We prompt the user with a sudo-prompt upon launch on Linux-based systems\n        to ensure the program has enough permissions for features needed\n        throughout the program's runtime.\n    - hash: ca126f1d5addd3ef3895e5dfe8dedd5bbc9bffa3\n      author: Juan Cruz Viotti\n      subject: 'Revert \"chore(package): Bump resin-corvus to 1.0.0-beta.29 (#1720)\"'\n      body: This reverts commit e65431199773f387f64118c17d53aff4ef3b642b.\n    - hash: 2b4fd8849ed1e87b99656afd4973a4f58ef055b6\n      author: Benedict Aas\n      subject: remove ETCHER_RUNNING env var\n      body: null\n    - hash: 6bb21d4d300b9725cfd51eb2587209ae66af526b\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        see: https://github.com/resin-io/etcher/pull/1686\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"refactor: use an SDK orchestrator to implement drive scanning\"\n      body: |-\n        This is a major first step towards adopting an SDK architecture. This\n        commit creates an SDK adaptor with a `.scan()` function that uses\n        `drivelist` under the hood. Then, an SDK orchestrator is used to provide\n        drive scanning capabilities to the GUI.\n        Here's a list of some particularly interesting changes:\n        - The drives returned by the SDK adaptor now have a \"pending\" and an\n        \"adaptor\" property. The \"pending\" property is a boolean flag that\n        determines if the drive is ready to be used (this will come handy for\n        usbboot), while the \"adaptor\" property simply contains the name of the\n        adaptor that drive came from\n        - The GUI drive scanner Rx implementation was replaces with a \"promise\n        loop.\" Before, the drive scanning routine would be called every 2\n        seconds (without waiting for the previous scan to complete), while\n        now, the next scan happens *after* the previous scan completes. For\n        this reason, I reduced the drive scanning interval timeout to match\n        the timing we had before\n    - hash: 45ce9a8114edee05647afc34c3638d71c1c2a411\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"test(shared): ensure drive objects can contain extra properties\"\n      body: |-\n        The usbboot integration will bring in drive objects that include a lot\n        more properties than the current drive objects. This commit ensures that\n        the redux store can handle those extra properties.\n    - hash: f2fb0a9b4a543fc2184a1f42d368dfc86da47747\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io/etcher/pull/772\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: don't zip AppImages\"\n      body: null\n    - hash: b038ae49534ff0aeb2c9bad1bd1c9220c1c5c193\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: fix build system\"\n      body: |-\n        - Bintray deployments are broken because of some bash nested quoting\n        issue\n        - Travis CI will attempt to cache Docker layers on macOS\n        - Docker caches from different architectures will override each other\n    - hash: f5293d9f3e81037164270d0568f59da78df1cd3a\n      author: Juan Cruz Viotti\n      footers:\n        see: https://giorgos.sealabs.net/docker-cache-on-travis-and-docker-112.html\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: cache Travis CI docker builds\"\n      body: |-\n        Let's see if we can reduce the time it gets to build and test Etcher on\n        GNU/Linux.\n    - hash: 71dfebe883e866e24f9cf5d85147c938a8dbfce4\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        changelog-entry: \"Fix \\\"Couldn't scan the drives: An unknown error occurred\\\"\n          error when there is a drive locked with BitLocker.\"\n        fixes: https://github.com/resin-io/etcher/issues/1687\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"upgrade: drivelist to v5.1.5\"\n      body: See https://github.com/resin-io-modules/drivelist/pull/206\n    - hash: 59e0562860284aca890067880dea933d26687d0b\n      author: Juan Cruz Viotti\n      footers:\n        change-type: minor\n        changelog-entry: Integrate Raspberry Pi's usbboot technology.\n        fixes: https://github.com/resin-io/etcher/issues/1541\n        see: https://github.com/raspberrypi/usbboot\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"feat: implement usbboot adapter\"\n      body: |-\n        This commit installs `node-usb` v1.3.0 from GitHub, since that version\n        was never published to NPM, and is the only one that works with Visual\n        Studio 2015 (see https://github.com/tessel/node-usb/issues/109).\n        The usbboot communicates with a Raspberry Pi / Amber through USB and\n        eventually mounts it as a block device we can write to.\n        This feature bundles bootcode.bin and start.elf from the original\n        usbboot implementation.\n        The flow is the following:\n        - On each scan, the usbboot scanner will try to get a usbboot compatible\n        USB device to the next \"phase\", until they are all transformed to\n        block devices the user can flash to as usual\n    - hash: 27aca934344f4631d62585f1e56798b26dcdd82d\n      author: Juan Cruz Viotti\n      footers:\n        fixes: https://github.com/resin-io/etcher/issues/1155\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"docs: add chocolatey install instructions\"\n      body: null\n    - hash: dc43c0199b21ce331749be45514b58583809621b\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1663#discussion_r131623802\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: enforce single quotes in ESLint\"\n      body: |-\n        We recently adopted the standardjs guidelines ESLint, which doesn't seem\n        to enforce single quotes, even though the guidelines mention it.\n    - hash: 86cd46f26130e2557ec1c275e30958f161d05899\n      author: Jonas Hermsmeier\n      footers:\n        change-type: feat\n      subject: \"feat(writer): Implement streaming pipelines\"\n      body: null\n    - hash: 2a3effb9a0d5de930e30b665d10e17c7fbf50e34\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"refactor: simplify release type handling within the app\"\n      body: |-\n        As another step towards moving to GitHub Releases, this commit makes the\n        application care much less about the actual release type of the current\n        version, instead checking if the application is stable or not, which is\n        more aligned to what GitHub provides us.\n    - hash: 11e0046eea82c5a31c74fe123720e38ded668705\n    - hash: 50e791b0a877660815709f54942e6ca90b014a1f\n    - hash: a42499681f95b735bab7eaadb51caeb564797d3f\n    - hash: 4777a9d8ea3c19a502863bb9761fe377471d6b91\n    - hash: a33536a55df0b431a81ef6ffa981d44db5d92e20\n    - hash: ab4d5f1b908cf671a8862fa6a5512349044def61\n    - hash: 8205321af821e02f8be65965ac627f9002a13665\n    - hash: 7c73b87c73235ab1f27c09ea6108b693184973ac\n    - hash: 41c895b6996a5217f0c26cb24998fe1d51674383\n    - hash: b3c82e97465d2f1df1049a15aa11399e4fc8bc08\n    - hash: 9e9169202e1299bf156c79e4f61aec5836368efe\n    - hash: 51d48a39318a8a22d6bb731c9aacb7800cbc0883\n    - hash: 38d9db8ed9945fbb914d2df361e76379750c9b85\n    - hash: 1473f91f0fd4e215dca7bdaeddcaf0c9c0b6b71d\n    - hash: 36c2f7eb41ead78c028aee8107288884c01eabac\n    - hash: be262bf193cc9ea6d391bbbe58043a7627b92654\n    - hash: 194d26b4e3ef53442104b7a5c4caebe284d9f5db\n    - hash: b2d3d0ecb8eadd14593c3b7587775d1ac4b5475e\n    - hash: 71cb4e9be21eaa8772c0a362a616ae77920c87b5\n    - hash: ad3d3cb18f812be4f18a52872ea1543baaacd7cc\n    - hash: 819a371976c3d981883240027fcaae601ec3b95d\n    - hash: babb607e2761a683b5393ca9220c6e42d0eac432\n    - hash: 913b83e17f0f6377f70df7cb0c118f2fb9be08f6\n    - hash: e282c1b10b1fe286366414969bb70c87eafddd6f\n    - hash: 59d2c542d863e5ec9be7cae1abd49debf68235b1\n    - hash: f64d1f6a3233aeb17e728f6a479e3968322d3276\n    - hash: d355dd0a8790a003edf061e893b0d0ccaa81deb2\n    - hash: f3aa48269d81fde60b5e18c2cf2f73a0f0c0e722\n    - hash: 5c0a42c647081504c25394db3f2bb9d12a9a7a94\n    - hash: 4c21ebc999a543b6fb9b102480f764901aef223a\n    - hash: 91dfddef2d27979ab30a705f8cb19c5c746463b4\n- version: 1.1.2\n  date: 2017-08-07T15:10:39.000Z\n  commits:\n    - hash: 6ff8110473648517ec16f33c80cc71b77ab84b15\n      author: Shou\n      footers:\n        change-type: patch\n        changelog-entry: Make archive-embedded SVG icons work again.\n        see: https://github.com/resin-io-modules/drivelist/pull/204\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n        fixes: https://github.com/resin-io/etcher/issues/1636\n      subject: \"fix(GUI): make archive-embedded svgs work again\"\n      body: |-\n        We make the svg-icon component accept XML in its path argument to handle\n        archive-embedded SVG icons.\n    - hash: b99f027e37c205e332fc23c3d73db012e060fe47\n      author: Shou\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1611#discussion_r131349440\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: add test\n      body: null\n    - hash: 6d3941b4fb30355414875df92c2bfb1b5276a550\n      author: Shou\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: secure against sibling html and foreignObject\n      body: null\n    - hash: 3b19c076128430b29866edf069883f2e9a4e40e7\n      author: Shou\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1657\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: tests done\n      body: null\n    - hash: 1a599d386c779eb34b1cd4ac19e59cbf4ed2ae80\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"doc: Add link to commit guidelines to contributing guide\"\n      body: This adds a reference to the commit guidelines to the contributing guide.\n    - hash: 449faaba99b3e193334cb304675d1427f8b20bb9\n      author: Jonas Hermsmeier\n      footers:\n        changelog-entry: Make disabled SVGs work in IMG tags.\n        change-type: patch\n      subject: \"doc: Merge running locally into contributing guide\"\n      body: |-\n        As recently several people have been asking for things\n        that are described in `RUNNING-LOCALLY.md`, but couldn't be\n        found in the `CONTRIBUTING.md`, this consilidates the two into\n        one single resource to look for on how to get started developing.\n    - hash: f4778955df8ff33397164b2337ef7d645c4e9c60\n      author: Juan Cruz Viotti\n      subject: \"fix(CLI): pass required arguments to flashComplete message\"\n      body: |-\n        The `flashComplete` message takes the drive object and the image\n        basename as arguments. This was updated on the GUI, but causes the CLI\n        to throw an error upon completion.\n      footers:\n        change-type: patch\n        changelog-entry: Fix \"imageBasename is not defined\" error on the CLI.\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n    - hash: d75a75e26f3cc4e51d5f5dbf60cf4963f38b0d53\n      author: Juan Cruz Viotti\n      subject: \"fix(GUI): throw a user error if the user is not in the sudoers file\"\n      body: null\n      footers:\n        change-type: patch\n        changelog-entry: Display a user-friendly error message if the user is not in the\n          sudoers file.\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n    - hash: ece7d406074a1463e07b2a61ae4ecd4518712795\n      author: Juan Cruz Viotti\n      footers:\n        see: https://standardjs.com\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: publish development Bintray packages\"\n      body: |-\n        This commit includes several changes to adapt the CI configuration files\n        and Bintray publish script to perform development deployments.\n        - Move our Bintray details to the Makefile\n        - Deploy to a new Bintray component if `RELEASE_TYPE` is `snapshot`\n        - Call `publish-bintray-debian` and `publish-bintray-redhat` in the CI\n        deployment script\n        - Call the Bintray deployment scripts for RPMs\n    - hash: 81df8dd47ebf476e50f9d36cd4f2c66d42765427\n      author: Juan Cruz Viotti\n      footers:\n        fixes: https://github.com/resin-io/etcher/issues/1525\n        change-type: minor\n        changelog-entry: Fix `UNABLE_TO_GET_ISSUER_CERT_LOCALLY` error at startup when\n          behind certain proxies.\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n        see: https://github.com/resin-io/etcher/pull/1555\n      subject: \"chore: use electron-builder default package names\"\n      body: |-\n        We're currently manually changing the names of the final packages\n        created by `electron-builder`. This commit makes Etcher use the default\n        package names that `electron-builder` picks for us.\n        The Windows final package names contain spaces, so I did keep the\n        `artifactName` entries for them, which now basically use what\n        `electron-builder` recommends, but use hyphens instead of spaces.\n    - hash: 9a244de6a698e000b51bacf5758965911764ebb9\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Fix `EHOSTDOWN` error at startup.\n        fixes: https://github.com/resin-io/etcher/issues/1645\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"refactor(gui): Only enable full debug output on demand\"\n      body: |-\n        This disables full wildcard debug output by default now,\n        leave the possibility to manually enable selective debug output\n        via the `DEBUG` environment variable.\n    - hash: 1280efe66d376cc974f22747d8067573c71186c2\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io/etcher/issues/1356\n        change-type: patch\n        changelog-entry: Fix various drive scanning Windows errors.\n        fixes: https://github.com/resin-io/etcher/issues/1639\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"refactor(GUI): make settings model setter asynchronous\"\n      body: |-\n        This is part of the process of implementing support for a configuration\n        file. We previously decoupled the Redux store from localStorage by\n        moving the logic that actually persists the data to localStorage to a\n        local-settings.js file, however the localStorage API is synchronous, so\n        it follows that at the moment, all functions that interact with are also\n        synchronous.\n        Moving to storing the settings to a file means turning all these\n        functions to promises, which we do in this commit, in order to not mix\n        the addition of the configuration file feature with the huge amount of\n        refactoring it requires.\n    - hash: 9ef6cdfa209ea2060aae5b07e1c606dde1fc2c03\n      author: Juan Cruz Viotti\n      subject: \"refactor(image-stream): parse xz and gzip metadata using a custom read\n        function\"\n      body: |-\n        This commit refactors the xz and gzip image handlers to pass/use a\n        custom read function to be able to determine the uncompressed size, and\n        other needed metadata.\n        By using this function (which currently only uses the `fs` module), we\n        can implement support for getting the uncompressed size of compressed\n        files using HTTP Ranges.\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n    - hash: 36bca516a3adc3d6641e55d13ff50178827d7764\n      author: Shou\n      subject: \"feat(GUI): make size units closest relative\"\n      body: |-\n        We make the size units used the closest relative unit through a new\n        filter `closestUnit` replacing the old `gigabyte` filter.\n      footers:\n        changelog-entry: Make the size units the closest relative.\n    - hash: a80f01aebc89c94b5e04c1136c925d46399a031a\n      author: Shou\n      subject: use pretty-bytes\n      body: null\n    - hash: cd2d0e8ff7bbc37bb5a8d42ad5c74ec557d68098\n      author: Shou\n      subject: remove filters folder\n      body: null\n    - hash: ae9713807d5338565d498f6f0a01f181995eeb52\n      author: Shou\n      subject: new shrinkwrap, add to package.json\n      body: null\n    - hash: 6dc5458b99be4c8c2bea72a861ff982d698f1d47\n      author: Shou\n      subject: test\n      body: null\n    - hash: 9f6e5fa9c72dcc465ae0718b7d7072f9b47ca2e9\n      author: Dhruv Paranjape\n      subject: Update README.md\n      body: null\n    - hash: de4960477864bd46e87e6805a8f1f5dda01bf768\n      author: Lucas Rangit MAGASWERAN\n      footers:\n        signed-off-by: Lucas Magasweran <lucas.magasweran@ieee.org>\n      subject: \"docs(README): add debian repository in one line\"\n      body: For convenience, create the apt source file and add the repository in one\n        line.\n    - hash: 904ba9820401a86fd2a190ec92bf20211140f773\n      author: Bob Moragues\n      footers:\n        change-id: Ia7e3aef0d90fdf21d373a560e6dd2b96e6b51da8\n        changelog-entry: Add support for .rpi-sdcard images.\n      subject: \"feat: support rpi-sdcard image file type\"\n      body: |-\n        Support the rpi-sdcard image file type output by Yocto for\n        the Raspberry Pi device.\n    - hash: 42cc644279e6f96f0163a333172a667d2b130691\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1625\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"refactor: address review comments from #1625\"\n      body: |-\n        That PR was merged in a rush, so this is the follow-up commit addressing\n        the review comments made there.\n    - hash: b5c781b9a965b8d203121876b22b5e0f95c034e9\n    - hash: 410eca3d120b5a09f677f4257ea338790a153487\n    - hash: 1eed490b752e09789026df0796ad6f48c370c403\n    - hash: 2b90f0ab993b77cf475696edd9225a86a7255970\n    - hash: 71d2da5e77046b7a7df68c1ad4b09ec317b4a06d\n    - hash: 6bb465e6b9d56ceebd2e14e7a933243d231c2d69\n    - hash: 7ca87670798355825200f3251a65204f64d7625f\n    - hash: 87b45e4c24faa4cfe373718280cec7852f8e923d\n    - hash: 1cb687d43501e33bf7de37bd26108c61ddb52a7d\n    - hash: b59bf781a08337ccb2d39ca2f270239d3efdad8f\n    - hash: 3b72818393ce0c40759d192df2c18e3136a92045\n    - hash: a1811272c6ad56d844b3be526a3fce4525ee1ec3\n    - hash: 8ff5a1982b3b5ecf0eb728ef331f49686dfd867d\n    - hash: ef945524b2d3db13e5c8635666d30f159bb2ca4b\n    - hash: b650c0e3596d2cecf53f23967544d6ebd1e31213\n    - hash: d02b4e901728e8791305e959e9a956e8d84c5d07\n    - hash: d050ceca79f04806e5f6211478ce384fe83efecc\n    - hash: 7f62cea342ad4525ecf931508ea30f314e250479\n- version: 1.1.1\n  date: 2017-07-24T18:55:35.000Z\n  commits:\n    - hash: f2791f4e86b3b2a9419c5dc6e36c923b7682de7f\n      author: Andrew Scheller\n      subject: \"docs(PUBLISHING): fix Etcher forum link\"\n      body: null\n    - hash: da62807657019cd6ea52d5dee6f6331dc9b28c68\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: use old custom build system to create AppImages\"\n      body: |-\n        electron-builder seems to ship with an older AppImages version that\n        doesn't play very well with the custom AppImages elevation system we\n        created.\n        More particularly, we can't execute custom binaries inside the mounted\n        AppImage given that the mount point seems to lose permissions, owner,\n        and group file information.\n        This commit goes back to our old custom build system just for AppImages,\n        until we properly solve the problem, which will likely involve updating\n        the AppImages version in electron-builder.\n    - hash: aacdc74ebbb400b8463c801ee6715fbf2f65a654\n      author: Andrew Scheller\n      subject: \"chore: `make distclean` now deletes `build` directory too\"\n      body: null\n    - hash: 7ea148c2ffc015043a44426d62f48be1f2863ea2\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io-modules/mountutils/pull/44\n        change-type: patch\n        changelog-entry: Fix most \"Unmount failed\" errors on macOS.\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"upgrade: mountutils to v1.2.1\"\n      body: |-\n        This version contains a fix to a set of very recurrent \"Unmount failed\"\n        macOS errors.\n    - hash: 35c424d7950ad2fdec483441f86a88feea5b539a\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: 'fix(GUI): properly pass error object to \"Flash error\" event'\n      body: |-\n        Simply running `_.merge` on an Error object results in an empty plain\n        object `{}` being sent to Mixpanel/Sentry.\n    - hash: 2285926fa696bdcf21e6608398aff94013674819\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: remove the concept of target and host platforms\"\n      body: |-\n        Its very unlikely that we will ever support cross platform builds. For\n        that reason, let's simplify the whole Makefile by removing the concept\n        of target and host platforms.\n    - hash: ff2aad0fc1eb19bd415d0f9c0861bc817f0c42d0\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(writer): Use final size if it's not an estimation\"\n      body: This avoids running into the \"flashstate percentage above 100%\" error\n        again.\n- version: 1.1.0\n  date: 2017-07-21T12:10:47.000Z\n  commits:\n    - hash: c292081eae3c1a1fd34aa30b1966bf269a26420c\n      author: Shou\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviotti@openmailbox.org>\n        see: https://github.com/resin-io/etcher/issues/1465\n        change-type: patch\n        changelog-entry: Remove Angular usage from DrivesModel.\n        depends: https://github.com/resin-io/etcher/pull/1264\n      subject: \"refactor(GUI): remove angular from DrivesModel\"\n      body: We remove usage of Angular from DrivesModel.\n    - hash: 01c07e5e2704acafc0f8e0279052aef988fa8572\n      author: Shou\n      subject: remove angular injection from tests\n      body: null\n    - hash: 54bc8dfd339010db16f3e6450f7221b62df5a245\n      author: Shou\n      footers:\n        fixes: https://github.com/resin-io/etcher/issues/1578\n        change-type: patch\n        changelog-entry: Correct the relative notification icon path.\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n        see: https://github.com/resin-io/etcher/issues/1443\n      subject: move file\n      body: null\n    - hash: 8a25922c42ea417cc643db73d8ca40efaef0ade3\n      author: Shou\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: add empty array test\n      body: null\n    - hash: ff1c2b4b24ead7d33655083df676ef5973f225d9\n      author: Jonas Hermsmeier\n      footers:\n        closes: https://github.com/resin-io/etcher/issues/1465\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n        see: https://github.com/resin-io/etcher/issues/1383\n        changelog-entry: Stop settings from overflowing into the footer.\n      subject: \"feat(image-stream): Read MBR & GPT in .getImageMetadata()\"\n      body: null\n    - hash: f42c205e9ddb8206fe0a8cb50e686375a73e9774\n      author: Jonas Hermsmeier\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1595\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"feat(gui): Display warning when image has no MBR\"\n      body: null\n    - hash: 4c3a58a4b13f3b7bad1468fc96af2c0cab4a35f0\n      author: Jonas Hermsmeier\n      footers:\n        see: https://github.com/resin-io/etcher/issues/1437\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n        changelog-entry: Don't break up size number in drive selector.\n      subject: \"fix: Mend merge conflict resolution\"\n      body: null\n    - hash: ae69d889ab767ac61cba82fe357cfa16017b2d36\n      author: Jonas Hermsmeier\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n        changelog-entry: Use React instead of Angular for the SVGIcon directive.\n      subject: \"test(image-stream): Update .isSupportedImage() tests\"\n      body: null\n    - hash: 54b2e391619759f7a87ec81556ad55983c3e3dd6\n      author: Jonas Hermsmeier\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"fix(supported-formats): Fix missing change in recursion\"\n      body: null\n    - hash: 43505741a2b11fe9ef34753058c45577d2096951\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"feat(image-stream): Normalize MBR & GPT partitions\"\n      body: null\n    - hash: 0ecb8cf6f40c4d6467808803d018bbb54f042562\n      author: Jonas Hermsmeier\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"refactor(image-stream): Rewrite parse-partitions\"\n      body: |-\n        Improved speed and resilience, while also fixing detection\n        for compressed and archived images\n    - hash: f8607cde8db90be2c35cf0a2f560baef7425fd35\n      author: Jonas Hermsmeier\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"test(image-stream): Add partition info\"\n      body: null\n    - hash: 242fc709b80eb4fa8c014357db65a620ad1cf558\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"test(image-stream): Update .dmg test images\"\n      body: null\n    - hash: 461c237b1fc29934647364df0b38e42854ce97cb\n      author: Jonas Hermsmeier\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1547#discussion_r126790010\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"test(image-stream): Update assertions to match rpi image\"\n      body: null\n    - hash: c77b08efd63b9e2d3fb0abe38e0809fe26593cfa\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"feat(image-selection): Send missing part table event\"\n      body: null\n    - hash: b9a0f258b08fe147ae8fe2d423f4c8b985875b17\n      author: Jonas Hermsmeier\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviotti@openmailbox.org>\n        change-type: patch\n        changelog-entry: Fix \"You don't have access to this resource\" error at startup\n          when behind a firewall.\n        fixes: https://github.com/resin-io/etcher/issues/1458\n      subject: \"test: Update partition values to match test image\"\n      body: null\n    - hash: 5b82016af26f3df6cf44674fffbed9e5361e206a\n      author: Jonas Hermsmeier\n      footers:\n        see: https://github.com/resin-io/etcher/issues/1443\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n        changelog-entry: Add image name, drive name, and icon to notifications.\n      subject: \"refactor(image-stream): Address comments\"\n      body: null\n    - hash: f7fa60804ddd63d8ac62671f1ad485955e0dbd63\n      author: Jonas Hermsmeier\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1409\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jviotti@openmailbox.org>\n        fixes: https://github.com/resin-io/etcher/issues/1429\n      subject: \"test(image-stream): Update partition data\"\n      body: null\n    - hash: e9485d894fcfb4116e056e9fa63575201d9093ec\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jviotti@openmailbox.org>\n        fixes: https://github.com/resin-io/etcher/issues/1444\n      subject: \"chore(image-stream): Fix lint errors\"\n      body: null\n    - hash: 312e88cf3b515a3979d4fed08c772814dc474c8f\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        see: https://github.com/resin-io/etcher/pull/1401#discussion_r116547053\n        signed-off-by: Juan Cruz Viotti <jviotti@openmailbox.org>\n      subject: \"chore(shrinkwrap): Fix shrinkwrap\"\n      body: null\n    - hash: d86be4d41c28a0610b9eee94984d7ebf70433211\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"refactor(image-stream): Address review comments\"\n      body: null\n    - hash: f32a4c2734836f0fba3aa33bce0eb6413e0c7972\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jviotti@openmailbox.org>\n      subject: \"upgrade(package): Update mbr 1.1.1 -> 1.1.2\"\n      body: null\n    - hash: ef6cf529c3e222d2968b9b5e6bc3fbb77670c5fc\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Cleanup drive detection temporary scripts created for other\n          operating systems\n        fixes: https://github.com/resin-io/etcher/issues/1571\n        see: https://github.com/resin-io/etcher/pull/1401#pullrequestreview-37459059\n        signed-off-by: Juan Cruz Viotti <jviotti@openmailbox.org>\n      subject: \"test(image-stream): Add GPT test image\"\n      body: null\n    - hash: a7226ffdf321f319c3ba31eb576630e4699276ba\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"fix(image-stream): Set MAX_STREAM_BYTES to 64K\"\n      body: Bump `MAX_STREAM_BYTES` to accommodate full GUID Partition Tables.\n    - hash: 45d83890370a0dca4041a25e3d1a2f9bfd3e143f\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        changelog-entry: Send anonymous analytics about package types.\n        fixes: https://github.com/resin-io/etcher/issues/1328\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"refactor(image-stream): Address review comments\"\n      body: null\n    - hash: d9b556f80b7253eb5483a961e62c8827bcd10ce2\n      author: Dhruv Paranjape\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: remove bintray file not my place neither do i have the keys.\n      body: null\n    - hash: 0b8ed1b6706fb57a15db4f33e97f09194904f5d7\n      author: Dhruv Paranjape\n      footers:\n        change-type: patch\n      subject: Remove last visage of publishing rpm's to bintray.\n      body: null\n    - hash: e26d2f48bf6659e9f8d06ec604e9faf98c759ea2\n      author: Dhruv Paranjape\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: address review comments.\n      body: null\n    - hash: 825cb174e26259d84802996df8b3220c58e96646\n      author: Dhruv Paranjape\n      footers:\n        change-type: patch\n      subject: Merge branch 'master' into master\n      body: null\n    - hash: 5140d1e892f399f5943c8834f48fa7c070ad8106\n      author: Dhruv Paranjape\n      footers:\n        change-type: patch\n      subject: remove electron installer redhat from optional dependancies and add it\n        to dockerfiles. also remove variable ELECTRON-INSTALLER-REDHAT inline\n        with electron installer debian script.\n      body: null\n    - hash: d675b538dde50b1d6586b732172073ea273e91a6\n      author: Dhruv Paranjape\n      subject: Add dependancy on libXScrnSaver and remove unsupported fields from\n        config.json.\n      body: |-\n        add rpm package to dockerfiles.\n        add dependancy check on rpmbuild to installer script.\n    - hash: 1a50c52014965b27e368bdfa715f0485c254403f\n      author: Dhruv Paranjape\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1550/files#r125015773\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: Merge remote-tracking branch 'upstream/master'\n      body: null\n    - hash: 1950f13d79ceb722d9407a2a41563c1329d80dff\n      author: Dhruv Paranjape\n      subject: change dependancy from lsb-core-noarch to just lsb.\n      body: null\n    - hash: 62d1fa98b4ede5253f62031eaa3f53ba6f11066c\n      author: Dhruv Paranjape\n      footers:\n        change-type: patch\n      subject: Merge remote-tracking branch 'upstream/master'\n      body: null\n    - hash: d966ce2c0b6d82b1777ad02877927ba348376df3\n      author: Dhruv Paranjape\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: address review comments.\n      body: null\n    - hash: 19637b8180e8df5762ef727c10fa3f74fe945fbf\n      author: Dhruv Paranjape\n      footers:\n        change-type: patch\n        changelog-entry: Fix \"file is not accessible\" error when flashing an image that\n          lives inside a directory whose name is UTF-16 encoded on Windows.\n        fixes: https://github.com/resin-io/etcher/issues/1459\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: Add bintray target for rpm packages.\n      body: null\n    - hash: 54e5040468c5625b38dec81480004f3559d2b2c8\n      author: Dhruv Paranjape\n      footers:\n        changelog-entry: Add Webview API version parameter.\n      subject: Merge branch 'master' of github.com:resin-io/etcher\n      body: null\n    - hash: c63ab164e5cfb619863beb432bdf3f892d505e03\n      author: Dhruv Paranjape\n      subject: Merge remote-tracking branch 'upstream/master'\n      body: null\n    - hash: efde188b76f0e0241196993f5886245714e0c970\n      author: Dhruv Paranjape\n      subject: Merge remote-tracking branch 'upstream/master'\n      body: null\n    - hash: 841846b954e6484cea40f4af20c9d3a953740c1d\n      author: Dhruv Paranjape\n      subject: Merge remote-tracking branch 'upstream/master'\n      body: null\n    - hash: cfdf8c645255405928de9357f559ef6772c1011a\n      author: Dhruv Paranjape\n      footers:\n        change-type: patch\n      subject: Merge remote-tracking branch 'upstream/master'\n      body: |-\n        Conflicts:\n        \tscripts/build/docker/Dockerfile-i686\n        \tscripts/build/docker/Dockerfile-x86_64\n        \tscripts/build/docker/Dockerfile.template\n    - hash: a4f7a40ff25ab6afbd0169f6965126f6fe862681\n      author: Dhruv Paranjape\n      subject: Merge remote-tracking branch 'upstream/master'\n      body: null\n    - hash: fefbe143be2e8bfde3800583d879bd5a01d1de15\n      author: Dhruv Paranjape\n      subject: Fix missing dependancy removed during conflict resolution.\n      body: null\n    - hash: 4d9114d59f3b8e49cdc59f50f33770a31e3766da\n      author: Dhruv Paranjape\n      footers:\n        change-type: patch\n      subject: Merge branch 'master' into master\n      body: null\n    - hash: 15d0201f86d97703ec1d63e5cdcfbd77e1fab4e8\n      author: Shou\n      footers:\n        change-type: patch\n      subject: \"feat(GUI): reset webview after navigating away\"\n      body: |-\n        We reload and reset the webview to its original URL when the user\n        navigates away from the success screen.\n        Changelog-Entry: Reset webview after navigating away from success\n        screen.\n    - hash: 11f8127bc762bb5b069da3c1f67aa0cd597283c1\n      author: Shou\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: conflate state functionality; shouldLoad -> shouldShow\n      body: null\n    - hash: 7156ef1ac6e94b164b9aa7dec95d1110ccda2c9e\n      author: Shou\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: Events React -> Events that React\n      body: null\n    - hash: fa33aa2c029c8670e357a2f60df8e45b13fc4598\n      author: Shou\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1514\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"GET param constant, makeURL return string, TODO: fix restarting\"\n      body: null\n    - hash: d94b0765b89f0ff333aaa18d81b7442d17c241ac\n      author: Shou\n      footers:\n        see: https://github.com/electron-userland/electron-builder/releases/tag/v19.9.1\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: delay reload, disable caching for webview\n      body: null\n    - hash: b67afbeffdc834365add2a82d68978eef8814998\n      author: Shou\n      footers:\n        see: https://github.com/zeit/pkg\n        fixes: https://github.com/resin-io/etcher/issues/1450\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: fix webview src resetting\n      body: null\n    - hash: dfab9527ce18e2c69d99b866244c87e5655c0497\n      author: Shou\n      footers:\n        changelog-entry: Deangular the os-dialog and error modules.\n      subject: fix linter not equals complaint\n      body: null\n    - hash: da9656a6a911bf872f08c7e302bad2a5ba4d6eaa\n      author: Shou\n      subject: StateController refactor to agnostify SafeWebview\n      body: and moving the session creation to SafeWebview\n    - hash: 3676629d123e4cfdb24d22ffe49344262447752f\n      author: Shou\n      subject: remove component folder, refactor events and url, session constant\n      body: null\n    - hash: bd73053566829241d30787df69e3a902becbb309\n      author: Shou\n      subject: only accept specific json objects from webview console\n      body: null\n    - hash: f95a7f1ccf11490e1f5784af423a221893d23a43\n      author: Shou\n      subject: use robot\n      body: null\n    - hash: ce8ec071f4951d26bbfb55985e9b5e7593943073\n      author: Shou\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: extensive usage of robot\n      body: null\n    - hash: 58292c33f47331f179bea1c66461a29feade94e0\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"doc(CLI-INSTALLATION): Make headings h3\"\n      body: null\n    - hash: 0246bf770204c0d4cf3bd3b0e0a2fd5545a4935a\n      author: Andrew Scheller\n      footers:\n        see: https://github.com/electron-userland/electron-builder/issues/1723\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"docs(CLI): move the CLI installation instructions to a separate page\"\n      body: null\n    - hash: aebaee0ce5f28017a415e8d3d97a4535431ed6b9\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jviotti@openmailbox.org>\n      subject: \"docs(CLI): add installation instructions\"\n      body: null\n    - hash: 35296caae4b1cf428036179d3479db296c7671ae\n      author: Juan Cruz Viotti\n      footers:\n        changelog-entry: Swap speed and time below the progress bar.\n        closes: https://github.com/resin-io/etcher/issues/1312\n        see: https://github.com/resin-io/etcher/pull/1372\n        signed-off-by: Juan Cruz Viotti <jviotti@openmailbox.org>\n      subject: \"chore: check that there are no unstaged shrinkwrap changes\"\n      body: null\n    - hash: 1413425b11a8077ce4699199d8206283a616466c\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        see: https://github.com/resin-io/etcher/pull/1354\n        signed-off-by: Juan Cruz Viotti <jviotti@openmailbox.org>\n      subject: \"chore: create installers (but don't publish) on every pull request\"\n      body: |-\n        This allows us to catch changes that break our installer builds before\n        merging the problematic changes.\n        As a way to simplify the CI configuration files, this commit introduces\n        an `installers-all` Makefile target that builds all installers.\n        This commit also replaces all the `cp -rf` calls with `cp -RLf` in\n        Makefile to avoid some weird hard link Appveyor issues.\n    - hash: 9a24a223ab99ee59ac1bad86c270578ccb834201\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviotti@openmailbox.org>\n        see: https://github.com/electron/electron/pull/8590\n        change-type: patch\n        changelog-entry: Turn the update notifier modal into a native dialog.\n      subject: \"refactor(GUI): turn the update notifier modal into a native dialog\"\n      body: |-\n        Electron v1.6.1 introduced checkbox support to the native message\n        dialog, giving us everything that was needed to implement the update\n        notifier modal using a native dialog.\n        This change allows us to get rid of a lot code.\n    - hash: 76e691079ccf84413e7e4e4c2ad25e231bc85c01\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: make use of electron-builder to build GNU/Linux packages\"\n      body: null\n    - hash: 080f32b6728384a8b312cbf541f7ce8fd0386296\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        changelog-entry: Generate single-binary portable installers on Windows.\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: generate single-binary portable installers on Windows\"\n      body: |-\n        We currently support portable builds that are basically ZIPs containing\n        the main Etcher executable and all its related libraries.\n        Turns out `electron-builder` supports NSIS-based portable builds that\n        can create a single executable that has everything it needs to run,\n        including any external assets.\n        This commit makes use of this new portable Windows installer\n        functionality, replacing the old ZIP approach.\n    - hash: d1fe3f309c72dd6cc479b271a5be1bf012255752\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1132#discussion_r121654527\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: fix version/platform order inconsistencies in package names\"\n      body: null\n    - hash: e9b9ef25e9ac8b2ffed84860873ee4845b32bfba\n      author: Andrew Scheller\n      subject: \"chore: move `mkdir` call from node-package-cli.sh to Makefile\"\n      body: This makes it more consistent with the other Makefile rules\n    - hash: c8e1db165c0a7e05c48aa944e4a1ff6f597703df\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1382\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"refactor(GUI): replace SET_SETTING with an atomic SET_SETTINGS action\"\n      body: |-\n        This commit is the first on a series of commit to incrementally\n        implement support for configuration files (so we avoid a huge PR like we\n        have at the moment).\n        Once of the first things we can do is replace the `SET_SETTING` redux\n        action with an atomic `SET_SETTINGS` action that sets all the settings\n        for the application at once.\n        The purpose of this change is that later the `SET_SETTINGS` action can\n        be modified to stringify all the settings and store them in a\n        configuration file, without having to deal with merges, conflicts, etc\n        (since the client application if forced to resolve those problems before\n        calling the `SET_SETTINGS` action.)\n        The behaviour of the code remains almost the same, with the exception\n        that the user can now set settings that we don't know about, so the user\n        can switch between Etcher versions without getting weird errors if one\n        of the configuration keys he has doesn't exist in the other version.\n    - hash: 56c7c2fc86e77d106b1289781fbf004025b18e38\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1505#pullrequestreview-43444274\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: don't use ./ when generating sass files\"\n      body: The `./` prefix is unnecessary.\n    - hash: 6d487612721fa31c6a99d963dc13111ada0a5403\n      author: Shou\n      footers:\n        changelog-entry: Remove Angular dependency from DriveScanner.\n      subject: \"refactor(GUI): remove angular dependency from drive scanner\"\n      body: |-\n        Remove the Angular dependency from DriveScanner and with it the service,\n        exposing it through the module directly.\n    - hash: f3afdaedba40cfa0c391179bd6b4488cc9c561b3\n      author: Shou\n      subject: tests fixed\n      body: null\n    - hash: 81dac8f7810f55543225b3f8547fc5acf57b708a\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: use `electron-builder` to generate macOS builds\"\n      body: |-\n        This commit makes use of electron-builder to replace what our scripts\n        were already doing.\n    - hash: 6c33b974b6a0ca98012a17f0a5d21ca30ccda8f5\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        fixes: https://github.com/resin-io/etcher/issues/877\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: use the new `electron-builder` version to create NSIS installer\"\n      body: |-\n        We've been using `electron-builder` v2 all this time to create the NSIS\n        installer. This commit upgrade `electron-builder` to v18.6.2, and keeps\n        using it just to create the NSIS installer (for now).\n        The final package behaves exactly like the one we have before, just that\n        we needed various tweaks to upgrade to the latest `electron-builder`\n        version.\n        In more detail:\n        - Inject data to package.json using the new `--extraMetadata` option\n        - Remove old `.builder` package.json property\n        - Change the author of the project to Resin Inc. (the company name used\n        in our code-signing certificate)\n        As an extra, the new NSIS installer allows the user to install the\n        application to any location, and fixes the fact that the previous\n        installer copied the application to C:\\Program Files (x86) even on x64\n        systems.\n    - hash: 451c1a36f366e0248718cbba79201218f4830e09\n      author: Shou\n      footers:\n        changelog-entry: Remove Angular dependency from selection-state\n      subject: \"refactor(GUI): remove angular dependency from selection-state\"\n      body: |-\n        We remove the dependency on Angular from SelectionStateModel and rename\n        it to selectionState.\n    - hash: 51635fad204a7908c95af075e4707b7d42346f9f\n      author: Shou\n      subject: module.exports -> exports, this -> exports\n      body: null\n    - hash: 8f228c2ec655f8affa3729974bbe0f9d459ee7c1\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: output build artifacts to dist/\"\n      body: |-\n        This is the directory where `electron-builder` will output build\n        artifacts.\n    - hash: f3a6d5dc4b34e6da4382d17ca9b122abf7cab2bd\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: move npm targets to Makefile\"\n      body: |-\n        We currently have various npm script target, and some of them are\n        getting complex enough that making sense out of them in package.json is\n        not a trivial task.\n        This commit moves all npm targets that are not directly recognisable by\n        npm (like `start`, `test`, `preshrinkwrap`, etc) into the Makefile.\n    - hash: 5c00ef38ca5565c9c19853891d136618cd9d067b\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: re-organize package.json in a way similar to electron-builder\"\n      body: |-\n        This commit re-organizes various metadata properties in package.json so\n        that the structure better matches what `electron-builder` expects, to\n        ease the transition.\n        - Move `.companyName` to the Makefile (we don't need this in\n        package.json)\n        - Move `.displayName` to `.build.productName`\n        - Move `.copyright` to `.build.copyright`\n        - Move category to `.build.mac.category`\n        - Move bundle id to `.build.appId`\n    - hash: 924c6779370f3fcc899f38f8ae1ffff85a3e9a9c\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/electron-userland/electron-builder/issues/517\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: remove ampersand from package description\"\n      body: |-\n        The ampersand confuses nupkg when generating Windows installers from\n        `electron-builder`.\n        The referenced issue talks about an issue where the ampersand is present\n        on the application name, but anything that gets into the `.nuspec` XML\n        file, including the description, triggers the issue.\n    - hash: 084b4dc3f861734ebce97a583049c1b8550cb94c\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"chore: remove unused `electron-packager` dependency\"\n      body: |-\n        We're not using this development dependency anymore. Furthermore, we're\n        also not using the `packageignore.js` script, which was meant to be used\n        with `electron-packager`.\n    - hash: 123a2de6b769608d6705b8387ce757af6eaecab0\n      author: Juan Cruz Viotti\n      footers:\n        change-type: minor\n        changelog-entry: Remove support for the `ETCHER_DISABLE_UPDATES` environment variable.\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"refactor(GUI): move ETCHER_DISABLE_UPDATES into package.json\"\n      body: |-\n        Etcher supports disabling the update notification dialog by setting the\n        `ETCHER_DISABLE_UPDATES` environment variable.\n        In order to simplify disabling updates for when these are managed by a\n        package manager (e.g. in a debian package), this removes support for the\n        `ETCHER_DISABLE_UPDATES` environment variable, and instead requires\n        packagers to tweak the `updates.enabled` property of the package.json\n        file, which is set to `true` by default.\n        We don't want to encourage end users to disable the update mechanism, so\n        the documention was removed from `USER-DOCUMENTATION.md`. This option\n        will remain as something only packagers should tweak.\n    - hash: a15b2f7e509906436c57ff11c528c490f447c66e\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        changelog-entry: Fix occasional increased CPU usage because of perl regular\n          expression in macOS.\n        fixes: https://github.com/resin-io/etcher/issues/1288\n        signed-off-by: Juan Cruz Viotti <jv@jviotti.com>\n      subject: \"upgrade: `drivelist` to v5.0.22\"\n      body: \"- https://github.com/resin-io-modules/drivelist/pull/168\"\n    - hash: 9592168e5f08a99837bde473caf15897d2d0acc5\n      author: Romain Bazile\n      footers:\n        change-type: minor\n        changelog-entry: Addition of .sdcard file support.\n        link: https://github.com/resin-io/etcher/issues/1360\n        fixes: https://github.com/resin-io/etcher/issues/1361\n      subject: \"fix: addition of .sdcard file support\"\n      body: null\n    - hash: 56fe413dbe89df53cb22b478ac451474fb712578\n      author: Romain Bazile\n      subject: \"minifix: tests for .sdcard file format\"\n      body: null\n    - hash: 0a9f5d9a54d5f8b3341420b9ac23817f280cd729\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"doc(README): Update & normalize badges\"\n      body: |-\n        This updates & normalizes the badges in the README to all have\n        a consistent style and adds a release-badge pointing to the website.\n    - hash: 07e7f5ad222773b4f31575bfbc463ced68cea5af\n      author: Jonas Hermsmeier\n      footers:\n        change-type: patch\n      subject: \"upgrade(package): Update node-sass to 4.5.3\"\n      body: |-\n        This updates node-sass from v3.x to v4.x in anticipation\n        of addition of Electron ABI versions in an upcoming version.\n    - hash: 7ce76db8343bff2b9ebf81176a463ed86095c572\n      author: Jonas Hermsmeier\n      footers:\n        change-type: upgrade\n      subject: \"chore(package): Update mountutils to 1.2.0\"\n      body: |-\n        This updates `mountutils` from 1.0.6 to 1.2.0, which includes\n        various fixes and adds AsyncWorkers:\n        - fix(windows): Replace use of `wsprintf()`\n        - fix(darwin): Add local context to avoid global state\n        - feat(src): Use Nan::AsyncWorker\n    - hash: d39b4ba7d7687a7eea72cbf7b8702f8ea122fb39\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviotti@openmailbox.org>\n      subject: \"chore: make use of resin.io's Docker base images\"\n      body: |-\n        Resin.io already publishes multi-arch Docker base images running Jessie,\n        which is Debian version we wanted before falling back to Ubuntu 12.04.\n        The main reason behind this change is to be able to use other resin.io\n        base images (like ARM ones) without requiring a lot of per-base-image\n        changes.\n    - hash: 65e4a3935df0bf574e725fa08f47c02cfcf1a072\n    - hash: 42eb348ff6542616a7d7f762f5c6f149d35dd1b9\n    - hash: be1ee96bc1a8b16c76a89add381eb5de5c3f4394\n    - hash: e3237d83e33774860c389c7d4b07021fc10d0311\n    - hash: 5d230d85c2ba1218e7c6134bea6e5af4b37a2247\n    - hash: 5ea92ca30f61aba3ebb32616fa9a5b3af5de25f8\n    - hash: 52173c51aaa136d229ebc0c5c57bc4b9cea04ad3\n    - hash: ec571752f5bb59b116814b761fed6208a0e550f8\n    - hash: 947bdbf46dd707ee2acd11f518d6c917d82e5af0\n    - hash: 346c5645fdc883837d9262741ecf82cee1717a89\n    - hash: d7aca39d103afaf11d6035999eebe62dc5a9e9e2\n    - hash: 3355e3c1568b418632654c327d6aadf4798a6503\n    - hash: e983f33451ad1c28e7acfdc978dc18d9c3b33268\n    - hash: 1e254721dbad59bf7864a7c56d26059ca0e8fe9e\n    - hash: f249bbde361b1a9abe22b1d8736a0cfc82f61e81\n    - hash: 6bc39b3aad75615e3ebbf33db6739691c06bd471\n    - hash: aa487d37473c17c0652f502339aeb1ca699e0437\n    - hash: 0179813227eff6684815c75cadd4d5b9d2dfa354\n    - hash: 99c26d7c23277a61439afc26c551a90d56a57727\n    - hash: 7ac7f83456bac6b5a6bebbbe3c1feb48e9b83724\n    - hash: 41280a44fdd2237ed81b63df607930cf7efbf077\n    - hash: c0ac0ebf552b30ebea4a26911cf46ef3dfe42a85\n    - hash: 6191b4cd28a2395b15ddb63a97c942f0afdd8178\n    - hash: 1ee1de64edab924961ec22505c0c384cf59a2846\n    - hash: 3b5623575d8538c1a8aa6890d41f31c1413165a1\n    - hash: 29ee9421318ab40db25fad77a650a7017f981432\n    - hash: c0a1f46a5f1be2f9efe60dccf658311e1e2e7659\n    - hash: bc6ab6e3e0fc83430f8a32103ae1aae3daa9e781\n    - hash: 1a814ff2130dbf7b239819387c9626171a269287\n    - hash: 7bcd6d74844e7ce84548f1ba7a622c8ee2f0b47a\n    - hash: 9faf3ff17f309170622f022325cd976bce362284\n    - hash: 0a54199105545f29e342ced6a668c73439a1d835\n    - hash: 7ce5492194619f00422b37044c9962925b1c4639\n    - hash: 8011c95563496eb29c6214b1bb1f07bc1adf6fe2\n    - hash: 77f2d8988c91364c6a47b2c1a2a18b2dc3f9d4db\n    - hash: 19b3878d0c193808843aac1be67cf276b3eda081\n    - hash: 3a5649471a44e21e1c288bdd6657243988a1b24b\n    - hash: 754b76f65e99a68b93b9260ddc8a1a7e6323f831\n    - hash: 2dfd6e768da3dfa90e02a14ff74d56c7a87c1f98\n    - hash: 97d8171ecd67ead461068d7131b5c21dd76b3097\n    - hash: f52a373a9d844f9338d6c60fe40b5b69620ddc07\n    - hash: 2cc010bd4db64996aab717e9009cccbcec7d0ca7\n    - hash: 736820ebc906a733c6bd67cb1cd474ed2330f43f\n    - hash: e6dd1aeab8af6ba2ccc190a8cc2f9606f5035d35\n    - hash: 72fdf501aa8515ca077670cea84733b07d059f2f\n    - hash: 56adc6a9ec6404db823f0dc60f3b1ac60bf323e5\n    - hash: d2338d814e3aa601574f4845329a780266ce7d8f\n    - hash: 7e2d406b5b7b55a9bb62f6d476474ebb67b65b69\n    - hash: cc6c0c6014efcee198cda195fef7dbfcd6e69835\n    - hash: d600f8bc2f82c0d301271564837f4452e9aa1716\n    - hash: aae9fea6c1e8fe5906683dae28cb220d72b6892f\n    - hash: 717a0f0500027f53e91c31eef3fc083fb6bb45c9\n    - hash: 77a978a4272fadb4c845feb17a9c2a883e211854\n    - hash: 245dcef0b81e612d8e36d587b73b7ba9f6790d88\n    - hash: 0b688ab3ce0adf9b2efc330c73ac7fbb01838365\n    - hash: 74766fba5fd3dbc8638398880d0a7f9a95ad013b\n    - hash: dbe07c8e827bcba528387d6356cad38278fee7d2\n    - hash: 9c2e9109356c0902a5626bb55ddfd1507915c67e\n    - hash: 147caec6c4e08f320220cca785c20aaa16166668\n    - hash: 2cd2b99c4bd27c2882ef765b5777437d4f48092d\n    - hash: 9fa7175a653ba7fd7242502675c265697b35fa91\n    - hash: a92157c5ca8e1523de3ae4d847349c91f784465f\n    - hash: c81398e5d4db1ff1f2c3f3f8e62a95faf43d8bda\n    - hash: 581b48ffcf09e98b0b7249afba76366bd710d02d\n    - hash: 36aa922d23f98bb476b02646a5fdb81642f109fe\n    - hash: c16105dbef5af51d52ba582026a4f9ccc19ffec5\n    - hash: 07c090a0d9d41365c23f5445023139edf49e6a09\n    - hash: 4fd639efa0b126f33fa81a8dc5215af14957e7bf\n    - hash: eeff671809be0d7f806c5c34350c6688a779f085\n    - hash: 4730273b14421748f04cc4246150217e1f60ab7c\n    - hash: 1867844d8d392eddf8423aa3cad8c3a754970e47\n    - hash: 5cd27f33aa68e70f54cac369c72dc4c5b265e345\n    - hash: c31257fd3db03437d4d3c6f75eb61e93ad010801\n    - hash: 8aa7d5ea10a9a844425fa4b8ea0a9fe02c90ffd1\n    - hash: f1d4ed4cbf42487b54ec838ed05c6f5d60d3771e\n    - hash: 81e14b61ae7278438a0241dc61549aecd88cebcc\n    - hash: 1cae7bd58393d2168faf482add0181336c73e2f0\n    - hash: d418513200108c52fcf828abbe6249b13838ed2d\n    - hash: 959e43535f373ec9855d1a8b780122c35999183e\n    - hash: ebfd1e62e34165632e297012bc3dec33c2e0a733\n    - hash: a407b1b187718f3ea566c4d82e25a9cfafc97371\n    - hash: a7b811fe513122872ab6a66e508a844ed8c7fafd\n    - hash: 9b727b0c93ae762ff348f1db7c3a0c1e097f5ee0\n    - hash: 1b98a25f4ce1e8026fa09e147e1aa34c20346df8\n    - hash: e036345140cfbf640c31e3e4ca77028aba68d6aa\n    - hash: 778d4967b8d34b2abc544ccb93a3f3542cdda2a5\n    - hash: 92df9e7d145c3105cbfd153e05a2e02f207db5ba\n- version: 1.0.0\n  date: 2017-05-12T04:40:08.000Z\n  commits:\n    - hash: 9a48dc9514e1b07e0ec41643bd5827b324194948\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io-modules/etcher-latest-version\n        fixes: https://github.com/resin-io/etcher/issues/673\n        change-type: minor\n        changelog-entry: Allow archive images to configure a certain amount of bytes to\n          be zeroed out from the beginning of the drive when using bmaps.\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n      subject: Rebuild pending SASS changes\n      body: null\n    - hash: 84e2454c731f69d9b7ab9d92b8411c9d5a5bf83f\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        changelog-entry: Fix \"Can't set the flashing state when not flashing\" error.\n        fixes: https://github.com/resin-io/etcher/issues/251\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n      subject: Invert progress bar stripes\n      body: Make the progress bar background striped, and the actual bar solid.\n    - hash: 9a7ac60cd0c08eaa3408123265333592c7cc378b\n      author: Juan Cruz Viotti\n      subject: Show drive name in drive selector modal\n      body: |-\n        The `name` property equals the drive letter in Windows, and the mount\n        point in UNIX based operating systems.\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#commit\n        fixes: https://github.com/resin-io/etcher/issues/258\n        changelog-entry: Fix `0x80131700` error when scanning drives on Windows.\n    - hash: c068d9b87e1ea9f358045ae5957fce480c335cb5\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        changelog-entry: Fix uncaught exception when showing the update notifier modal.\n        see: https://github.com/resin-io/etcher/issues/986\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n      subject: Codesign OS X app inside the DMG package\n      body: >-\n        This PR fixes a frequent issue users were having where opening\n\n        `Etcher.app` would result in:\n\n        \"Etcher.app\" is damaged and can't be opened. You should move it to\n\n        the trash.\n\n        Checking the code-signature of the application returned the following\n\n        error message:\n\n        $ spctl -a -v Etcher.app\n\n        Etcher.app: invalid signature (code or signature have been modified)\n\n        The solution is based on the following paragraphs from Apple's \"OS X\n\n        Code Signing in Depth\" technical note:\n\n        https://developer.apple.com/library/mac/technotes/tn2206/_index.html\n\n        > Code signing uses extended attributes to store signatures in\n        non-Mach-O\n\n        > executables such as script files. If the extended attributes are lost\n\n        > then the program's identity will be broken. Thus, when you ship your\n\n        > script, you must use a mechanism that preserves extended attributes.\n\n        >\n\n        > One way to guarantee preservation of extended attributes is by packing\n\n        > up your signed code in a read-write disk image (DMG) file before\n        signing\n\n        > and then, after signing, converting to read-only. You probably don't\n\n        > need to use a disk image until the final package stage so another less\n\n        > heavy-handed method would be to use ZIP or XIP files.\n\n        In summary, what we now do is:\n\n        - Create a temporal read-write DMG image.\n\n        - Perform the code-signing *inside* the DMG image.\n\n        - Convert the temporal DMG image into a compressed read-only image.\n\n        Sadly, this custom workflow doesn't fit in `electron-packager` nor\n\n        `electron-builder`, so we had to re-implement the features those\n\n        packages provide us in a nice encapsulated way ourselves.\n    - hash: b3431b77fb3b99b8caa9c097005ac7e084de476e\n      author: Juan Cruz Viotti\n      footers:\n        see: https://medium.com/@markelog/jscs-end-of-the-line-bc9bf0b3fdb2#.zbuwvxa5y\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        closes: https://github.com/resin-io/etcher/issues/744\n        change-type: minor\n        changelog-entry: Confirm before user quits while writing.\n      subject: Fix shell.openExternal() freezing GNU/Linux\n      body: |-\n        Electron's `shell.openExternal()` fails on GNU/Linux when Electron is\n        ran with `sudo`.  The issue was reported, and this is a workaround until\n        its fixed on the Electron side.\n        `node-open` is smart enough to check the `$SUDO_USER` environment\n        variable and to prepend `sudo -u <user>` if needed.\n        We keep `shell.openExternal()` for OSes other than Linux since we intend\n        to fully rely on it when the issue is fixed, and since its closer\n        integration with the operating system might lead to more accurate\n        results than a third party NPM module.\n        See https://github.com/electron/electron/issues/5039\n    - hash: 81b93d70fd8693489f793dcbfb7876212477085b\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n        see: https://github.com/resin-io/etcher/pull/997\n        closes: https://github.com/resin-io/etcher/issues/839\n        changelog-entry: Display `*.zip` in the supported images tooltip.\n        fixes: https://github.com/resin-io/etcher/issues/344\n      subject: Log Etcher version in Mixpanel and TrackJS\n      body: |-\n        Its hard to attempt to debug or reproduce an issue if we don't know the\n        version the user is running.\n    - hash: 8dacc77e8a831714d29006ce900b49462c030568\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1365\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: minor\n        changelog-entry: Don't include user paths in Mixpanel usage reports\n        link: https://github.com/resin-io-modules/etcher-image-stream/blob/master/CHANGELOG.md\n      subject: Fix uncaught exception if no file was selected from a dialog\n      body: |-\n        The following error is thrown if the open file dialog is cancelled\n        without any selection:\n        Unhandled rejection TypeError: Cannot read property '0' of undefined\n        at Number.indexedGetter (/home/parallels/Projects/etcher/node_modules/bluebird/js/release/call_get.js:106:15)\n        at Number.tryCatcher (/home/parallels/Projects/etcher/node_modules/bluebird/js/release/util.js:16:23)\n        at Promise._settlePromiseFromHandler (/home/parallels/Projects/etcher/node_modules/bluebird/js/release/promise.js:503:31)\n        at Promise._settlePromise (/home/parallels/Projects/etcher/node_modules/bluebird/js/release/promise.js:560:18)\n        at Promise._settlePromise0 (/home/parallels/Projects/etcher/node_modules/bluebird/js/release/promise.js:605:10)\n        at Promise._settlePromises (/home/parallels/Projects/etcher/node_modules/bluebird/js/release/promise.js:684:18)\n        at Async._drainQueue (/home/parallels/Projects/etcher/node_modules/bluebird/js/release/async.js:126:16)\n        at Async._drainQueues (/home/parallels/Projects/etcher/node_modules/bluebird/js/release/async.js:136:10)\n        at Immediate.Async.drainQueues [as _onImmediate] (/home/parallels/Projects/etcher/node_modules/bluebird/js/release/async.js:16:14)\n        at processImmediate [as _immediateCallback] (timers.js:383:17)\n    - hash: 6bd086f1c5c6654a47125cf2d46788655cae2553\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/resin-io-modules/etcher-image-write/pull/45\n        change-type: patch\n        changelog-entry: Show device id if device doesn't have an assigned drive letter\n          in Windows.\n        fixes: https://github.com/resin-io/etcher/issues/396\n      subject: Enable useContentSize BrowserWindow option\n      body: >-\n        From the documentation:\n\n        > `useContentSize` Boolean - The `width` and `height` would be used as\n        web\n\n        > page’s size, which means the actual window’s size will include window\n\n        > frame’s size and be slightly larger. Default is `false`.\n\n        The original issue is that when you specify a width/height, the actual\n\n        size that you get is slighly smaller, since the OS title bar is included\n\n        in the size you provide.\n\n        By using the `useContentSize` option, we ensure the `WebView` gets the\n\n        intended size, no matter the title bar.\n\n        This PR invalidates: https://github.com/resin-io/etcher/pull/244\n    - hash: 1f79012b9598071e65eb4a7953d2a97da44beaf3\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io-modules/etcher-image-write/pull/70\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: \"#859\"\n        change-type: patch\n        changelog-entry: 'Fix sporadic \"EIO: i/o error, read\" errors during validation.'\n      subject: Undo `:focus` styles from Bootstrap.\n      body: |-\n        On Electron, the user can click and press over a button,\n        then move the mouse away from the button and release,\n        and the button will erroneusly keep the `:focus` state style.\n        The current workaround consists of:\n        - Iterate through all the Bootstrap button styles.\n        - Set the default 'background', `color` and `border-color` to match the\n        style of the normal state.\n    - hash: 7a89eb37145c9ea395be71ab8873d42313b59318\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/blog/2111-issue-and-pull-request-templates\n        fixes: https://github.com/resin-io/etcher/issues/1109\n        change-type: patch\n        changelog-entry: Fix `ENOSPC` image alignment errors.\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n      subject: Extend ProgressButton to support a striped progress bar\n      body: This feature will be used to implement the burn validation step.\n    - hash: 76645a7ec5fc53de7bceab11c73104f2a7f4a846\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/mishoo/UglifyJS2/tree/harmony\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n        changelog-entry: Fix writing process remaining alive after the GUI is closed.\n        fixes: https://github.com/resin-io/etcher/issues/850\n      subject: Implement alert-ribbon CSS component\n      body: |-\n        This component will be used to inform an error situation to the user\n        during the burn/check processes.\n    - hash: 628587d23c8b2c0664fcec51711e5ffae7e33f81\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1379\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n        changelog-entry: Fix \"Invalid message\" error caused by the IPC client emitting\n          multiple JSON objects as a single message.\n        fixes: https://github.com/resin-io/etcher/issues/472\n      subject: Add \"Enable write validation on success\" setting\n      body: null\n    - hash: 00d163125525bfe0d8d99bc7be669942424a7be5\n      author: Juan Cruz Viotti\n      subject: Implement write validation support\n      body: null\n      footers:\n        change-type: patch\n        changelog-entry: Fix unmount issues in GNU/Linux and OS Xwhen paths contain spaces.\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/45\n    - hash: 617cbb1d6db117a8bf3d17451a8f2c4aa31b2bac\n      author: Juan Cruz Viotti\n      subject: Move application images to assets/\n      body: null\n      footers:\n        change-type: patch\n        changelog-entry: Add referers to the etcher.io links\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/resin-io/etcher/issues/632\n        closes: https://github.com/resin-io/etcher/issues/987\n    - hash: da04c9a34b234282e447cd04a6e55a2916dab443\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1366\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n        changelog-entry: Don't interpret certain ISO images as unsupported.\n      subject: Split DriveSelector components into separate files\n      body: null\n    - hash: a201566d458077f5cd9b62d2f22d7719bd540caa\n      author: Juan Cruz Viotti\n      footers:\n        changelog-entry: Rename and de-angularise AnalyticsService to analytics\n        see: https://github.com/stedolan/jq/issues/1155\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n        fixes: https://github.com/resin-io/etcher/issues/729\n      subject: Mark DriveScannerService.setDrives() as private\n      body: null\n    - hash: 71dd113c2078715cd8ea31a337df063f8ad89644\n      author: Juan Cruz Viotti\n      subject: Implement `showIfState` and `hideIfState` directives\n      body: |-\n        This directives will be used in the header navigation instead of\n        re-using this logic from the `NavigationController`.\n        A consequence of this change is that `NavigationController` is no longer\n        needed, and therefore is removed.\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/resin-io/etcher/pull/1111#discussion_r103483879\n        change-type: patch\n    - hash: 2c7421d91772e39dca528760a7a73d25353615af\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/caskroom/homebrew-cask/pull/26319\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n      subject: Implement an `openExternal` attribute directive.\n      body: |-\n        This directive will be used in the header and footer instead of having\n        to rely on `NavigationController` to expose `shell.openExternal`.\n    - hash: 1a99e190648b598937c3fe35e6ec60ccb50efe8d\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/resin-io/etcher/pull/1264/files#r110662965\n        change-type: patch\n      subject: Decouple DriveScannerService from Dialog\n      body: null\n    - hash: 60b6d6a71a5aedec75d7c7fd55d36cf4aea5f150\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/resin-io/etcher/pull/1262#discussion_r110541438\n        change-type: patch\n        fixes: https://github.com/resin-io/etcher/issues/685\n        changelog-entry: Fix \"Not Enough Space\" error when flashing unaligned images.\n      subject: Convert SelectionStateService into a model\n      body: null\n    - hash: 7a4e36968e3a0a0ac4cc27fc2936005094b1cf91\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1183\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n        changelog-entry: \"Fix `blkid: command not found` error in certain GNU/Linux\n          distributions.\"\n        fixes: https://github.com/resin-io/etcher/issues/640\n      subject: Extract browser window progress into WindowProgressService\n      body: null\n    - hash: 5db6c02435d7fdee1ffe5dd91a0acac411b8622c\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/resin-io/etcher/issues/888\n        changelog-entry: Fix incorrect estimated entry sizes in certain ZIP archives.\n        change-type: patch\n        fixes: https://github.com/resin-io/etcher/issues/644\n      subject: Transform SettingsService into the SettingsModel module\n      body: null\n    - hash: 6ef34608f341614e4101cc7e4dbd2b8ee5bb10b9\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        changelog-entry: Prevent `ENOSPC` if the drive capacity is equal to the image size.\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/resin-io/etcher/issues/797\n        fixes: https://github.com/resin-io/etcher/issues/378\n      subject: Add vertical spacing to unmount on success message on finish screen\n      body: null\n    - hash: cbbf4aed41f38b5de37716ee07c5e5fc5e16695c\n      author: Juan Cruz Viotti\n      footers:\n        changelog-entry: Add a dynamic finish page.\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/resin-io/etcher/issues/797\n        fixes: https://github.com/resin-io/etcher/issues/630\n      subject: Use SettingsService in FinishController\n      body: |-\n        EXposing the settings from the `FinishController` is a better approach\n        that instantiating the `SettingsController` in the Finish page template.\n    - hash: b81343b4cd8db6f3f0ee97b43771dcca2daa515d\n      author: Juan Cruz Viotti\n      subject: Move all settings related components to a settings page subdirectory\n      body: null\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/resin-io/etcher/issues/729\n    - hash: 43bafbe43b13d1ebd0ca51b4463b695837362a1e\n      author: Juan Cruz Viotti\n      subject: Group finish page components in a common directory\n      body: null\n      footers:\n        see: https://github.com/resin-io/etcher/issues/632\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n        changelog-entry: Prevent failed validation due to drive getting auto-mounted in\n          GNU/Linux.\n        fixes: https://github.com/resin-io/etcher/issues/574\n    - hash: dabdceae245e799b700642b764612cc4ea4278d8\n      author: Juan Cruz Viotti\n      subject: Group all parts of the progress-button component in a single directory\n      body: null\n      footers:\n        see: https://github.com/resin-io-modules/drivelist/pull/146\n        change-type: patch\n        changelog-entry: Upgrade `drivelist` to v3.3.0.\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n    - hash: 396d3ecc731e49f6bab929557698cfa569973c1f\n      author: Juan Cruz Viotti\n      subject: Implement a drive selector modal\n      body: |-\n        This modal provides a more advanced way to select a drive. It prevents\n        certain issues the dropdown was having, like the contents overflowing\n        when there were many connected drives.\n      footers:\n        changelog-entry: Improve speed when retrieving archive image metadata.\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n        fixes: https://github.com/resin-io/etcher/issues/202\n    - hash: 8b4076b418878b8ad64241dde6e33e2902533e77\n      author: Juan Cruz Viotti\n      subject: Make a CSS class for fixed-width step buttons\n      body: null\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1228\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n        fixes: https://github.com/resin-io/etcher/issues/634\n        changelog-entry: Improve image full file name modal tooltip.\n    - hash: 85d1c16dccafb66fed94e4cf7eba7df4606f9abd\n      author: Juan Cruz Viotti\n      subject: Style btn-sm\n      body: null\n      footers:\n        change-type: patch\n        changelog-entry: Fix \"`modal.dismiss` is not a function\" exception.\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n    - hash: 12f92c80247a9861a18ba82ba1cb3514636a247c\n      author: Juan Cruz Viotti\n      subject: Fix step vertical bars slight misalignment\n      body: null\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1120\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/171\n        change-type: minor\n        changelog-entry: Add `.bmap` support.\n    - hash: 714769511d1417b427f3468f90ada7ec8916fd27\n      author: Juan Cruz Viotti\n      subject: Merge src/drives.js with DriveScannerService\n      body: |-\n        `src/drives.js` made little on its own, and only caused extra thinking\n        overhead due to indirection.\n      footers:\n        changelog-type: Bound flash progress percentage within 0-100 range.\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/resin-io/etcher/issues/171\n        change-type: minor\n        changelog-entry: Upgrade `etcher-image-stream` to v3.1.0.\n        link: https://github.com/resin-io-modules/etcher-image-stream/blob/master/CHANGELOG.md\n    - hash: f6916b02fb21c711a8333dc009ebcacb87299627\n      author: Juan Cruz Viotti\n      subject: Fix \"Use same image\" not preserving the image selection\n      body: null\n      footers:\n        change-type: minor\n        changelog-type: Update flashing step's icon to a lightning strike.\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/348\n    - hash: 880afa1dad75139f59290827bc2ec3a3f8fe2889\n      author: Juan Cruz Viotti\n      subject: Refactor badge as a scss component\n      body: null\n      footers:\n        changelog-entry: Update the old image step icon with 'plus' icon.\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/509\n        see: https://github.com/resin-io/etcher/issues/325\n    - hash: cd9f0e97600b293255354687f0358f86b3fd92a8\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n        changelog-entry: Omit empty SD Card readers in the drive selector on Windows.\n        see: https://github.com/resin-io/etcher/pull/795\n      subject: Refactor caption as a scss component\n      body: null\n    - hash: f2c627df69b23882fe9f61c759899ee2f540a4f1\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/resin-io/etcher/issues/787\n      subject: Refactor hero-button as a scss component\n      body: null\n    - hash: 731488e0fa64bb64e98b9911dadabccedc8d476a\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/resin-io/etcher/pull/1110\n      subject: Refactor tick as a scss component\n      body: null\n    - hash: e7d668336c982feaf8500071050d02a64cc22a0a\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n        see: https://github.com/resin-io/etcher/pull/783#issuecomment-256959050\n      subject: Move title normalisation to desktop.css\n      body: null\n    - hash: c0c70c60104ffce55c208d6c7ad03494854a5fd0\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/resin-io-modules/etcher-image-stream/pull/10\n        changelog-entry: Prevent selected drive from getting auto-removed when\n          navigating back to the main screen from another screen.\n        closes: https://github.com/resin-io/etcher/issues/491\n      subject: Convert hero-progress-button into an Angular directive\n      body: null\n    - hash: bb7aa570a5dd3c8f401d0846ed810b972e55ce60\n      author: Juan Cruz Viotti\n      footers:\n        change-type: minor\n        changelog-entry: Show \"Unmounting...\" while unmounting a drive.\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/npm/npm/issues/2679\n      subject: Make caption's uppercase by default\n      body: null\n    - hash: 817d97e12e4fb27541923562bf02749f2c9b2561\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1319\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/801\n        change-type: patch\n        changelog-entry: Fix new available drives not being recognised automatically in Windows.\n      subject: Normalise step footers captions\n      body: null\n    - hash: 504db0dea9d9099e140736776c55ed3256f08464\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        changelog-entry: Fix application stuck at \"Finishing\".\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/resin-io/etcher/issues/573\n      subject: Move Boostrap style customisations to a boostrap.scss file\n      body: null\n    - hash: 447217db9f62ef91b7446e506c32d589254fad6b\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        changelog-entry: Display an error if no graphical polkit authentication agent was found.\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/1019\n        see: https://github.com/jorangreef/sudo-prompt/pull/29\n      subject: Remove unnecessary empty line in success partial\n      body: null\n    - hash: 156d5d15d8015db80f8447eccb69261c4fefce66\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io-modules/drivelist/pull/86\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n        changelog-entry: Fix internal removable drives considered system drives in macOS Sierra.\n        fixes: https://github.com/resin-io/etcher/issues/173\n      subject: Setup code-signing in Windows\n      body: null\n    - hash: 66d8983fc4320f241dd75269bf899a337ebdd5a7\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/resin-io/etcher/issues/127\n        change-type: patch\n        changelog-entry: Upgrade `etcher-image-write` to v6.0.1.\n        link: https://github.com/resin-io-modules/etcher-image-write/blob/master/CHANGELOG.md\n      subject: Add missing package metadata\n      body: |-\n        - Legal copyright.\n        - Company name.\n        - File description.\n        - Original filename.\n        - Product name.\n        - Internal name.\n    - hash: b4699105e782188dab080debb341a6880e5eca74\n      author: Juan Cruz Viotti\n      subject: Remove .travis.yml deploy section\n      body: |-\n        Deploy will be done locally for now given security concerns with CI\n        servers and certificates.\n      footers:\n        see: https://docs.npmjs.com/cli/shrinkwrap\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        changelog-entry: Upgrade `removedrive` to v1.0.0.\n        fixes: https://github.com/resin-io/etcher/issues/289\n        change-type: patch\n        link: https://github.com/jviotti/removedrive/blob/master/CHANGELOG.md\n    - hash: 5f9a26018c022b790c42885127f67d8d30abcaba\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/resin-io/etcher/issues/609\n        fixes: https://github.com/resin-io/etcher/issues/215\n        change-type: patch\n        changelog-entry: Fix duplicate drives in Windows.\n      subject: Return to avoid any further code execution after an elevation error\n      body: |-\n        Turns out that even by using `process.exit(1)`, the electron main\n        process doesn't exit instantly, but continues executing code.\n        This causes electron to throw on `electron.globalShortcut` because this\n        functionality is not available given that we didn't create a renderer\n        view.\n    - hash: a90275144fe600df623bb0e86cdc4f4339f1cd27\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/resin-io/etcher/pull/764\n        fixes: https://github.com/resin-io/etcher/issues/492\n      subject: Upgrade drivelist to v2.0.9\n      body: |-\n        This new version contains various fixes to better detect removable\n        drives.\n    - hash: 0a8617efd2470cd34b36081e276cde3799783418\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/angular/angular.js/pull/13662\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n        changelog-entry: Fix duplicate error messages\n        fixes: https://github.com/resin-io/etcher/issues/1082\n      subject: Implement validation support in Etcher CLI\n      body: null\n    - hash: 3cc6a052b1227d0cd1e88cfd618bad08b48ec004\n      author: Juan Cruz Viotti\n      subject: Implement Etcher CLI \"robot\" option\n      body: |-\n        This option makes the Etcher CLI outputs state information in a way that\n        can be easily parsed by a parent process spawning it.\n        The format of the state output is:\n        <type> <percentage>% <eta>s <speed>\n        This can be easily parsed as follows:\n        const output = line.split(' ');\n        const state = {\n        type: output[0],\n        percentage: parseInt(output[1], 10),\n        eta: parseInt(output[2], 10),\n        speed: parseInt(output[3], 10)\n        };\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n    - hash: 2a14a984388cbdfbdd9e15eb714b1fe294b9a86d\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        changelog-entry: Fix \"Unmount failed\" on Windows where the PC is connected to\n          network drives.\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n      subject: Fix lint warnings\n      body: \"- `os` in unused in `byte-size.spec.js`\"\n    - hash: f56baf4b2ac8c87c31b2b0371c0106fca3683a89\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n      subject: Move GUI code into lib/gui\n      body: |-\n        This refactoring will be useful on future changes, where there will be\n        a single application entry point that will execute the CLI or the GUI\n        version depending on the environment.\n    - hash: 9e3ae993750f30ffb1450ad78443977bd728eeda\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        see: https://github.com/mapbox/node-pre-gyp/issues/281\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/773\n        changelog-entry: Only enable error reporting if running inside an `asar`.\n      subject: Deprecate tar.gz GNU/Linux \"installers\"\n      body: We're distributing AppImages now for convenience.\n    - hash: 1e3d262c24abd3cdb01f4bbd8a7ce80e87140810\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: minor\n        see: https://github.com/resin-io/etcher/pull/913#discussion_r90801230\n        changelog-entry: Perform drive auto-selection even when there is no selected image.\n      subject: Upgrade drivelist to v3.0.0\n      body: |-\n        This new version reports the size as a number of bytes instead of a\n        human readable string, so we have to take care of converting back to a\n        readable GB format ourselves.\n    - hash: 0b094bb50ce426b4628934fa9a7b9f62a7df850c\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        closes: https://github.com/resin-io/etcher/issues/1170\n        changelog-entry: Fix \"backdrop click\" uncaught errors on modals.\n        see: https://github.com/resin-io/etcher/pull/934#issuecomment-264862767\n        change-type: patch\n      subject: \"Fix Error: Cannot find module `../global-shortcut` in Windows\"\n      body: |-\n        Since the Electron upgrade, Windows users are hitting a weird error\n        about `global-shortcut` not existing.\n        A solution is to `require('global-shortcut')` instead of accessing it as\n        a property of `electorn`.\n    - hash: 56ea1d183c0c320d72017897c9dff37eeb449f28\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io/etcher/pull/923#discussion_r90571316\n        change-type: patch\n        changelog-entry: Upgrade `drivelist` to v3.2.4.\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/1225\n      subject: Integrate Etcher CLI in the main repository\n      body: |-\n        This PR integrates the Etcher CLI code-wise, but doesn't yet handles the\n        distribution part of the story.\n    - hash: 8c110c8ffa60f3da345b72d1f984822b4885cc4b\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        see: https://github.com/resin-io/etcher/pull/923#discussion_r90570968\n        fixes: https://github.com/resin-io/etcher/issues/418\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        changelog-entry: Fix Etcher leaving zombie processes behind in GNU/Linux.\n      subject: Upgrade Electron to v0.37.6\n      body: |-\n        The main motiviation for such upgrade is that an error manifesting\n        itself as `Cannot read property 'object' of undefined` on certain Linux\n        systems was fixed in v0.37.4.\n        See https://github.com/electron/electron/issues/5229\n    - hash: aeb9bc70cf966d546071121318a9ba6682c5d52a\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1304\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/642\n        change-type: patch\n        changelog-entry: Escape quotes from image paths to prevent Bash errors on\n          GNU/Linux and OS X.\n      subject: Make use of shell module by requiring `shell`\n      body: |-\n        Otherwise we get a strange issue when trying to stub it:\n        TypeError: Attempted to wrap undefined property openExternal as function\n    - hash: 332f1748726be0f9f7d48604326c4c9c41fa1f7b\n      author: Juan Cruz Viotti\n      subject: Add Makefile rule to generate an x86 AppImage for GNU/Linux\n      body: null\n      footers:\n        change-type: minor\n        changelog-entry: Support rich image extensions.\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/470\n    - hash: be8a52a36bd4283574b36fa5e11f84899cccfaae\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1061\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n        changelog-entry: Show available Etcher version in the update notifier.\n        link: https://github.com/resin-io-modules/etcher-image-stream/blob/master/CHANGELOG.md\n        fixes: https://github.com/resin-io/etcher/issues/410\n      subject: Distinguish between flash and validation events in Mixpanel\n      body: null\n    - hash: ccd816aa0829cdd14990f60138b72a7c00ab086f\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io/etcher/commit/bc6e51996441ce50cd5998712f79e15b6bf6499b#commitcomment-17164442\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: minor\n        changelog-entry: Use info icon instead of \"SHOW FULL FILE NAME\" in first step.\n        fixes: https://github.com/resin-io/etcher/issues/458\n      subject: Make use of AppImage desktop integration script\n      body: |-\n        This is useful to prompt the user to install the `.desktop` file.\n        The `Description` key in `Etcher.desktop` was changed to `Comment` since\n        `desktop-file-validate` complained with:\n        Etcher.desktop: error: file contains key \"Description\" in group \"Desktop\n        Entry\", but keys extending the format should start with \"X-\"\n        After checking the desktop file format specification, the correct key\n        should be \"Comment\"\n        (https://specifications.freedesktop.org/desktop-entry-spec/latest/ar01s05.html).\n    - hash: c3e360e61933ef0044c005b5e92c879ff9a47c49\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io-modules/elevator/pull/12\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/323\n        change-type: minor\n        changelog-entry: Publish standalone Windows builds.\n      subject: Generate AppImage package for GNU/Linux x86_64\n      body: null\n    - hash: 7e6741494a0fbfc18d0f2ab3bb59e0ac4d5bab3b\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1326\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/830\n        change-type: minor\n        changelog-entry: Prevent flashing the drive where the source image is located.\n      subject: Allow to bypass elevation with an environment variable\n      body: |-\n        This is mostly used for debugging purposes, or by power users that know\n        what they're doing.\n    - hash: ae7e82750c6d75d952225c392e30981d79eb0ec4\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        changelog-entry: Fix drag and drop not working anymore.\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/1028\n      subject: Remove unnecessary fields from `bower.json`.\n      body: |-\n        We don't distribute the application through bower, and removing stuff\n        means one less place to be concerned about certain meta-data to be in\n        sync.\n    - hash: c7d28dd5af73772f39c1b8e9ce33f2522615aa97\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io-modules/etcher-image-stream/pull/21\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/334\n        changelog-entry: Add support for `raw` images.\n        change-type: minor\n      subject: Refactor initial elevation routine\n      body: null\n    - hash: e1f78483ba7b641cb6ab0e8e83c42571b81f7182\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n        see: https://github.com/npm/npm/issues/4984\n        fixes: https://github.com/resin-io/etcher/issues/338\n      subject: Add dashed underline to footer links\n      body: null\n    - hash: 24216e4eeda9a0477e9577d316decc6fa971d8c8\n      author: Juan Cruz Viotti\n      footers:\n        change-type: minor\n        changelog-entry: Display a nice alert ribbon if drive runs out of space.\n        see: https://github.com/resin-io/etcher/issues/571\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/294\n      subject: Improve UX when closing the drive selector modal\n      body: |-\n        The current \"Close\" button makes it confusing to the user to know if\n        he's accepting his changes, or just discarding them.\n        The \"Close\" button in the top right corner was replaced with a standard\n        cross icon, and there is a new \"Continue\" block button fixed in the\n        bottom of the modal.\n    - hash: 0113927ba57ac7cc48f6eda66742614c880f7681\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: minor\n        closes: https://github.com/resin-io/etcher/issues/905\n        changelog-entry: Validate the existence of the passed drive.\n        fixes: https://github.com/resin-io/etcher/issues/756\n      subject: Link the version string in the footer to the CHANGELOG\n      body: null\n    - hash: d8865ee08e0e22565aad0606658b73f729399f0c\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n      subject: Implement ManifestBind directive\n      body: |-\n        This directive is useful to bind the contents of an element to a\n        property in the `package.json` manifest.\n    - hash: 5f46ca1edcc98e712b8b94e8c99c37b203f86daf\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        changelog-entry: Capitalize every text throughout the application.\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/292\n        see: https://github.com/resin-io/etcher/issues/750\n      subject: Add application version to footer\n      body: null\n    - hash: 0f80ce8cfc7ba6fa69a3a95c20fc9dc1c5e42a8b\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n        changelog-entry: Don't clear selection state when re-selecting an image.\n        fixes: https://github.com/resin-io/etcher/issues/307\n      subject: Upgrade resin-image-write to v3.0.3\n      body: |-\n        This new version contains a fix for the `stream.push() after EOF` error\n        hit when writing unaligned images.\n    - hash: 9e1f068b565ca00b3091391a95303a64814f9722\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: minor\n        see: https://github.com/resin-io/etcher/commit/e603cb0838b005f1c8430bbce4c98b431d9c1ba9\n        changelog-entry: Add support for `etch` images.\n        fixes: https://github.com/resin-io/etcher/issues/327\n      subject: Reset writer state on flash error\n      body: |-\n        Not doing so leads the writer state to have a `progress` of `100%`,\n        while `isFlashing()` is `false`, which is an inconsistent state.\n    - hash: 3f7de530a8cb9db61d25d3a8ee23da3e99e14c14\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        changelog-entry: Check if drive is large enough using the final uncompressed\n          size of the image.\n        see: https://github.com/addaleax/lzma-native/issues/25\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: \"#571\"\n      subject: Fix double-quote lint warnings\n      body: null\n    - hash: 43667ba53feaa41147d4bbb1077ec894b3e9d894\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io-modules/mountutils\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: minor\n        changelog-entry: Fix several unmount related issues in all platforms.\n        fixes: https://github.com/resin-io/etcher/issues/750\n      subject: Inherit current scope in osOpenExternal directive\n      body: |-\n        This directive attempts to create a new isolated scope, which leads the\n        errors when using this directive on top of another directive in the same\n        element.\n    - hash: e3adf0590239260349ae088e079826d25b91de13\n      author: Juan Cruz Viotti\n      subject: Implement SVGIcon Angular directive\n      body: This directive replaces part of `hero-icon`, the old Polymer component.\n      footers:\n        change-type: patch\n        fixes: https://github.com/resin-io/etcher/issues/256\n        changelog-entry: Swap the order of the drive and image selection steps.\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n    - hash: d8d0ef145b672405874e34a68a38401b82cd37be\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io-modules/mountutils/pull/25\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/480\n        change-type: minor\n        changelog-entry: Add an \"unsafe\" option to bypass drive protection.\n      subject: Fix lint warnings about missing empty line above `module.exports`\n      body: null\n    - hash: 5f2b33717c9dc94eff29abca44c48673a9dbd91c\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io-modules/etcher-image-write/pull/96\n        change-type: patch\n        changelog-entry: Upgrade `drivelist` to v3.2.2.\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/430\n        link: https://github.com/resin-io-modules/drivelist/blob/master/CHANGELOG.md\n      subject: Re-build CSS\n      body: null\n    - hash: 73b706ca52d06afb30e4746031a6d87389675e28\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io-modules/elevator/pull/10\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: minor\n      subject: Require ui.router and ui.bootstrap using NPM style\n      body: null\n    - hash: 65acf6446650404748915f1eec621f669c480555\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        changelog-entry: Upgrade `etcher-image-write` to v5.0.2\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        link: https://github.com/resin-io-modules/etcher-image-write/blob/master/CHANGELOG.md\n        see: https://github.com/resin-io/etcher/issues/571\n      subject: Document directives with JSDoc\n      body: null\n    - hash: 3539ee4ec70d555d416ec65bb5e0ab802e8d979f\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io/etcher/pull/896#discussion_r89999295\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: minor\n        changelog-entry: Show warning when user tries to flash a Windows image\n        closes: https://github.com/resin-io/etcher/issues/1035\n        fixes: https://github.com/resin-io/etcher/issues/725\n      subject: Don't require angular-ui-bootstrap in main module\n      body: This dependency is only required by `Etcher.Components.DriveSelector`.\n    - hash: 92dee5304c9c610c61e103c4763f81d226b0ccf5\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n        changelog-entry: Fix flashing never starting after elevation in GNU/Linux.\n        fixes: https://github.com/resin-io/etcher/issues/665\n      subject: Make all angular modules export the name of the module\n      body: |-\n        This makes them very nicely require-able, for example:\n        angular.module('MyModule', [\n        require('my-dependency');\n        ]);\n        From https://medium.com/@kentcdodds/how-to-distribute-your-angularjs-module-e04d4dd58ddc#.yqg2zo8im\n    - hash: b8f63af3f81bca3abd055303bc91ab35eb126655\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/627\n        link: https://github.com/resin-io-modules/etcher-image-write/blob/master/CHANGELOG.md\n        changelog-entry: Fix sporadic EPERM write errors on Windows.\n      subject: Promisify `drivelist.list()` with `angular-q-promisify`\n      body: null\n    - hash: 3a92e202b6eebb59403e830a975b127e660c57d4\n      author: Juan Cruz Viotti\n      subject: Reorganize utilities and desktop integration modules\n      body: |-\n        - Rename `Etcher.Utils.Dropzone` to `Etcher.OS.Dropzone`\n        - Rename `Etcher.Utils.OpenExternal` to `Etcher.OS.OpenExternal`\n        - Rename `Etcher.Utils.WindowProgress` to `Etcher.OS.WindowProgress`\n        - Rename `Etcher.notification` to `Etcher.OS.Notification`\n        - Rename `Etcher.notifier` to `Etcher.Utils.Notifier`\n        - Rename `Etcher.path` to `Etcher.Utils.Path`\n      footers:\n        see: https://github.com/resin-io/etcher/issues/711\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n        changelog-entry: Don't throw an \"Invalid image\" error if the extension is not in\n          lowercase.\n        fixes: https://github.com/resin-io/etcher/issues/567\n    - hash: ba2b78db82dd0f558bc793eb4f3f3c40119e9236\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io-modules/drivelist/pull/95\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n        changelog-entry: Fix \"cscript is not recognised as an internal or external\n          command\" Windows error.\n        fixes: https://github.com/resin-io/etcher/issues/314\n      subject: Publish ZIP versions of Etcher.app\n      body: \"`Squirrel.Mac` works with ZIP packages rather than DMGs.\"\n    - hash: 724c45a5de1c73f48830d7ea8e395d74b5a12152\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/probonopd/AppImageKit/commit/1569d6f8540aa6c2c618dbdb5d6fcbf0003952b7\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        closes: https://github.com/resin-io/etcher/issues/1032\n        changelog-entry: Set dialog default directory to the place where the AppImage\n          was run from in GNU/Linux.\n        change-type: patch,\n        fixes: https://github.com/resin-io/etcher/issues/296\n      subject: Improve UX when re-selecting a single available drive\n      body: |-\n        Currently, if you have only one connected drive, Etcher will auto-select\n        it. One the single drive is auto-selected, if you attempt to change your\n        drive selection by clicking on the \"Change\" link button, the\n        re-selection is undone, and redone in a matter of milliseconds, making\n        it very difficult to get the drive selector modal to open.\n        A simple solution to this problem is making \"Change\" links trigger the\n        reselection action (e.g: opening modals, dialogs, etc) instead of simply\n        undoing the selection.\n    - hash: 63e8a86bdc56ed82489b2aba176b50c02f051808\n      author: Juan Cruz Viotti\n      footers:\n        change-type: patch\n        changelog-entry: Fix \"rawr i'm a dinosaur\" bzip2 error.\n        fixes: https://github.com/resin-io/etcher/issues/310\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/resin-io/etcher/issues/355\n      subject: Add a Mixpanel event when the application starts\n      body: null\n    - hash: 027fe24f3a5ae704202ace2d8b3a697e4a0cea69\n      author: Juan Cruz Viotti\n      subject: Add \"Change\" button links below each step\n      body: null\n      footers:\n        see: https://github.com/resin-io/etcher/issues/898\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: minor\n        changelog-entry: Allow the user to disable auto-update notifications with an\n          environment variable.\n        fixes: https://github.com/resin-io/etcher/issues/290\n    - hash: 53248dbcd3b480928e78007a178cb21219707117\n      author: Juan Cruz Viotti\n      subject: Connect DriveSelector with SelectionStateModel\n      body: |-\n        Previously, `DriveSelector` kept a temporary selection state until the\n        modal was closed, which caused the selected drives to be passed to\n        `SelectionStateModel`.\n        This proves to be problematic when attempting to pass changes to\n        `SelectionStateModel` to `DriveSelector`. For example, consider the case\n        where the `DriveSelector` modal is opened with two drives, and one is\n        ejected. The remaining drive will be auto-selected by Etcher in the\n        background, but `DriveSelector` will not update itself with such change.\n      footers:\n        change-type: patch\n        changelog-entry: Fix `ENOENT` error when selecting certain images with multiple\n          extensions on GNU/Linux.\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/electron/electron/issues/6305\n        fixes: https://github.com/resin-io/etcher/issues/304\n    - hash: ca2159bc2ff32a39c95a064a81b83a3884bd0dbb\n      author: Juan Cruz Viotti\n      subject: Hide drive selector modal if no available drives\n      body: |-\n        If you have the drive selector modal opened, but you eject all the\n        available drives, the modal will be closed automatically.\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n        changelog-entry: Fix flashing not starting when an image name contains a space.\n        fixes: https://github.com/resin-io/etcher/issues/295\n    - hash: 06a69a26ff247690814fed92a692cfbb96d19549\n      author: Juan Cruz Viotti\n      subject: Add Etcher logo to application footer\n      body: null\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n        changelog-entry: Fix error when cancelling an elevation request.\n        fixes: https://github.com/resin-io/etcher/issues/252\n    - hash: 7c280189587ba69c1549839569b440b390d79c10\n      author: Juan Cruz Viotti\n      subject: Highlight features in README file\n      body: null\n      footers:\n        change-type: patch\n        changelog-entry: Fix error when writing images containing parenthesis in\n          GNU/Linux and OS X.\n        fixes: https://github.com/resin-io/etcher/issues/291\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/resin-io/etcher/commit/951b8de9fc76821cf3140bd7e75c2d57ee8def21\n    - hash: 7c6b0dd48cdd6d3b642c70144baf310eb7a483c5\n      author: Juan Cruz Viotti\n      subject: Replace all occurrences of \"burn\" with \"flash\"\n      body: Technically, a removable drive is flashed, not burned.\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/297\n    - hash: 096a7e9c545fc61f255eaeee1f235b2d5cd54e53\n      author: Juan Cruz Viotti\n      subject: Allow to drag and drop an image to the first step\n      body: See\n        https://github.com/electron/electron/blob/master/docs/api/file-object.md\n      footers:\n        see: https://github.com/resin-io/etcher/issues/820\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        changelog-entry: Add support for `hddimg` images.\n        change-type: minor\n        fixes: https://github.com/resin-io/etcher/issues/279\n        link: https://github.com/resin-io-modules/etcher-image-stream/blob/master/CHANGELOG.md#v230---2016-07-01\n    - hash: 6b7323ccb09d205a5cf976a8eac8e1700bd5c182\n      author: Juan Cruz Viotti\n      footers:\n        fixes: https://github.com/resin-io/etcher/issues/281\n        see: https://github.com/nodejs/node-gyp/issues/1151\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        change-type: patch\n      subject: Compress Linux executables and Windows DLLs with UPX\n      body: |-\n        Before:\n        118M   Etcher-linux-x64\n        122M   Etcher-linux-x86\n        142M   Etcher-win32-x64\n        116M   Etcher-win32-x86\n        After:\n        74M    Etcher-linux-x64\n        74M    Etcher-linux-x86\n        124M   Etcher-win32-x64\n        102M   Etcher-win32-x86\n    - hash: c3793c1a9e01a17be1de3abab35a1cc72ba3b6a6\n      author: Juan Cruz Viotti\n      subject: Move package ignore list computation to a separate script\n      body: null\n      footers:\n        change-type: patch\n        changelog-entry: Wrap drive names and descriptions in drivelist.\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: https://github.com/resin-io/etcher/pull/548\n    - hash: 320a3d116f5d2b01c7d88ff75f457d829ffccbf9\n      author: Juan Cruz Viotti\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        see: http://electron.atom.io/docs/api/web-contents/\n        change-type: patch\n        fixes: https://github.com/resin-io/etcher/issues/280\n      subject: Implement OS notifications on burn completion\n      body: |-\n        Its helpful to have an auditive/visual cue when a burn operation\n        completed.\n        Instead of adding a setting entry to enable/disable notifications, you\n        can use the standard way to control notifications from your operating\n        system. For example, in OS X, you might go to \"System Preferences\" ->\n        \"Notifications\" and disable notifications for \"Etcher\".\n    - hash: 35aeea1a60bedd7c0f7c2b013243f337876e1711\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/jorangreef/sudo-prompt/commit/17f45ebef31afd9fb6260f7c2950fea4aab5ae4d\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        closes: https://github.com/resin-io/etcher/issues/874\n        change-type: patch\n        changelog-entry: Allow the user to press ESC to cancel a modal dialog.\n        fixes: https://github.com/resin-io/etcher/issues/278\n      subject: Rename Linux binary to \"etcher\"\n      body: The capital letter is not very user friendly for command line people.\n    - hash: 8d48b82928e646940a87b0fc5a2085a03948db6c\n      author: Juan Cruz Viotti\n      subject: Upgrade Electron to v0.36.11\n      body: |-\n        This version contains a fix for `resizable: false` not working on\n        GNU/Linux.\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        changelog-entry: Fix state validation error when speed equals zero.\n        change-type: patch\n        see: https://github.com/electron/electron/releases/tag/v0.36.11\n        fixes: https://github.com/resin-io/etcher/issues/272\n    - hash: 292a9bb642a37f6c137511de095486d121844d51\n      author: Juan Cruz Viotti\n      footers:\n        fixes: https://github.com/resin-io/etcher/issues/1180\n        see: https://github.com/sindresorhus/is-admin/pull/4\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        changelog-entry: Fix incorrect ETA numbers in certain timezones.\n        change-type: patch\n      subject: Prevent dialog.showErrorBox() throwing if wrong parameters\n      body: |-\n        If the function lacks a message or a title, the following error is\n        thrown:\n        Error: Could not call remote function ``.\n        Check that the function signature is correct.\n        Underlying error: Error processing argument at index 0,\n        conversion failure from undefined\n    - hash: ac3dc07a2679124330b0781ad8ce2599529e56ff\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io-modules/etcher-latest-version\n        fixes: https://github.com/resin-io/etcher/issues/255\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n      subject: Upgrade drivelist to v2.0.13\n      body: |-\n        This version contains the following changes:\n        - Detect Macbook SDCard readers in OS X.\n        - Detect removable drives better in Windows.\n        - Keep one decimal in Windows drive size.\n    - hash: 8644bd45fa02ceb2f64f48c13e678d472d04e651\n      author: Juan Cruz Viotti\n      footers:\n        changelog-type: patch\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n      subject: Make clear that Etcher supports OS X >= 10.9\n      body: >-\n        Electron no longer supports 10.8.\n\n        See\n        http://electron.atom.io/docs/v0.37.5/tutorial/supported-platforms/#os-x\n    - hash: 097c9a4aa37029154c3efe8564edbeef048926ad\n      author: Juan Cruz Viotti\n      subject: Add subtle hover styling to footer links\n      body: null\n      footers:\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/253\n    - hash: f9a80f6810afa2f74e96e487f389883bfe839326\n      author: Juan Cruz Viotti\n      footers:\n        changelog-entry: Show friendly drive name instead of device name.\n        closes: https://github.com/resin-io/etcher/issues/1170\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/254\n      subject: Detect removal of selected drive\n      body: |-\n        Suppose you plug a device, select it in Etcher, but then eject it from\n        your computer. Etcher will keep the selection thinking the drive is\n        still there.\n        With this PR, the selected drive, if any, is ensured its still inside\n        the array of available drives, otherwise the selected is cleared.\n    - hash: fd290b3a0026193d5486cdca5e0b93d82063adc6\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io/etcher/issues/325\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n        fixes: https://github.com/resin-io/etcher/issues/257\n      subject: Fix window contents pushed below when a modal is open\n      body: |-\n        UI Bootstrap adds the `.modal-open` class to the `<body>`\n        element and sets its right padding to the width of the\n        window, causing the window content to overflow and get\n        pushed to the bottom.\n        The `!important` flag is needed since UI Bootstrap inlines\n        the styles programatically to the element.\n    - hash: 64393ef073131a26a9cf3647aff4cb3a50287ac5\n      author: Juan Cruz Viotti\n      footers:\n        see: https://github.com/resin-io/etcher/pull/1168\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n      subject: Watch sass files in modules/\n      body: null\n    - hash: ee445e5d04f19c0391cb936c388c909c93d416dd\n      author: Juan Cruz Viotti\n      footers:\n        fixes: http://github.com/resin-io/etcher/issues/357\n        signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>\n      subject: Display image CRC32 checksum on success\n      body: null\n    - hash: a4458fdd8718af2a9ee89bc5a2e5e326f91d6bbd\n      author: Alexandros Marinos\n      subject: make inbound links from the etcher app traceable in resin's analytics\n      body: null\n    - hash: 8c05724796bcac26e24134515a6b85d169fe9873\n    - hash: 76c42b1a78c399ada93873a08d8d8ebcb0c8984d\n    - hash: f250a9c3f7b255de255d6a79a7417ed68ba15b12\n    - hash: 909c5e7fd5d9ea29f90ce9383da99ac8892076a1\n    - hash: ff25b01c38e3b36af78ca84d3d962eee818ee197\n    - hash: 860d2a7bc6c251f6579dff66c23c4f6415adfb90\n    - hash: 7da8438d7dae68986258d1a5e66325fa16746664\n    - hash: c30eb8f43582c45a5d299f38202b05af9a432be0\n    - hash: 989303b2d3c223dbed713938126c311ff4735d9d\n    - hash: 97e9c5f22b07490bde4735197a83032193de81d5\n    - hash: d0f1cd03642cfdee021477cde3297d10b1615b11\n    - hash: c409512268938c9b4a388155ab1b779498c59adb\n    - hash: fd9b227ae040de3f5a49263baddd5aaef5000770\n    - hash: 92084980a96c44d0e091305afa5ea3191afd858b\n    - hash: 35355ecad923d0ffab5e48efed74ae51cf9b3ad8\n    - hash: 7694baf95608cb506419c67f051b5659b3209709\n    - hash: 08e98c7d025449453ce924ba543926985f0fb27c\n    - hash: 8f3b78cb87ceab0429b035ccf0ed81a7745d8808\n    - hash: ec02d2e9606f8bf250e4a1924c5e8fef01f6e056\n    - hash: 5875afea1a5448d1ff39d5590c494f5074fb5b37\n    - hash: 37cd2f1efe5fa147741829b572714141e04f6a68\n    - hash: 9532584bff1a82133cbe09d39d8ade6b09e5278f\n    - hash: 5fc075750001a826cf46370f605160d8055b8dbd\n    - hash: 5b8edbd3f3d1927b077c46b7ee3557dadffe3376\n    - hash: c8dc96946d21647b9a5d431164a0c2df97def272\n    - hash: 50c306d4634b701819254fdaca6d56e74fbee023\n    - hash: 4a84b3fc61567bb1fbc2ec7429fb353ce06c38f9\n    - hash: b83009e72753a71e93983aceaaa966157e9389d7\n    - hash: 9898bfb4f4a4de29363b7c4b465dd854341a4bd8\n    - hash: 15a848f1bae06ac75125d0ba6fef13bc8dbd14a5\n    - hash: 4261e702f245ef1dfb0b70939293b49ccaebcd15\n    - hash: 8700c4c49a746190b5dc9016222e6f3fda04c234\n    - hash: e14563ebdfd0ecb4f480d728ff2724421924a13e\n    - hash: 77f53a6bfdd02cc6ca6da05bcd130383c4af1d28\n    - hash: d5e3d487894e8892b70acf27eadf313e47063196\n    - hash: 4d15f393ca86638ac7d8c4485808345af27ebde1\n    - hash: a58b756513f8b6e8aea5f60197e95ee3d0789c5c\n    - hash: 497f3620c9147ee4f47b1540e92e6d2e2a7fea39\n    - hash: 957324736d65aa674adf4c95d8d183b0574e1c28\n    - hash: c4185799ffcb6f1d36eab397e4dd7365d605d81d\n    - hash: 76b3511de959d32e19a94a98d44efd4cc905f2c0\n    - hash: 38af307610139b668599de42cdd8955c702be4a8\n    - hash: 4fc2185b45bd71f39866a0640ac7b3b2f3022403\n    - hash: 7c2c169ec6a8712a15de1aa1221ef635ee8eeb20\n    - hash: 5ee2d5661f560bf1645c833eb185108b39919701\n    - hash: 3862ab918c02a1266d4291696c10b657244f187b\n    - hash: cdf66453991f6ec51cffe74e6d2296e3adcb97b3\n    - hash: c4053c1e538435a1b9a46c343fbee3e880106843\n    - hash: a0f1b051f60bbcfa774649a021b5c7a84c1a6232\n    - hash: 70e740cb08d8fed83cea7257829aa36374fa4cb5\n    - hash: d555c3dc19a9bffa42973213eb47c7863f00e08d\n    - hash: ad7975bb915bae333576022c8352e776de8f70a7\n    - hash: a5222646003217d1c50efb8141e2072cca720198\n    - hash: 5dfee99389862460c00de07b4fbc55bf14e146de\n    - hash: 5c20791ef2039ca60ddcb4cd7d219a6268cf95b8\n    - hash: e6527de9745fa095216c207b20af511196918562\n    - hash: 0cc729b3ca0ff70fa9694a30f6904bffe7ecbb60\n    - hash: 695b40d2b2e491e0b98047e80877b711b5b2216e\n    - hash: 3b46d7f4aa78476325d0210a674c9260ca74f520\n    - hash: c84a218ce6b54993b58ddf90e076af47a7637b9b\n    - hash: a6eea5c690241b8a222fc989b4b08f9f5ec33192\n    - hash: ec8a47994ec4c64889f30502b8723faace48c11f\n    - hash: a6e80ab79a6a60845e7d93373dd7541732cc7c1d\n    - hash: 54f36b7a3d0578e1dc3aacabcc8f7ffba8f51130\n    - hash: 2cfcf5b014038506a3c739e6fdc82ad2cc12c59a\n    - hash: 6de624ee72124ad70dc4d9870842fbace07fbd29\n    - hash: e3a4bd2e2f459107e82f3656a3c6e6e6675fd2f4\n    - hash: 701d38fb38eb0c111376fd46149bbfd27b15bb07\n    - hash: 1026b1506bcd7c26d07974d04dd11d39dbba853b\n    - hash: 8527eb6eecec2c6723e33233d9272f4d4c79d690\n    - hash: ff0f9ee583d64806a04d2fa4e981c0f9d3588362\n    - hash: f974bf57828b4127225d69615de62a93845038aa\n    - hash: 7dd71e35238812ccee19c75baeb68cdcdb4f9d28\n    - hash: 6c82ebe0c8437afe148bb27be22d6dc9949abea8\n    - hash: 46de24ff0c914b144b54129eca94285a39ac9580\n    - hash: 0c9417c6b31108df4f4170ffa907e03c2829e3be\n    - hash: 29de0cda9a090a049ed05eff36b8bd9c85ede2da\n    - hash: 50c706dcbe69cdaf2457cd27c9c4e42bc2c84c0c\n    - hash: 33d5a544382b89002b0b454941ffead6c247fddc\n    - hash: cc215c6307afe2f3441f764379a15eeaa8634303\n    - hash: 659ce3863e14a65c9730a21392f87922a2a2ecb1\n    - hash: 7b36a96525dc6892d645c6b6e0108aa4623c1f3b\n    - hash: 41c993bba5de5d5122559c5958a397a71c28364f\n    - hash: e4a1f6314c1b6ce41d81029849a1889e8ac87393\n    - hash: b9a211365a24adcd34ef414eaf39e43c6bd1c8b9\n    - hash: 4d5f99bf351f79a33aadebf43625ea523f4b16d1\n    - hash: c78b25daac6057985d647b10bde46144c52901ed\n    - hash: e5497367eb5899684e4d920dc8d19d876d92350a\n    - hash: 0e692e208dc6a4154436f2c6cf8c1cf1c629b1a4\n    - hash: 96b4c97ca7f7b877f1e8948f70aab864c03804ab\n    - hash: 03d54fabd69e050bdf699087cf351ab9440f3f93\n    - hash: 163f69faba4902d4c8a0bd4edb216b895027fb1f\n    - hash: 4d0a3c8f3ccfdedbf2acc4e2da5c6455bdf92fa5\n    - hash: f0a81206f02a71d63fe3bb968ec376330c8cd3e2\n    - hash: 093762427923b8d198ed9b797dfa0182b370ad3a\n    - hash: df13fa6499dc282fa5efd007f3a0851a387a7baf\n    - hash: 3604fab4c58108d730a3201de88675fca465093a\n    - hash: c391f660f61c1ee2ca42ef6826e5940f810f25cc\n    - hash: 66030b43a83eac1c260b9a79dad1454e7abf091d\n    - hash: 205b8ed21ae9504f991f4ab0fa2dad3babe240b6\n    - hash: d5e8f5617c11cf8bf8be2a80227733474dfa85d3\n    - hash: 7670b9e7d6f2cb743dfa25b74e01f899fcdd70d8\n    - hash: a1484bb1a6b7be386c58c20bd81578b3437138d5\n    - hash: 96c5ee67d6f0b1df43e6ddb7d5466f660f2e981e\n    - hash: 720aaa55f69883ad0a343ac113a1a36db0cd8b0f\n    - hash: c2d74f5ac18785d693fcaf4a38e5ebffa0800faf\n    - hash: 2450f216b660125547454a8e0aa371417c3c760f\n    - hash: 49d454668072f1b3482fec021bba3012168a06de\n    - hash: 5249533c5c52dd2020836b13b4b64cd57c08cc57\n    - hash: d4b245562c6420d957d5f7823909c3c44aa98543\n    - hash: 06215ad6e1d1a4b7f71fdcc7d61306389248b5e3\n    - hash: 84368b3d00b3315543ecdda0212158437de75a98\n    - hash: 95ee174f84efdaad366a5074699cfd0c98172bd1\n    - hash: 95fc169699427c9a0b83c934ffea109ffd75068d\n    - hash: 809e91664bd669bbd4c441b60f6c17a30cd65463\n    - hash: f0d091cf90ab5756afade1822d1e933b78a8479f\n    - hash: 26802ccdee5933a74789e60ae1ee68e17692b6d9\n    - hash: 42d4386ab698d4fdfb71fc7398ce55e564dd09df\n    - hash: 8818183e4ee1af05f7612bccfdbcbfa720f0c17d\n    - hash: 8fb45c5fc83a60fd654985bdf3e68719d58877c9\n    - hash: ad739c66d764c11f5cfacdbc547e8d9974b1623d\n    - hash: bd9c7e2e73dfa0ed5120bcfb92f342b37ca9f493\n    - hash: 93a32cd13165953e142f2520e1b8744301cfc659\n    - hash: ad79dbf50ffd019b4f86eee6c62cbf6c52c90210\n    - hash: c3ab93288d2e0b2cf2afa63f0bc016843c0c77a5\n    - hash: ad697055e0bc82ae4f3c7858dfd4a182517ac28b\n    - hash: 87252f7373cbd2a54a17f1acb620183f81fad8e1\n    - hash: 418d9574213a04c438c588b7294f0744bdb397fa\n    - hash: 55ec44519db65e7496a3896a3b2dcf75d30e5c1a\n    - hash: 3fbfcdb953b86a6a76413da18997ce83380a485a\n    - hash: 2747ea430f65a867e868f9b80691690fbdbb8131\n    - hash: 7ac5543d03080d82edca501f11ccd0097c1711d0\n    - hash: ddc5b009be623c439e460b85096c8d224c1f5738\n    - hash: 63f2abb4bf55fa3aba0622879e0b6db9bd41cd4e\n    - hash: d8550f6d5d96dfed853d82d42ccdc91b75a51a52\n    - hash: e1c8f60229497bd988beb64f02440b15ea82b503\n    - hash: 0e83e51de5f3e1d6c6262074da6dd2e6c67c2f7c\n    - hash: 3dff8cdfb154cb809a86116f46e4c1cee54c0074\n    - hash: e7c191484a1ead0f4408f63fb7e99516261d4f39\n    - hash: a16c9eeccf47df02707157c3e13b4218eb30d41c\n    - hash: 04137e7b8c1ecf73b046493f3ecbc414a37f7b4f\n    - hash: 64cc585d027aa1c60e2aaa44aa5d8ff689093ca9\n    - hash: 1c33483cd205d4cf162d693c8b30abe4371602d0\n    - hash: b6b252a79c9ed562e288955dbc1feafe2100914a\n    - hash: ee2072c75a8306b0581e0505884fb7b42e4c364c\n    - hash: b6cef2a99632af9350f596d8e8ff001600062e5f\n    - hash: fc4fa98f93e9f1aca78d68659c87edfdfe8c8161\n    - hash: 38dc5d232b1f72b4d6f93ed341e2c42fc6e82119\n    - hash: 3bfbf6c122ab25ef88b50b9d5f6d54b6e18256e5\n    - hash: a076e0264debf5ff6360820cb117d27222f6fdf4\n    - hash: dffcf5e7df5bbe3096d57866a80cd1931aec9aec\n    - hash: 1022b5dbaccf97fc0b8d8c03a5a815a3c9214bf0\n    - hash: 3d9a2a972bd5872de3d44800c96cde7860e585d3\n    - hash: 8c3a2af5b60d89e5fbf28cabbd47160641855451\n    - hash: 085aeca2c2e8e1f60eab3364b952c1d54faab3ac\n    - hash: d7fcd57d6504bfe0d7160af0718d66944f3a7dbf\n    - hash: 4cb78bc2624a380bcd411ca8ac0ec860d3e388ad\n    - hash: be5e2d9bba6da25cf6e7e96ce18af5f27621e023\n    - hash: e6eaa797a318020a0e2d767efba97ccbaae904c4\n    - hash: b5ba4ec202b9ab4fba9ccbb3e25e89ea62e54396\n    - hash: fac0abad5d1fa0ec3ecef44621ef82f870e9693d\n    - hash: ed6d1f87e07da2c5064ea16447eb20da4d421e8a\n    - hash: 1a7b9a18ff578371812eddb77f2e5764709a2b7d\n    - hash: 32ced56abcf520446e65eb16f50b65355b5f9ffe\n    - hash: e0183a7fe9266ea8b56b06ad4ed4fe32f605c159\n    - hash: cff916a27ef70ba7ad64a94bc533bdf999f508b9\n    - hash: 99cecf8bf504990e977e5344772cbc8c2e58c191\n    - hash: 492e7714df10d443dbdebd447ff49af6131e69e4\n    - hash: 17c71db80223ed2f657744ad899732163e9adf28\n    - hash: c71ace85ea048063ca3574096b51e23f0e229550\n    - hash: 94a134516740e2ef165ea07cad92ecc76760c646\n    - hash: 5a883addb45c97079b3b29fe395293c35d08aa6b\n    - hash: 9e2fa1db20ec79f9ff4f978b3e38ba4caef2d146\n    - hash: 3449980f78e855e17dc1e9ca31d8d93753b797c9\n    - hash: 4a345d5583372ccaf662a0d78184c0d17402ec95\n    - hash: ec15081c7169c4e846cc903a8142f945bcfcdf56\n    - hash: e79611712defd827df31b1b604a7cd505e2af966\n    - hash: b3a2ba81668bb7146594b5c1e711780a7210ee8f\n    - hash: ebdc4287a8eaf7533efbd28a8b849ea7684db5f4\n    - hash: 5c388e74184ec44ab8fde6a50e08415bdcec1ce9\n    - hash: 5a625914b5eed85e9d4ab8073e4eea4b4aced914\n    - hash: 22863298fb77f69a7727b17dc768739a1168b710\n    - hash: f2d2254a5b208efbcf3c7e21210dee80b69e0d86\n    - hash: 7759e88d959828fa2e16c722a0a1bbf670fe109a\n    - hash: 9b43142e792e834e4d1574e7d0fe5e304cbdf869\n    - hash: 843cfaba85ae9d3ba63e6de96bea5273d1712b95\n    - hash: 4404f8bac26a345520cea296920c55e77a4c95f6\n    - hash: beb5fed59c03b8ccbcd264b63d360b0c62a81f59\n    - hash: 44e641108a29eb2d30570376e890ca4f3f7596cb\n    - hash: 1fc6fc0939d64db83567e1bf6073de7a9cf2813e\n    - hash: c97a4e3c86f1a6bd6ca7f9acafa6eba4357514b5\n    - hash: 3fc75c885b6026af13586cee2fe552ea7216fa9c\n    - hash: 388c6d0d94fdd258838ab8babbb8f7abd9c9bce0\n    - hash: 7139a516c9633d1f68929070676c5e788f550ead\n    - hash: 032d66aaab69c8259e340082fc1b9eb27e19a79d\n    - hash: 204216f575d995fda05e1a0ba9ea7af033a75bee\n    - hash: 1e757096efc7f93368705e4aa96e7c07e786bd50\n    - hash: d0fbda582a7970d5d3cc55cf0bb79831b5aac693\n    - hash: 021ec42ce08b23227abcf8037fe38521029c85f0\n    - hash: 02ccaeca4b8aca43c57745e2acb5e406a32b61ca\n    - hash: 85903d5776f3762f0dbbce22ffd3504f37726d2e\n    - hash: 83f243b32c7b9fcb9a699bc9cefd6c5a744d9673\n    - hash: a9547ad5715d83b27410eca270e443efceb3255f\n    - hash: e1b13580d55f64022750d76a08ffda3015554bf2\n    - hash: 7af77fa08851d8f3c69c2ee04e804a5eafb3ffa3\n    - hash: bd23cf7f0514d798f1407877636015605130b79e\n    - hash: 3aeeeb069a09e49a62d0526a76bbf5839435dbf6\n    - hash: 234f9905656e330b4460d40b17f6388ff6778da4\n    - hash: 43991938e6dd3a5d113337739d2d9456535208f3\n    - hash: fbd06c832f9c2db32f040a132b4f42ba95f07027\n    - hash: 2636d3bda692446d8b9c5a218b5476be18cbd371\n    - hash: 821780de9aebd2e2944377ca81e649b7a621f1bd\n    - hash: 0d1ffc6621a8c8c51d1ca2e77484916ffff6c9b2\n    - hash: acb312f2027c52ccfa6e11855eb03f577ffbc717\n    - hash: beb369c09d6265625c59207d78ea72d5e1b2459d\n    - hash: be48b96def73a3cfa6aa62f197de18dab2470be5\n    - hash: 85befa43e1e10da992676f3c8d77d4a1a2506382\n    - hash: e2c35fa2312884dd3bbe18772e760623d604a01b\n    - hash: 9313e3c293c9fa6205e6d04d121efd961299883d\n    - hash: 951b38e1819b109a57c1ac02711f9bb0a415785a\n    - hash: 9f76160bc4258b563d5c26aa90222aefe73ebda5\n    - hash: dbdcff19ae43433164f1225a5a619645df96d12e\n    - hash: e80f5a128990319b89db55febc5c86b38b7519fa\n    - hash: 5668704b812f4da0014a2733a96b9deade32c5df\n    - hash: 3d7101680aa4cb2de17fd85d7f90fd2f670b6159\n    - hash: c8c47576747a3ef354cccd92a6d831a387d2e404\n    - hash: 502c03c5cda34eb4f3f997030139cf97b78f6061\n    - hash: 8bacfbc99dc254d3beedccd941cf2c78d1bbe4e8\n    - hash: 52ffe29e1ef530659431fe6593e0698c5e3a94b1\n    - hash: 3a2614397cd1ac2d3a1f5d997f8e18df76174545\n    - hash: eff0cbed7447afed17086cebdadeaed1def0c492\n    - hash: 9074216b59ab3da7ddc8e7e4864429ee80fc21cc\n    - hash: 4329af46c64d659ceb4827ceda4a93e52053f3a5\n    - hash: 2f8f9a66af9e7609ee2be3faaa0e68d98a9e93d3\n    - hash: 7a2578b704e69b30cf761dafaeff17460e161fbc\n    - hash: b9be09ee70a7e7212df3e01870e1a5696170cacb\n    - hash: ac10160fe96beb1140a166a45971e4fec59deb81\n    - hash: 162774127ce1dafcf39827927467627e86cae943\n    - hash: b0a0c620e14fd01bbc21017599d90d10815a35bd\n    - hash: e4c117921f3871989e7eb852ae7b058e7da9a15e\n    - hash: fba6a1b674e67599a7927b838e53b63126b2cded\n    - hash: 1651982ed268404cdae62cfc49c4278b1a3b6a47\n    - hash: 89c95e61ab4d1d0ac5ee30080a2627c3a5c54d72\n    - hash: 0a5b5fd1cc1bc599b5a244460dde852ad2679a6b\n    - hash: 8612b559671a503839024750189170f63d9ac282\n    - hash: 681a73b6a76f23e162341795b5f30bb89edc92e1\n    - hash: 014b4201c3df8e81751a6bf7ed9bdada61924520\n    - hash: 77000979a9caed190ff722292085dfd6792c5d25\n    - hash: 6e93aea54c877fb4f1afd8a8931201856b75358f\n    - hash: 490637f99bdb61fd73406134ea35e1ef61feac4e\n    - hash: 37e863870e49584aaa450614db424c06097a902c\n    - hash: d14e9ed7f8fee826762bc2fea79f0a5db698d5d9\n    - hash: de32cd108f7bfdba0e47aaa2a22e92524cd6cb22\n    - hash: e10afd745dd4ffca5219eb38f889bdb10955532a\n    - hash: 4c77f82d8277b19b5eb53fe19e7728885a5ebde1\n    - hash: 88cb4829be78df7689ee52233bc2a151d49a3036\n    - hash: 2612ad25852ffc4a97432ab53891b066e4be2d28\n    - hash: 8530d70c27e8618f27d94231851b78da7087ff41\n    - hash: 2a38d57b56188e567e5c049acf1283cf3874a3b9\n    - hash: a45a37c744181a2133427cdc8297d23774caa954\n    - hash: c13a0f3df3825a714954c1bab8706586c555c7e4\n    - hash: ca0a6ccb053129fe4f35b34adfb85f84c9f6f9d2\n    - hash: f0d7baa68ee6dc956e6f668831bfe6785caa196f\n    - hash: bbd285863b96fd33d9a21deb44851c5bf6475591\n    - hash: 5f60de9cb319e0e80e6f4e9efe057a9faf50884a\n    - hash: 07517dae496aeb9175fe7149daa8cc03cdb54e85\n    - hash: 501be12cc1b2de6937792054e9dca838882f01e4\n    - hash: 881ca9550791fdfbd93e29914e8a43388c144967\n    - hash: ffaa6527b20e5b1812be07c393e6b7d124675828\n    - hash: 38ca6001b9b07a18bc5dc7cb311c8aecbe1abe30\n    - hash: 62ce1f503f41675f91fd25ed20e916310d867e3c\n    - hash: 7afdeeb25a4f89ce3374e54640caf671bd36a2e0\n    - hash: 9f99e463e55c611eb505c11be7c5bb1ea6adafa6\n    - hash: 57d60143276a622b3c91d62d0a29bc22ee01bd48\n    - hash: 83144d2393bbd432006d546c85428e80d9395d80\n    - hash: bde99d0b96040fbeba46f4432dde8edfb31e6932\n    - hash: 4e75156e674ae23ff364e4709521851563e73066\n    - hash: 27fc95a375abe2b06acf4595005395609551dbe3\n    - hash: 513ca03d165ca6b88642792f14f4bc1dbd6ea1ed\n    - hash: e9c12f5336e24c40617b3d2a820876646fdc2c0b\n    - hash: f01547cf6db75d749d491215e8e95b10c21bf6ae\n    - hash: 446b9c4d8a3013f3aa3308052417f74b7c069cb5\n    - hash: a32f105ebb278e4faa6444f42cf4e4a9b7264eea\n    - hash: e2882c8117d0f5242b6550ffc4f732b8162bce5e\n    - hash: 9a364658e63233f012a0187e3b1e2db9a2f18d48\n    - hash: b7841f23eff85fcd69afdab95c4f15ed10a96236\n    - hash: ab30e1a8a71f4c9f6dbd1dcb6dccb97b1eb545e3\n    - hash: 99c4e816cf6d999568ff48e9fa8498bb1263051a\n    - hash: e991c39d4bd49b9e3944a0da27375b8e9bdeb02a\n    - hash: 3b8a44b0c8d338bbb72b63aa0fe884db1cd73f75\n    - hash: 9b3977fb24e43d12262b1e68437b2a4b2d608b8b\n    - hash: 6c9e8ab692139b76f5bf5c8443b033b45e676b86\n    - hash: 433eda5413d977b0ace04421e0036f2c8b547a2d\n    - hash: 6896a0af7d36810775d198a4f88e6bec417d975f\n    - hash: af9b8d6cc5054b09b1b748b7bed08da48855e90b\n    - hash: 03ffac9424680ec631eb474662446704a8463659\n    - hash: 02dce4b79508dbb17a0a1ffd2ed6b843d35c1d82\n    - hash: a1e08ccab1440cc4031a72d3a3333b6da4e8c62a\n    - hash: 553eb009592d2a576f1b3b24242d4a1e0051bd5f\n    - hash: 7625278b054fba5b779f2aea0e9d67bf050b1151\n    - hash: e9c2712c02898fccc6f977e28ea1dda47eb0f967\n    - hash: e1cdbdfce13b0ab849a407363cabbefc4043e2a9\n    - hash: 15593a0169d3731c1c2b7fc3be0f3379672f933e\n    - hash: a53880888cf56e96c8c61c05751bd9a94f9abaf9\n    - hash: 1d9a43d1c46f8c6714bedafa9ff2800b13d201e2\n    - hash: 503196da941ba0a672a6267b8e1fba9dd922ba5b\n    - hash: c1ddc4635e96ac7b6ecaaf465897004114b51db5\n    - hash: 66f5a01ee078e0878126399b7ec607ca20b4ec96\n    - hash: 5782e19d7a7d7f762d7f3b14697173ce820db027\n    - hash: 39054097001ebf902eab13eb2a8dfd1cb9318ff4\n    - hash: 63bc130b1d6daf2bcba6c4449b3ec65d386eab0b\n    - hash: 16794b4c64132069e62e2e480587a592e70de20c\n    - hash: c5168b2197b635dec1c29e97967087f22fc1155f\n    - hash: d3a1a7f6f5ade5757a316b3d6f2c2b0dcf9eab3e\n    - hash: bcdc71fd04570154b32467869cf96ed2fdb31aa2\n    - hash: 341b936dc2509cd9a402d900c4e53388fd8ef767\n    - hash: 87ef056be8a2b943c93425f6fe4da62aabb30ae9\n    - hash: 4acc7989b62ff5fc7da0d9f2d117d434b214ef01\n    - hash: a9c37583c783c529e1fb3af8e320c3295215be95\n    - hash: 36536eed41c2613aa5ee6e2859c7c6fbccb19ee2\n    - hash: a8593643fcd94e0c1b5f25fb0a1e227d97a5aab4\n    - hash: 18536702575e99d1ffb916ae698a92733e6593d1\n    - hash: 0fa9a221d3800c864dc26e0489e4e54efe4d7ba2\n    - hash: 5d57ba25905f53405370a5330c76db28a207f1cf\n    - hash: 16df8e47df98c110ff3c6e09d88c5bd175122afe\n    - hash: 481e9527ecfec745e14b59158d14bf39eeef56e7\n    - hash: dda62cea16b35c50c5a9c52523406b7e2286a6de\n    - hash: 2fa814e39041a704aea3998cddf933e1416837d9\n    - hash: b8a6108d860faa9f25e796562f2d442367ec53db\n    - hash: 6b63068ff07005b55dd2bc87decef62262c071b6\n    - hash: 5004dd16761b96917c483fcb34c24825ec2b44d6\n    - hash: 53f5a99f47b66c2eaade200a4ffb96ecfe66e0b2\n    - hash: 640586f30a8dca5748192619312225052394df8d\n    - hash: b1355e6539fe37f7fdd905ca25c00a1429cb1241\n    - hash: 2e6530693e4be67afa5c86c7783352efd4038de4\n    - hash: 99fc39718a5f4435a4407c20718480a726e04a2a\n    - hash: 57a81f9c5330d81876390e9b388f35d7d5a79c8f\n    - hash: f67123f13e9573afe3c0cedb13051a7131db9dab\n    - hash: 13e4e41d19292fffdb0e4125615126891a760527\n    - hash: 2564aa6dc96c49badbfa42b4197d6180539a0765\n    - hash: 2bdb243bf5c8982df5bf415ab9828b12863f5784\n    - hash: 0812dc8fcd0389ea3e82ef369a60d8e6663395bd\n    - hash: 20b3aed89b07003a39a574cf42dd29be907a5173\n    - hash: 0c23d9c824a2056d39e32975ff5aaa90606ea7c1\n    - hash: 29879674796e1825d447e43c61a8ad98105a3e1b\n    - hash: 2e0e65ecb27316501844e03e651f85d597794cfb\n    - hash: 54c0559f58950cc3b26a1e317f36d743fb662662\n    - hash: 682708508c7bd47a16480a76e49e6c7fdd3f918d\n    - hash: 9980c3e80932fbb5fa6c6c1cb6fef005aa86fd88\n    - hash: 3c485efd56d74860ea651d96492a5e8cb47cf9c2\n    - hash: 6ea8d92636392ebb10d8ecd0ba6e78ea81e33975\n    - hash: f3879f474fc93c2513c7b842e885e5c79418f7c6\n    - hash: ef0a5b1d3671b572447d3ad572c9ea02217f9cb3\n    - hash: cd9a23e300d6fcc28591a48f6f86bc3f7f53bdab\n    - hash: eff832d60ecb21c6d57e5009a8a06f05db53d18b\n    - hash: 8c75ff0c1983d8fdd026900f3d32e01aab799cee\n    - hash: f5c0d6915d94239adb4ee816e7a2793d14eb3061\n    - hash: ee2d368f526572e0d0948e68815b8d8945bc5e92\n    - hash: 6e44b8b3c3b4260ac431f61b13e879b5c0123a03\n    - hash: e09a9e569dd44e9a7c6a5d2a8523d67c945ccb5c\n    - hash: 9b0bb6abfaabced54732f340710750f65c1a172b\n    - hash: e7d4e1947f3ecf241b93dd380f6fe14ee645abdb\n    - hash: 9a9499fc123538ae15ce815efeb526d2d07e2bfc\n    - hash: 68a60d04da5d4fc3023327eabc782b4499c86c3f\n    - hash: f5f2894c91f599e4a0afbda1dfedb15ff653d2cb\n    - hash: 41852d4e313974a2626df513ad9ba2d1aa4384b4\n    - hash: deab97d3ac096f21bcf33a483623cfaf311afc9f\n    - hash: a0ce84ce72f0184d2e4e51bf635de0b6bfac7dbe\n    - hash: 9b37c011951d4835f2a3a605f185298a35958df5\n    - hash: 438df6d28011650e24f9da45c48b1f49e0443361\n    - hash: c54c4bb86014ee25929d4d61dbd104dd92768ac4\n    - hash: 881cd8d879c1eb5ebadb94221873f076092980ae\n    - hash: d5a17669e1790b1883ded87243beda9d036db58e\n    - hash: b1e4662ea07aadbb1fa2f0d109d5e5aee8dab789\n    - hash: 6b6c5ca00f850d277b283374bf0080c775f02c96\n    - hash: e54bde2ec16aecb7b8020c56ad87b7d578716af5\n    - hash: 9bf10dcfdfeb721e26c4698b6d2a248e4394d7ff\n    - hash: b10cf28b0423377005cb5fc3b90e51993ed61e56\n    - hash: 287271445e58b0ee2ab670858aff3c6ccc9d8b54\n    - hash: 3b01d236a9a3bf6b05327b9e4b7f0ad4402f6db4\n    - hash: 99892fe66865bbe2e93dbd69a696b5d7ad9681dd\n    - hash: 46cfd2c199d2ebe26bcf2ace868e6590024daf30\n    - hash: d9c1fd1ca64a1d279ad88edb2a6d0062721f3970\n    - hash: 38a6de5e8cf3a2465a3bea267ff28240579a43fc\n    - hash: a24c44644b0e4f3e75da97f1aeaa73adcb24ef7c\n    - hash: daeda1e23f42169b38df9b394da5e056165987b3\n    - hash: b371c371f8de277e701a5ea83b16cc7c6a86c158\n    - hash: a670d36b76db9d12c130ab13f2609b6814962eff\n    - hash: 19963d3011d3e580b17cb4db605658004b48e01a\n    - hash: f10b22cc21212ea9dac40fc689e97eafd0f068d4\n    - hash: 3f9fe0f245fa1a195b0ec43a0ea4ef829d304d87\n    - hash: 915206e108235c15a5e8cd7115ce2cc902414cfe\n    - hash: ff9650245e3182c0747deac8b29b27d02bdab324\n    - hash: ce259b499d377c019aa5e9a0fdbf7252dca7565b\n    - hash: 4c8a58deb06e11aab2e5a2ba543a50d2b88116fd\n    - hash: b55befe2d69b2a17ada87b98c3a84259d31ac3fe\n    - hash: 78d614845b14caf57a127c695bee09ce461b1641\n    - hash: 2380729e0cfde7840081be98da6da5d1759f6264\n    - hash: 72c6163173e5a3d07dc464963fae2afc29cd2e0e\n    - hash: 29470f7b8e6c9ac71572a0334cbc92506e7ed46b\n    - hash: c33eba1ec19f782097918875a5534cca0c483007\n    - hash: c729e2716305fb0958cb892008ef32c77639d51a\n    - hash: 42ec7ed3d767fc7d5a4468bd8874cde88f41b2c6\n    - hash: 1f154feeacbf95c601cc833e65a1b301420e6fe4\n    - hash: fa7966875f028d6f62453017c737863067abe1dc\n    - hash: 20867f6f1ce809494772e14f75a7d9d3ababd1ea\n    - hash: a6351e9164412aaad0089d592f83d90151462db6\n    - hash: 4826e169ab107939378ae6cb2b9f3c6d1ae82a1e\n    - hash: 98024e5afc99ac2fc62031fead372ab06c3f1c56\n    - hash: f29f45ca168c8363741c8f8e04ba48679f4fa200\n    - hash: b4852dce9941e575ee3f6783a97ae948f3c1d93d\n    - hash: 588d9305a8467d7ac5c0098c5254b85a94ccc607\n    - hash: e4facb657cb37d24b5ffb2af6b7a29e8a2df7961\n    - hash: 1f6311d514690252116b3e1114ccd9b2bbaac66a\n    - hash: c868253d90a9f128af459f2bf1b01cd02346c53c\n    - hash: 01e00cde1daadf437fe659bbe806bcb9e39c59d4\n    - hash: 3d311bb28d6718ca0b7e2fe169eeac5e4a1c4101\n    - hash: 952dee60fd2dff1c574d4d4dc566361d814471a9\n    - hash: 72d7b8fe0a5927e55fe1b3d6cf55a3b98d9c88fd\n    - hash: 239e45bdb914a0d55a6a371718f007d73b0a2b82\n    - hash: 208d125a6eec5e803634af382bd553075f01d13b\n    - hash: f51846bc72720c0c1a06a5f8e49c2a66dffe194d\n    - hash: 78061dfe5aae80954ff0484a7ba350af3ed6c923\n    - hash: a53495f3217e2fece6f4e7b161317c7d854c52ea\n    - hash: 28f7e006ec1a87f00d2deb14e89a1f7566037536\n    - hash: f3cced2f867f9c13886f4a44e77e0f2edd96269b\n    - hash: 9e7c34ee8f3a965295385c67357d742863d4f3e7\n    - hash: 194d4b710acf379c0a22065c691cc7169850cc83\n    - hash: e6c785cd232c85559ef0b09bc723dab84054a66b\n    - hash: 9d21950ac968550dcad66e51d1cde0ac23c23d77\n    - hash: 8f8950e619c7eb7b95a50363680453f4b8102fb1\n    - hash: 8d9169809a4871ac5370d25737896c8cbdc160c9\n    - hash: 8ba3a7cd1eef0d355bcd1495f63fe70b77bb523b\n    - hash: 9c299948adf1a33ee260b47cf0b1d7fc076070b0\n    - hash: 940ab1195279eef16c89fc9048f14ebbade73abb\n    - hash: 1cfd3665ee98659b01e20b2bc9a6d9ac548b1633\n    - hash: 84602346f5c0b8c14d8bd8f8094909d5346c46e9\n    - hash: b9606f3e2d83f94ccdc0045d157fcf446837c03a\n    - hash: 26b3ff9673e56912f3a2d40e827138c157cc2a81\n    - hash: 6d9e90a5eaf2b03dcf03d47f4e4499b557fe8985\n    - hash: 50a555d5b0530e4c71f5d23881227b36883fad29\n    - hash: e68303e051df6f247e2a66fc69ae330183693b0d\n    - hash: 970d3d1bbb1774a39603e4b09762e22b54b0b75e\n    - hash: cdcb0a425181b9272c14b03a89bdbce9471216ad\n    - hash: a6027322d5b6c680e61961813d0d95b84de33406\n    - hash: 1957d9bef9df5c69442bb9dabd5e7ffef7b0b7ae\n    - hash: 2a4bf8f34bb9022db7babf3c9d9193aecf722c64\n    - hash: 9faf8bc05f8703f053d1f6b729ca63a2b68f9198\n    - hash: a36bd194f853a7e3d8897faba7996397dd89aff8\n    - hash: 29e788167916463e8f673426a29896562cdd9022\n    - hash: 2b404d0267ad5175b2c10128308c339a8565e104\n    - hash: afa74290385992521e7d3c09e732b3633e29b4ce\n    - hash: 2dafbf1c56cfa65c2e7b489643e42b7de4e1f522\n    - hash: 1b8a5c1017a31786d579c9345bfd0ec18fea63a3\n    - hash: bb586216ea6cfd0ca1ae8f47f90115b0614a1a12\n    - hash: eafb8465b0a6a67c2a89eb50290aed453471c52a\n    - hash: 16d7eb00dc5444a8cf0bc009e965de7cdb34c78a\n    - hash: fcc106996141824f08f8d9d4eb05ce71869a1031\n    - hash: 8273ad0513f387d74cdf8817aebb8627db8a7499\n    - hash: a61e92f296e0efe1948cae72dc1bdc88b279cf5a\n    - hash: 923e7bd2be8166dd143383826276609f99986470\n    - hash: 6755674bc231bba9d07adac0ad1ed871ec203a90\n    - hash: 7f03a8f3a936dabe0aae0cda1ba785fb0a5eeed9\n    - hash: 9658d371ecde0f5a062a1e6f2680e2a0bd1dbc80\n    - hash: c3d58085a332d5633f9dc6c7d716c780339515ff\n    - hash: 827b4a068d9df22c11e9700f83b2855d15609fb1\n    - hash: 14a7d638279d1013988a411336ec71b171e128bc\n    - hash: 7e7fe333de77e98ec0820c850938efbfd3c4b55b\n    - hash: 662aae1a77e215edacc7de1fa2dccf9dbe9e73f7\n    - hash: 0b3e6937dfb49d8d57ead1e885ef451e89ba2a44\n    - hash: e3a7cece7b850fa1b0a2860ab327efdae52ce5d1\n    - hash: e071365e9a3feda285b7cece6ad80f84167d357b\n    - hash: fd623581c73b854aa82ea3a5932e0838edff499a\n    - hash: cc4256986b669ab795a8ccc4c16ef75f17ab7b22\n    - hash: 66453459da84708a916d9f2d82ca90467a67b9ea\n    - hash: 5c8a80e6d57a720499196e02b3ee771daa84f80e\n    - hash: acb0de2ba89691f55e8817fd2fb66cad252d092a\n    - hash: 85c12ad43989c804c8ab5a008c256e6fa6c01654\n    - hash: 20bc1d4d101263b58dcf7ab68aecb39167af8a6d\n    - hash: 2567b5812066b0092cbf7fa7c693bf8f9503e378\n    - hash: d69efb8825311bddc63ca4019b7b4ec40a5e072c\n    - hash: 0f8136f29b5298aeec90f16387b716df0f24519e\n    - hash: 1e7304652df9c952d7bf2fa48831f26bbcc92de0\n    - hash: 2b7467b4e7fcfdce5f2d9aecdffd1f864bdab553\n    - hash: 934d287e7add0c27541441d5304c819e0a61ee6f\n    - hash: b2417702abc5ab5df870948a7d4217690cd73c24\n    - hash: 9682a14991596e44c69c508a55eeaf52a77a6d89\n    - hash: d56cc203e8ae4aaaa38a1da5e3a3aed59fee5de4\n    - hash: 7a93c24228987ba874e74b3f25f57b4befc375b8\n    - hash: 2fe5afd1fa4f455f4f834c610b48f56cb353d2e7\n    - hash: 3e684892ca482446bd401f72f244a27e9e9eac4c\n    - hash: 633be9a0f8e518d6cf82c9e1b6130e3dda960866\n    - hash: f642c3420b76f2c72814a86bc999c1f0199cc0ce\n    - hash: 72770a85b3fd557cd6f29c33d7cfb60f93aff2f4\n    - hash: 52c8befd111650fc69c5a54fe155d3d279b62e56\n    - hash: 8d40463c5b93665df82d1d332282ffd01f0ed9fb\n    - hash: 1c635671be8575bdb5629fc17faf3176e8dad044\n    - hash: ba1282b5e8325f0bb794ea8dea0e66cdcf39df14\n    - hash: 6a7495a031fa6822542990ef10ccddecccf4bb01\n    - hash: 277401705f60741fe6194ae0b559d42e6ebec8bd\n    - hash: e14ecc26567eae952c5c5d9aec4bcd2e7e25261c\n    - hash: 0c102336d574e892c06f7c8b776a8bdfd0b8d0f1\n    - hash: 9e712754d43c91cf695582b3842ca462c941e28e\n    - hash: 9d5347ac3b15b0241eef068f580a8fc7aa6b2467\n    - hash: 73891cdbb1004e1047cd4584b47b97bf9a97d3a4\n    - hash: fbe191e0bd21138bcb286a5980f437fda6f7e9df\n    - hash: c8a23da26d261d0f111f5598d7fb55ed91e4940b\n    - hash: 39ca6d6ed96abc99e6ec74ac0243ae9c217b4529\n    - hash: 1595dc5024ae21b114bdc5b12b81d93d8691e6cc\n    - hash: 3482682a5a226460f3da3c1c6100e79b617aa98d\n    - hash: 4f2574661c32f9557ee95ea6991afea850c0230a\n    - hash: be8445e6fbf47a93ead0b05d62c65022268808be\n    - hash: 6e6d215ab7614a74c1e0a30da64c16746cc8f70c\n    - hash: 82d08523e34f8a3a771ecda3037d8272b14cb28c\n    - hash: dd4c4eb5a72819bc852e878313f8dcf6d846d222\n    - hash: 41c9b5d783a399b1d130ba435c1d124f970e25aa\n    - hash: b7c3b887e04ae0e85f6e71f474fba0cd571075f5\n    - hash: a5d3fb6878b12ccc92c813865deb2781bdf9795c\n    - hash: 1ca753efc5297bf739964fe74df4b4c1106cfb14\n    - hash: 9854bc7287e364570796e1e1161a92f9d2eb2cf7\n    - hash: 00f99bc008bfe346601c4e788b61990719f939b3\n    - hash: 3603de8304a528ab6538d3c008695491f60f567e\n    - hash: ca94ebc3b9d275d0ce5a5a2fb566a32046c29253\n    - hash: acaaaa9e0f71acda0af6db14eb01bf88e39c50d4\n    - hash: ac020891168b6aca46ba07371423dfd7fcfea9c5\n    - hash: b593c88a2af695ee7e32e2134f33cd4776a9847d\n    - hash: 08d9b7eb30f932da225cc7b3ae328cb0fe7390cf\n    - hash: f8a985ede5047a3ee17dc359ce59a0d27438df44\n    - hash: f5fc17db3690e6680012743ed7df9705e9e1b9f8\n    - hash: 52c55488820e07520b7ae06d635317fe6264cb19\n    - hash: 8e8bb5ede27d68027c43e4b30ba1b3a08f1ff304\n    - hash: 1f9a46f965173d94aa47fb1d95f5389555de794b\n    - hash: 81e9af8a53e576f1f1e9d4df8fae0fe5091fb52c\n    - hash: 41d4057b1a1e43aee3c3617203eefba88a3ce5cb\n    - hash: c5249dce04b0dfe4118d030899103a11125cccbc\n    - hash: e5fa91c1debece9caf51d36d9a007ca5dda6d58c\n    - hash: 4eb3c2dbd182b714b68bea1cd8ea459a829c6986\n    - hash: 91e1eb3d92c09150e170580ac2e7c3e9fb8959eb\n    - hash: 382249d397146ab57afe50ac5c0573086749bdb3\n    - hash: 9982b37853f8976f36b74f85bdaa2ee7697f057d\n    - hash: bfd7b412ff483d3dda75a2df16b7320c83f01bb2\n    - hash: 70fdfc242320b1d1e76a21ae5368fac031d85088\n    - hash: 1872d1f65d840451449510b0ca73d0635ae03f0f\n    - hash: 2d2feda47a2169de158b35e473e0a900c090b140\n    - hash: 86d31142dda0f2709ba326920685f4197371eadd\n    - hash: 78571033303a222e31e3f4417456daa33f40eab2\n    - hash: 2387e5a86423c88bc3b1fa3cb3551ce328278795\n    - hash: 3c935c493e812bedd89ed423aa852c5ebe24fb08\n    - hash: eab1061c2ca32616d5949283ccd0c133aeb77639\n    - hash: e5f9ab83c3892a0f06e33fb0d0561040c3d947e5\n    - hash: 6559b9a5d2d8c853d4a479b501b4c8e304644af8\n    - hash: cb6d8fd0a7fcc8bb5614b804ebad1f5c17c0cbda\n    - hash: b02e76aea0e55d1f761f145ea87a1bf3deab136e\n    - hash: 5da231907a4d8116c1850bed8b75e5e2300084dd\n    - hash: 640b9644b97db30cd0158a171621c5b2ee7df064\n    - hash: 719fac0f7fd7a88183122284eacce2bdc35fbd80\n    - hash: eb1d87a1044bfeca1afb9352843535b4385caa8e\n    - hash: 0dd024e64d9ba877cf9ece3734ed1ed01cacb022\n    - hash: 79e44d5318cc6ef53f53a6880135a20f835227e1\n    - hash: aa2db746c0b3c343c7bc33da20d334853b73ddb5\n    - hash: f83fc830af33679a0879d4e3a224569626831334\n    - hash: e0fa0f96d8bb16dacc79090fef54008053dfa9d2\n    - hash: 0d0308d7a7aa8c92881ba4e4901d18dc928cc197\n    - hash: 1bd59bd20b90ea9db402857b1c53de0ecfb86d4a\n    - hash: d677648fca11f212708eb14d975b3bb21aed5078\n    - hash: 7e14bc04d2f6837d43045928b59b2452eafab260\n    - hash: a8dbe82665a52a392b436ad0405661d2befe9327\n    - hash: ddfb77b468938ce434d33bcf1dc8826bbc224850\n    - hash: f7f96203dfa37e4b0589c5377ed8e8f3ec4d1927\n    - hash: aaf4f4cd184e92d90950688105213ab7e0555879\n    - hash: a67e5e71f2c327b7aeb7381532fd18bd0caee2a4\n    - hash: ea7ec4508f519839c045a39cd151e40dd3324c36\n    - hash: 7530ab40436fd8faed7307f47f143442660c8a96\n    - hash: 7756c6137b03cd4849c80e103d49e35d00669212\n    - hash: 7a58a1986998f8e34b5622a262019d771d527bdf\n    - hash: 921c4223cceef152d995de6edb56d20814e87c73\n    - hash: 713c3a8f7498b719c0722a9d263a87d8c814719e\n    - hash: f468f5ea598f7a91585f2429a54db671ee69ff5f\n    - hash: 2b61cfaa7c60507f784c73264d06bc023fdc7190\n    - hash: ea1a4b8caf43b3a3ed5a5d30a472ddb9b32a411d\n    - hash: 4f82e1a413e13c0244c592b70bbc7e510f0a3f48\n    - hash: 1946cae33e1c31ba70b707cd0ba8031ecafc2e97\n    - hash: 420b296a39d51b512a16db4aece5e504ae9496ed\n    - hash: 6964206739e5a1f55f4e6568904ee10593f1e8bf\n    - hash: 53ce60b4f9b95773edcdadcf91ac333ac7ff666d\n    - hash: 3aea3220e3ab7ed04548e016728c1f9a25004c88\n    - hash: 0104b7e18de54337206f554655645cd25a80b58c\n    - hash: e491663840214684068d6d53362c52d5aaff6cad\n    - hash: 425032d17f36132c520f7c085a42fb3e52607db8\n    - hash: 20349a9f9e76df65127e2ff815face9996b8b027\n    - hash: f6b005660d68c2276357c77c810e60d412e3eca9\n    - hash: b78f6adf57d9bbffc457a20c2aee626f8373f5a2\n    - hash: f9e491edd3b2045e540f2b4cc23a65a3cd3a41f6\n    - hash: a494cadd9c3b4e04ed0ab4564d3991fa33a120e1\n    - hash: 5de5504f79f092f973c676cdaae03b3dd7fde6d6\n    - hash: 33bcab83bb0a853ee91224a22862483ed58b8241\n    - hash: 16b5c19b72c159cfedd8f4b2d9f5d85856183c99\n    - hash: ebca2e3a9fcb5f9d5a0fc7ff0ad2b06901008f5f\n    - hash: 6fd293f147dd08093deff03073027e2e27bb990b\n    - hash: d422e412b1bdde87f8c6cfc73e5b8aa0eed3acd2\n    - hash: 826093896068d52a1fb19f0cb9bf06152feeda11\n    - hash: 5a38656a2dce514941edc07689a216692a57c187\n    - hash: 6725eabd92cca5512c3572f8b58145561c3304b8\n    - hash: e2cafedf24b99f74740beecf5b21ff9141969aab\n    - hash: 50eb0b2aaecec38b457446e58a76cf7e283f6950\n    - hash: 30c5688999cc846cf9d07b52145fbe7dd808a201\n    - hash: 670fbde62b548f10f18e1a8b03282039da506c9d\n    - hash: 484e0919a4a87076d3bc9159e078118e19b81935\n    - hash: 3a184fcaeef1a08550a180ae434247ada92573a3\n    - hash: 4a23f2a8191771a2403ae3b7a4200aa4186e5ab3\n    - hash: fb6e2e48a0996830ba94009a4d4f2a24b920bbc1\n    - hash: 3627dfaec73f6dcea97fe35209b13769e0de7a90\n    - hash: 1ec1b0713080edc9b53a939ea79e824bf9e99547\n    - hash: ec9abd5037195ca76add7aab755afe10cee07d86\n    - hash: d5957c66fbfc0ec14b6a5864224c01bccc27af1a\n    - hash: 3b1051a9a57c803d5618c3a95029eeed8c0174ac\n    - hash: 2f8608a5694ebc84fe0fb72f066419cbde8f4d8f\n    - hash: 741b8123c51de805c48d18b6086b6f6d21cd5d97\n    - hash: 5bd52a6373e7d536289617aad7fc4c2699b3270d\n    - hash: d5fd01ffeaeb80e47d6d96e6bac7574c72b77f6b\n    - hash: 712f543cdfc2edfd95178051df7408848b3ed718\n    - hash: 0acb5e40fa09959a8a952b6d7dc9127db4ae2807\n    - hash: 9a5ce56a470aae10d5ed5ebf46d5d0de74234355\n    - hash: 5f88289136890f46e21da37c18aab792557b7b1e\n    - hash: cef0cc06716275430f6348bf9b58fea52e3c1b76\n    - hash: 4db5ef01579c8cb997c62e957eef1ee32de8e873\n    - hash: f2ca0f3d6ba8a71cfe63acbf9bfb3cc5deddfce5\n    - hash: fcf39d172fcf1bd201c8f103218979aaf3ab8a67\n    - hash: e16fcfef6d8c0b8e60d61ecea1e278b46972562e\n    - hash: b6acb17f02bc8ff1078f4032051c65693e7c4659\n    - hash: 384270cd4c590b2d040398697b6268c8bd78bfa8\n    - hash: 283bf06ada6f62e2bc862ba28c3095cd855b4bf0\n    - hash: b48528ddd9159d6107708d2e8d32b5c9f4790f77\n    - hash: 546f8c6ebb0854c29f325d79a2cf5b6d61d8256d\n    - hash: 0ddc7bdf4270d2657e8a2711286e53a5ab5e0a35\n    - hash: 36b079852faebec0afd1f1f59539f14164e3149d\n    - hash: 902c1576b86f350ef11730f0337ac386439215d9\n    - hash: e3298ccbcaf22203a85cd04ad2ce33bb498e6e28\n    - hash: a6907907226439bddef56bc5685f83e1a41b4845\n    - hash: 29e9a34b16db85bbeb575687286e6529c1a3140e\n    - hash: f84c331b81b59d677fd0e15dff3dc35953e89e73\n    - hash: 0cf4c94e2d687238966e39423c6a0c5c7990cd2e\n    - hash: 9db30439558e94f867e9a03749e7623e872fd66a\n    - hash: 35d027f6bb2e2073da3e214ef7d435e83a16e0cc\n    - hash: 69d18170b9ab046a889a8f2f5c8d61aef04f6338\n    - hash: b3ac22faff74ae8b2b1025b41111b2388f4a0e7a\n    - hash: e86da94393d649768798d7e4fdc2a57b03562ee3\n    - hash: 6dcf1ab44d56184d57b0b4e539798a5df1e3a5dc\n    - hash: 517b4cb73f84605678bc0b30030da1fd157a6afc\n    - hash: 20fd282c198230f32dcc0c3de1f4ace253bc9145\n    - hash: 7e2be3dd94f1841e2e43bce8f0e6bc1704fd50d2\n    - hash: c87ec36eaf59256a33d3cc092097635f30f8168f\n    - hash: 288f62675709e441a9a841f60efe352e8390e34e\n    - hash: 8521775af18e07c70422e810b242480ca123fd26\n    - hash: 4e7adef224edb5a4107ce19b5c890ca555c8bc08\n    - hash: 081f8f6c915c07c5d81d1d5ef7b3e810d5c262f5\n    - hash: 46711a12959fc22f0e35b0a530e596c850183479\n    - hash: 5133bef8d850047d399e3017be21532b8c95f879\n    - hash: 12f2d51d38b4caf697ab67d479a0bafb48040f23\n    - hash: f876293d57429ad7f6ea025f6db7708b4c524bfb\n    - hash: 38be3f605f40f993eb655bb635d8c88180d4ed51\n    - hash: a2089991b4f187a2eab4cece647b58e8bee10322\n    - hash: 2e53148fdf77deb9f6617e7c0e1c26b27d054ebe\n    - hash: b40212e3d7291ff2ff2a812ef5ae5d9dbf1b58cd\n    - hash: 59f98fa1f507ba8eadafe2ad3d427a30093d58cc\n    - hash: da73cc19bc4c0cac731ef8e0e6d8259c068af282\n    - hash: dc1e013a4e806c48e37a4961bb41bd4a421a47db\n    - hash: fe8f873fcb1f645bf192f40d0aaec61ffebe691d\n    - hash: 40cd5813349de27c12cc4cc801ad9c71e38ba354\n    - hash: 3dae8bbc763a7c249ec1dde3dd17eedb36619f34\n    - hash: 38c3e92ef34a08dd65eea6a6b3483d663cc81cfc\n    - hash: d34056078726865784034e513fc31226eb5f156c\n    - hash: b65a6bd58b8a696f421b8324631c540f7dd6ae27\n    - hash: b863a233febf14a2037c163d29467a9c9cb769dd\n    - hash: f0466a9dd353b6135c3cdc405212bc5ac270a0d4\n    - hash: d0e16b1575f8117e5c348a84ab0d05b37bd20553\n    - hash: 4baecd5ca4121f9fded5622ed8657f0aa3e64be3\n    - hash: ee36558f3607b13db4024c8ac393ea22be6049ce\n    - hash: a6106adc47cad915422fe7d9b2ca33178039fc41\n    - hash: e8d604bdb464a69ce9785a166d16d894422ea402\n    - hash: 45fddc882bba92a95bab5f1707f2fafe6162fc2e\n    - hash: 167f36e5ecd20ef9a602381a20886987a4f48b98\n    - hash: 9d6ae4dfaa1146f11796ce9006708494c86a66b3\n    - hash: c27c9c3a2fc8f885d9725e6c3c6cd905405c975a\n    - hash: b8caf17e9aedba50f170a1457b10daa7c5eddd68\n    - hash: 5cc711ac1e0d2a73d88544fca6f250c66d75c5a7\n    - hash: 3130ccba7c1a1464dee7d7e774c1dae4889714f1\n    - hash: 20d96684cd72d8dbe5c9e00f07bad40524f17434\n    - hash: dca6c783d2d6a1ddc1b16b43e57e488de85927bd\n    - hash: a14e5235ff28b2a8ed1867d28459716819764171\n    - hash: 5001d84e9ae205c0b8327bb69ac891c58ef2b990\n    - hash: 53b3daa335d90c5c60d74fcf8c8ec7c268e72272\n    - hash: a4ebe8af50a6c138edb711a7a68566210cd59abb\n    - hash: 3bdaadcfb8c21615e87e878ccd8639c478af72d5\n    - hash: 244d5ca727793c39b5943bd0fe1ee09b3dd76207\n    - hash: 832d6843dfabc82dd4d9f20ed6ceae154db94f5f\n    - hash: 61cd5a1ffe5fbec963683e56b8494368331474bf\n    - hash: 10b714a2ce4008bb6dc44bc82a81e03313332573\n    - hash: 4ef7dae3c41863a9eced2a12dc86d50667386fa1\n    - hash: f5c9a3a32ac33100b66da6d0c07ab0c1ad0d26b8\n    - hash: 472f91a504d6e96dbe0e7ec5361ff039f486dc99\n    - hash: 797a2531589d04970bba4b717ba171de5bbad254\n    - hash: 18a160698845690286f64b5b7c1bf434be93b61a\n    - hash: 7b48eeb993aa5e091db675ecbdb3405a3a60c7c6\n    - hash: c75b4b307a12f8cf2ee5f36f5d408a7e18d6de89\n    - hash: bac70c667f5c670d4d60b136b750a052ffaec31e\n    - hash: 34907765dffe0e75bfedef078748a1a19f25de25\n    - hash: e54135745066d8f1525d0caee353167b6de22e58\n    - hash: d47eaa8a2a496decad91e5b71e95925bb45d7354\n    - hash: 01ec52f4d7cbbcb31374d72127da90217e7d9ed9\n    - hash: 5d52b19c2b52654e18e8df47f9e123b0bc3d36b6\n    - hash: abdee7fe1036ca546ea723c30cce54993916c8ac\n    - hash: 482b0a52ee16f808295f7b5806c1869a127ad53a\n    - hash: 6f7ea4e7724720684c65ac82548a5aa06292b99a\n    - hash: 79b16beaf0d1fa7085e611827e648069e3284ec3\n    - hash: 9bd0ccd5504e660f5bbe9f77248f62dd755d0d47\n    - hash: e3ed0af0f975206dedefb33ea3dc4b26ab3933d8\n    - hash: 8b5c1a7c419e525fa1b91bd9935cb0e78d09cafe\n    - hash: 05a57904009d71f102265593bba759118784c192\n    - hash: cb8da11b8924f0ff02ab395883b3f172b7dd2eba\n    - hash: eaa3782f060490f16bb7ab07fa3487469e3feed0\n    - hash: f530dfcc3ce02104029b7331344afbd73f113781\n    - hash: 53a026eee016019cf0923349218d0ee9f37f24e4\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nThis project adheres to [Semantic Versioning](http://semver.org/).\n\n# v2.1.4\n## (2025-07-29)\n\n* patch: fix ubuntu 24 build and flash issues - bump electron-forge to 7.8.1 - bump electron to 37.2.4 - stop producing broken appimage [Edwin Joassart]\n* patch: fix windows build and flash issues - downgrade flasher's node to 20.11.1 on windows - bump windows GHA runner to 2022 - bump winusb-driver-generator to 2.1.9 [Edwin Joassart]\n* patch: refactor permission code [Edwin Joassart]\n\n# v2.1.3\n## (2025-05-15)\n\n* Remove stale secrets [Anton Belodedenko]\n\n# v2.1.2\n## (2025-05-08)\n\n* patch: remove analytics [Edwin Joassart]\n\n# v2.1.1\n## (2025-05-05)\n\n* patch: fix signin windows artifacts [Edwin Joassart]\n\n# v2.1.0\n## (2025-02-27)\n\n* Add informational notice about how to disable analytics collection [myarmolinsky]\n\n# v2.0.0\n## (2025-02-20)\n\n* major: build on ubuntu 22 and macos 13 [Edwin Joassart]\n\n# v1.19.25\n## (2024-10-10)\n\n* patch: bump etcher-sdk to 9.1.2 [Edwin Joassart]\n\n# v1.19.24\n## (2024-10-09)\n\n* patch: etcher-util is corrupted in RPM package [Richard Glidden]\n\n# v1.19.23\n## (2024-10-09)\n\n* patch: remove gconf2 libgconf-2-4 deps [Marc-Aurèle Brothier]\n\n# v1.19.22\n## (2024-07-18)\n\n* Replace deprecated Flowzone inputs [Kyle Harding]\n\n# v1.19.21\n## (2024-05-30)\n\n* patch: fix missing windows dependency [Edwin Joassart]\n* patch: fix missing windows dependency [Edwin Joassart]\n* patch: fix missing windows dependency [Edwin Joassart]\n\n# v1.19.20\n## (2024-05-30)\n\n* patch: fix missing windows dependency [Edwin Joassart]\n\n# v1.19.19\n## (2024-05-28)\n\n* patch: add sentry debug flag [Edwin Joassart]\n\n# v1.19.18\n## (2024-05-22)\n\n* patch: fix Sentry DSN for main process [Edwin Joassart]\n\n# v1.19.17\n## (2024-05-09)\n\n* patch: fix injection of analytics key at build time [JOASSART Edwin]\n\n# v1.19.16\n## (2024-04-26)\n\n* patch: hold request for metadata while waiting for flasher [Edwin Joassart]\n\n# v1.19.15\n## (2024-04-26)\n\n* patch: bump etcher-sdk to 9.0.11 to fix url loading using http/2 [Edwin Joassart]\n\n# v1.19.14\n## (2024-04-25)\n\n* patch: pretty-bytes to 6.1.1 [JOASSART Edwin]\n\n# v1.19.13\n## (2024-04-25)\n\n* patch: use etcher icon as loading for windows installer [Edwin Joassart]\n* patch: fix windows squirrel install [Edwin Joassart]\n\n# v1.19.12\n## (2024-04-25)\n\n* patch: bump minors & patch [Edwin Joassart]\n* patch: bump @electron-forge/* to 7.4.0 [Edwin Joassart]\n* patch: bump electron to 30.0.1 & @electron/remote to 2.1.2 [Edwin Joassart]\n* patch: npm upgrade [Edwin Joassart]\n* patch: bump @balena/lint to 8.0.2 and fix formating [Edwin Joassart]\n* patch: fix pretty-bytes imports [Edwin Joassart]\n* patch: bump etcher-sdk to 9.0.9 [Edwin Joassart]\n\n# v1.19.11\n## (2024-04-25)\n\n* patch: setup wdio and port (most) tests [Edwin Joassart]\n\n# v1.19.10\n## (2024-04-23)\n\n* patch: remove node-ipc and tests [Edwin Joassart]\n* patch: switch api; use ws; integrate sudo-prompt - switch api roles flow - use websocket instead of node-ipc - integrate; modernize; simplify and deprecate sudo-prompt [Edwin Joassart]\n* patch: refactor api to use a single topic [Edwin Joassart]\n* patch: set require node engine to 20 [Edwin Joassart]\n\n# v1.19.9\n## (2024-04-22)\n\n* patch: prevent rebuild of native deps by @electron/rebuild [Edwin Joassart]\n\n# v1.19.8\n## (2024-04-22)\n\n* patch: replace deprecated pkg with yao-pkg and bump etcher-util node v to 20.10 [Edwin Joassart]\n\n# v1.19.7\n## (2024-04-22)\n\n* patch: fix formating [Edwin Joassart]\n* patch: configure prettier in the project to use balena-lint configuration [Edwin Joassart]\n\n# v1.19.6\n## (2024-04-19)\n\n* patch: fix win signature process [Edwin Joassart]\n\n# v1.19.5\n## (2024-02-14)\n\n* Replace deprecated flowzone input tests_run_on [Kyle Harding]\n\n# v1.19.4\n## (2024-01-26)\n\n* patch: remove screensaver error when not on etcher-pro [Edwin Joassart]\n* patch: fix typo in IPC server id [Edwin Joassart]\n\n# v1.19.3\n## (2023-12-22)\n\n* Update dependencies [Edwin Joassart]\n\n# v1.19.2\n## (2023-12-22)\n\n* fix: typos [Rotzbua]\n\n# v1.19.1\n## (2023-12-22)\n\n* patch: update winget-releaser v2 [Vedant]\n\n# v1.19.0\n## (2023-12-21)\n\n* Use native ARM runner for Apple Silicon builds [Akis Kesoglou]\n* Calculate and upload build artifact sha256 checksums [Akis Kesoglou]\n* Migrate build pipeline to Electron Forge [Akis Kesoglou]\n\n# v1.18.14\n## (2023-12-20)\n\n* Remove repo config from flowzone.yml [Kyle Harding]\n* Update actions/upload-artifact to v4 [Kyle Harding]\n\n# v1.18.13\n## (2023-10-16)\n\n* patch: upgrade to electron 25 [Edwin Joassart]\n* patch: refactor scanner, loader and flasher out of gui + upgrade to electron 25 [Edwin Joassart]\n\n# v1.18.12\n## (2023-07-19)\n\n* Update instructions for installing deb file [Jorge Capona]\n\n# v1.18.11\n## (2023-07-13)\n\n* fix: prevent stealing window focus from auth dialog [leadpogrommer]\n\n# v1.18.10\n## (2023-07-12)\n\n* spelling: validates [Josh Soref]\n* spelling: undefined [Josh Soref]\n* spelling: except if [Josh Soref]\n\n# v1.18.9\n## (2023-07-12)\n\n* Fix opening links from within SafeWebView [Akis Kesoglou]\n\n# v1.18.8\n## (2023-04-26)\n\n* Patch: Fix Support link [Oliver Plummer]\n\n# v1.18.7\n## (2023-04-25)\n\n* patch: update docs to remove cloudsmith install instructions for linux [Edwin Joassart]\n\n# v1.18.6\n## (2023-03-21)\n\n* add-flash-with-etcher-to-docs [Lizzie Epton]\n\n# v1.18.5\n## (2023-03-09)\n\n* patch: add apt-get update in flowzone preinstall [Edwin Joassart]\n\n# v1.18.4\n## (2023-03-02)\n\n* patch: bump etcher-sdk to 8.3.1 [JOASSART Edwin]\n\n# v1.18.3\n## (2023-02-22)\n\n* fix-typo [Lizzie Epton]\n* edits-to-info-about-efp [Lizzie Epton]\n* Add reference to etcher-efp in publishing.md [Edwin Joassart]\n\n# v1.18.2\n## (2023-02-21)\n\n* patch: organize docs [mcraa]\n* patch: actualized develop guide [mcraa]\n* patch: updated commit message guide [mcraa]\n* add-item-from-FAQs [Lizzie Epton]\n* patch: removed gt characters from contributing guide [mcraa]\n* patch: added docosaurus site name [mcraa]\n\n# v1.18.1\n## (2023-02-15)\n\n* patch: use @electron/remote for locating rpiboot files [mcraa]\n\n# v1.18.0\n## (2023-02-14)\n\n* Update to Electron 19 [Akis Kesoglou]\n* Remove Spectron and related (low-value) tests [Akis Kesoglou]\n\n# v1.17.0\n## (2023-02-14)\n\n* Update to Electron 17 and Node 16 [Akis Kesoglou]\n\n# v1.16.0\n## (2023-02-14)\n\n* Update to Electron 14 [Akis Kesoglou]\n\n# v1.15.6\n## (2023-02-13)\n\n* patch: app: i18n: Translation: Update zh-TW strings * Improve translate. * Sync layout with English strings ts file. [Edward Wu]\n\n# v1.15.5\n## (2023-02-03)\n\n* revert auto-update feature [JOASSART Edwin]\n\n# v1.15.4\n## (2023-02-02)\n\n* Switch to `@electron/remote` [Akis Kesoglou]\n\n# v1.15.3\n## (2023-02-02)\n\n* move EFP & success-banner to efp.balena.io [Edwin Joassart]\n\n# v1.15.2\n## (2023-02-02)\n\n* Remove configuration remote update [Edwin Joassart]\n\n# v1.15.1\n## (2023-02-01)\n\n* Remove redundant resinci-deploy build step [Akis Kesoglou]\n* Lazily import Electron from child-writer process [Akis Kesoglou]\n\n# v1.15.0\n## (2023-01-27)\n\n* Add support for Node 18 [Akis Kesoglou]\n\n# v1.14.3\n## (2023-01-19)\n\n* patch: fixed mac sudo on other languages [Peter Makra]\n\n# v1.14.2\n## (2023-01-17)\n\n* patch: revert to lockfile v1 [Peter Makra]\n* patch: update etcher-sdk for cm4v5 [builder555]\n\n# v1.14.1\n## (2023-01-16)\n\n* fix disabled-screensaver unhandled exception outside balena-electron env [Edwin Joassart]\n\n# v1.14.0\n## (2023-01-16)\n\n* Anonymizes all paths before sending [Otávio Jacobi]\n* patch: Sentry fix path [Edwin Joassart]\n* Remove personal path on etcher [Otávio Jacobi]\n* Unifying sentry reports in a single project [Edwin Joassart]\n* Removes corvus in favor of sentry and analytics client [Otávio Jacobi]\n* Removes corvus in favor of sentry and analytics client [Otávio Jacobi]\n\n# v1.13.4\n## (2023-01-12)\n\n* Adding EtcherPro device serial number to the Settings modal [Aurelien VALADE]\n\n# v1.13.3\n## (2023-01-11)\n\n* patch: progress cm4 to second stage [Peter Makra]\n\n# v1.13.2\n## (2023-01-02)\n\n* patch: fixed winget parameter name [mcraa]\n\n# v1.13.1\n## (2023-01-02)\n\n* patch: updated sdk to fix bz2 issue [Peter Makra]\n* patch: update copyright in electron-builder [JOASSART Edwin]\n\n# v1.13.0\n## (2022-12-28)\n\n* minor: electron version bump [Peter Makra]\n* patch: handle ext2fs with webpack [Peter Makra]\n* Patch: update etcher-sdk version to fix CM4 issues [builder555]\n\n# v1.12.7\n## (2022-12-20)\n\n* Update dependency i18next to 21.10.0 [Renovate Bot]\n\n# v1.12.6\n## (2022-12-20)\n\n* Update dependency react-i18next to 11.18.6 [Renovate Bot]\n\n# v1.12.5\n## (2022-12-20)\n\n* Patch: made trim setting more readable [builder555]\n\n# v1.12.4\n## (2022-12-19)\n\n* patch: publish to winget with gh action [Begula]\n\n# v1.12.3\n## (2022-12-19)\n\n* Patch: replaced plain text with i18n in settings [builder555]\n\n# v1.12.2\n## (2022-12-16)\n\n* Update dependency webpack-dev-server to 4.11.1 [Renovate Bot]\n\n# v1.12.1\n## (2022-12-16)\n\n* Patch: expose trim ext{2,3,4} setting [builder555]\n\n# v1.12.0\n## (2022-12-14)\n\n* i18n support and Chinese translation [ab77]\n* minor: optimize i18n [r-q]\n\n# v1.11.10\n## (2022-12-13)\n\n* Update dependency webpack-cli to 4.10.0 [Renovate Bot]\n\n# v1.11.9\n## (2022-12-12)\n\n* Update dependency webpack to 5.75.0 [Renovate Bot]\n\n# v1.11.8\n## (2022-12-12)\n\n* Update dependency awscli to 1.27.28 [Renovate Bot]\n\n# v1.11.7\n## (2022-12-12)\n\n* Update dependency uuid to 8.3.2 [Renovate Bot]\n\n# v1.11.6\n## (2022-12-12)\n\n* Update dependency tslib to 2.4.1 [Renovate Bot]\n* Patch: run linux build on ubuntu-20.04 [Edwin Joassart]\n\n# v1.11.5\n## (2022-12-10)\n\n* Update dependency ts-loader to 8.4.0 [Renovate Bot]\n\n# v1.11.4\n## (2022-12-10)\n\n* Update dependency styled-components to 5.3.6 [Renovate Bot]\n\n# v1.11.3\n## (2022-12-10)\n\n* Update dependency terser-webpack-plugin to 5.3.6 [Renovate Bot]\n\n# v1.11.2\n## (2022-12-10)\n\n* Update dependency string-replace-loader to 3.1.0 [Renovate Bot]\n\n# v1.11.1\n## (2022-12-10)\n\n* Update dependency sinon to 9.2.4 [Renovate Bot]\n\n# v1.11.0\n## (2022-12-10)\n\n* Update dependency shyaml to 0.6.2 [Renovate Bot]\n\n# v1.10.29\n## (2022-12-10)\n\n* Update dependency awscli to 1.27.27 [Renovate Bot]\n\n# v1.10.28\n## (2022-12-10)\n\n\n<details>\n<summary> Update dependency rendition to 19.3.2 [Renovate Bot] </summary>\n\n> ## rendition-19.3.2\n> ### (2020-12-29)\n> \n> * Add Breadcrumbs component export [JSReds]\n> \n> ## rendition-19.3.1\n> ### (2020-12-29)\n> \n> * Fix max-width on breadcrumbs container [JSReds]\n> \n> ## rendition-19.3.0\n> ### (2020-12-29)\n> \n> * Add Breadcrumbs component [JSReds]\n> \n\n</details>\n\n# v1.10.27\n## (2022-12-09)\n\n* Update dependency redux to 4.2.0 [Renovate Bot]\n\n# v1.10.26\n## (2022-12-09)\n\n* Update dependency pretty-bytes to 5.6.0 [Renovate Bot]\n\n# v1.10.25\n## (2022-12-09)\n\n* Update dependency pnp-webpack-plugin to 1.7.0 [Renovate Bot]\n\n# v1.10.24\n## (2022-12-09)\n\n* Update dependency node-ipc to 9.2.1 [Renovate Bot]\n\n# v1.10.23\n## (2022-12-09)\n\n* Update dependency mocha to 8.4.0 [Renovate Bot]\n\n# v1.10.22\n## (2022-12-09)\n\n* Update dependency mini-css-extract-plugin to 1.6.2 [Renovate Bot]\n\n# v1.10.21\n## (2022-12-09)\n\n* Update dependency lint-staged to 10.5.4 [Renovate Bot]\n\n# v1.10.20\n## (2022-12-09)\n\n* Update dependency husky to 4.3.8 [Renovate Bot]\n\n# v1.10.19\n## (2022-12-09)\n\n* Update dependency esbuild-loader to 2.20.0 [Renovate Bot]\n\n# v1.10.18\n## (2022-12-09)\n\n* Update dependency electron-updater to 4.6.5 [Renovate Bot]\n\n# v1.10.17\n## (2022-12-09)\n\n* Update dependency electron-notarize to 1.2.2 [Renovate Bot]\n\n# v1.10.16\n## (2022-12-08)\n\n* Update dependency awscli to 1.27.26 [Renovate Bot]\n\n# v1.10.15\n## (2022-12-08)\n\n* Update dependency electron-builder to 22.14.13 [Renovate Bot]\n\n# v1.10.14\n## (2022-12-08)\n\n* Update dependency debug to 4.3.4 [Renovate Bot]\n\n# v1.10.13\n## (2022-12-08)\n\n* Update dependency awscli to 1.27.25 [Renovate Bot]\n\n# v1.10.12\n## (2022-12-08)\n\n* Update dependency css-loader to 5.2.7 [Renovate Bot]\n\n# v1.10.11\n## (2022-12-07)\n\n* Update dependency awscli to 1.27.24 [Renovate Bot]\n\n# v1.10.10\n## (2022-12-07)\n\n* Update dependency @types/node to 14.18.34 [Renovate Bot]\n\n# v1.10.9\n## (2022-12-06)\n\n* Enable repository configuration [ab77]\n\n# v1.10.8\n## (2022-12-05)\n\n* Update dependency chai to 4.3.7 [Renovate Bot]\n\n# v1.10.7\n## (2022-12-05)\n\n* Use core workflow for GitHub publish [ab77]\n\n# v1.10.6\n## (2022-12-02)\n\n* Dummy update to fix asset version issue [Edwin Joassart]\n\n# v1.10.5\n## (2022-12-02)\n\n* Patch: run linux build on ubuntu-18.04 [Edwin Joassart]\n\n# v1.10.4\n## (2022-12-01)\n\n* patch: remove Homebrew instructions in README [Patrick Linnane]\n\n# v1.10.3\n## (2022-12-01)\n\n* Allow external contributors [ab77]\n\n# v1.10.2\n## (2022-11-25)\n\n* Fix missing analytics token [Edwin Joassart]\n\n# v1.10.1\n## (2022-11-21)\n\n* Fixing call to electron block screensaver methods invocation [Aurelien VALADE]\n\n# v1.10.0\n## (2022-11-10)\n\n* testing renovate [builder555]\n\n# v1.9.0\n## (2022-11-08)\n\n* Update dependency awscli to 1.27.5 [Renovate Bot]\n\n# v1.8.17\n## (2022-11-08)\n\n* Update dependency @types/react-dom to 16.9.17 [Renovate Bot]\n\n# v1.8.16\n## (2022-11-08)\n\n* Update dependency @types/react to 16.14.34 [Renovate Bot]\n\n# v1.8.15\n## (2022-11-08)\n\n* CI: generalise artefact handling [ab77]\n\n# v1.8.14\n## (2022-11-08)\n\n* Update dependency @types/node to 14.18.33 [Renovate Bot]\n\n# v1.8.13\n## (2022-11-08)\n\n* Update dependency @types/copy-webpack-plugin to 6.4.3 [Renovate Bot]\n\n# v1.8.12\n## (2022-11-08)\n\n* Update dependency @fortawesome/fontawesome-free to 5.15.4 [Renovate Bot]\n\n# v1.8.11\n## (2022-11-08)\n\n* Update dependency @balena/lint to 5.4.2 [Renovate Bot]\n\n# v1.8.10\n## (2022-11-08)\n\n\n<details>\n<summary> Update dependency sys-class-rgb-led to 3.0.1 [Renovate Bot] </summary>\n\n> ## sys-class-rgb-led-3.0.1\n> ### (2021-07-01)\n> \n> * patch: Delete Codeowners [Vipul Gupta]\n> \n</details>\n\n# v1.8.9\n## (2022-11-08)\n\n* Update dependency semver to 7.3.8 [Renovate Bot]\n\n# v1.8.8\n## (2022-11-08)\n\n* Update dependency omit-deep-lodash to 1.1.7 [Renovate Bot]\n\n# v1.8.7\n## (2022-11-08)\n\n* Update dependency immutable to 3.8.2 [Renovate Bot]\n\n# v1.8.6\n## (2022-11-08)\n\n* Update dependency electron-rebuild to 3.2.9 [Renovate Bot]\n\n# v1.8.5\n## (2022-11-08)\n\n* Update dependency electron-mocha to 9.3.3 [Renovate Bot]\n\n# v1.8.4\n## (2022-11-08)\n\n* Update dependency @types/webpack-node-externals to 2.5.3 [Renovate Bot]\n\n# v1.8.3\n## (2022-11-08)\n\n* Update dependency @types/tmp to 0.2.3 [Renovate Bot]\n\n# v1.8.2\n## (2022-11-08)\n\n* Generate release notes with git [ab77]\n\n# v1.8.1\n## (2022-11-07)\n\n* Update dependency @types/mime-types to 2.1.1 [Renovate Bot]\n\n# v1.8.0\n## (2022-11-07)\n\n* Update scripts/resin digest to 652fdd4 [Renovate Bot]\n\n# v1.7.15\n## (2022-11-07)\n\n* Build targets individually [ab77]\n\n# v1.7.14\n## (2022-11-07)\n\n* Update dependency lodash to 4.17.21 [SECURITY] [Renovate Bot]\n\n# v1.7.13\n## (2022-11-07)\n\n* Update release notes on finalize [ab77]\n\n# v1.7.12\n## (2022-11-07)\n\n* Avoid duplicate releases [ab77]\n\n# v1.7.11\n## (2022-11-07)\n\n* Only run finalize on Linux runners [ab77]\n\n# v1.7.10\n## (2022-11-07)\n\n* Switch to Flowzone [ab77]\n\n# v1.7.9\n## (2022-04-22)\n\n* patch: update allowed extensions to include deb afterinstall in build [mcraa]\n* patch: add update notification [Peter Makra]\n* patch: fix usb-device-boot link in README [Andrew Scheller]\n* Fix application directory for Debian postinst script [Ken Bannister]\n\n# v1.7.8\n## (2022-03-18)\n\n* patch: complete suse uninstall readme [Peter Makra]\n* patch: completed suse instructions [Peter Makra]\n* patch: order rpm instrictions [Peter Makra]\n* patch: enabled update notification for version 1.7.8 [Peter Makra]\n* patch: updated title to balenaEtcher [Peter Makra]\n* patch: cleanup and organize readme [Peter Makra]\n* patch: extend cloudsmith attribution in readme [Peter Makra]\n* Update macOS Icon to Big Sur Style [Logicer]\n\n# v1.7.7\n## (2022-02-22)\n\n* patch: clarified update check [Peter Makra]\n* patch: autoupdate stagingPercentage check, include default [Peter Makra]\n\n# v1.7.6\n## (2022-02-21)\n\n* patch: version number notification [Peter Makra]\n* patch: fixed typos in template [Peter Makra]\n* patch: add requirements and help to issue template [mcraa]\n* patch: add requirements and help to issue template [mcraa]\n\n# v1.7.5\n## (2022-02-21)\n\n* patch: fix flashing from URL when using basic auth [Marco Füllemann]\n\n# v1.7.4\n## (2022-02-21)\n\n* patch: set version update notification 1.7.3 [Peter Makra]\n* patch: updated electron to 12.2.3 [Peter Makra]\n* patch: updated electron to 12.2.3 [Peter Makra]\n\n# v1.7.3\n## (2021-12-29)\n\n* patch: fix mesage of null [Peter Makra]\n\n# v1.7.2\n## (2021-12-21)\n\n* patch: fixed open from browser on windows [Peter Makra]\n\n# v1.7.1\n## (2021-11-22)\n\n* patch: Revert back to electron-rebuild [Lorenzo Alberto Maria Ambrosi]\n* patch: Disallow TS in JS [Lorenzo Alberto Maria Ambrosi]\n* patch: Remove esInterop TS flag [Lorenzo Alberto Maria Ambrosi]\n* patch: Use @balena/sudo-prompt [Lorenzo Alberto Maria Ambrosi]\n* patch: Update rpiboot guide link [Lorenzo Alberto Maria Ambrosi]\n* patch: Improve webpack build time [Lorenzo Alberto Maria Ambrosi]\n\n# v1.7.0\n## (2021-11-09)\n\n* patch: Add missing @types/react@16.8.5 [Lorenzo Alberto Maria Ambrosi]\n* patch: Use npm ci in Makefile [Lorenzo Alberto Maria Ambrosi]\n* patch: Add draft info boxes for system information [Lorenzo Alberto Maria Ambrosi]\n* patch: Remove electron-rebuild package [Lorenzo Alberto Maria Ambrosi]\n* patch: Make electron a dev. dependency [Lorenzo Alberto Maria Ambrosi]\n* patch: Remove electron-rebuild package [Lorenzo Alberto Maria Ambrosi]\n* patch: Use exact modules versions [Lorenzo Alberto Maria Ambrosi]\n* patch: Update etcher-sdk from v6.2.5 to v6.3.0 [Lorenzo Alberto Maria Ambrosi]\n* Fix write step for Http file process [JSReds]\n* patch: Fix linting errors [Lorenzo Alberto Maria Ambrosi]\n* minor: Refactor dependencies installation to avoid custom scripts [Lorenzo Alberto Maria Ambrosi]\n* patch: Fix LEDs init error [Lorenzo Alberto Maria Ambrosi]\n\n# v1.6.0\n## (2021-09-20)\n\n* Add support for basic auth when downloading images from URL. [Marco Füllemann]\n* patch: Update etcher-sdk from v6.2.1 to v6.2.5 [Lorenzo Alberto Maria Ambrosi]\n* Update Makefile to Apple M1 info [David Gaspar]\n* Add LED settings for potentially different hardware [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.122\n## (2021-09-02)\n\n* Restore image file selection LED-drive pathing [Lorenzo Alberto Maria Ambrosi]\n* Update scripts submodule [Lorenzo Alberto Maria Ambrosi]\n* Change LEDs colours [Lorenzo Alberto Maria Ambrosi]\n* Windows images now show the proper warning again [Lorenzo Alberto Maria Ambrosi]\n* Fix Update and install with DNF instructions [Mohamed Salah]\n* Add possibile authorization as a query param [JSReds]\n* update the windows part [Xtraim]\n* Update SUPPORT.md [thambu1710]\n* replace make webpack with npm run webpack [Seth Falco]\n* Add loader on image select [JSReds]\n* add pnp-webpack-plugin [Zane Hitchcox]\n* Remove redundant codespell dependency/tests [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.121\n## (2021-07-05)\n\n* patch: Delete Codeowners [Vipul Gupta]\n* Add source maps for devtools [Lorenzo Alberto Maria Ambrosi]\n* Clone submodules when initializing modules [Lorenzo Alberto Maria Ambrosi]\n* patch: Select drive on list interaction rather than modal closing [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.120\n## (2021-05-11)\n\n* Update README to reference Cloudsmith [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.119\n## (2021-04-30)\n\n* Update readme for new PPA provider [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.118\n## (2021-04-27)\n\n* patch: development environment [Zane Hitchcox]\n* patch: watch files for electron [Zane Hitchcox]\n\n# v1.5.117\n## (2021-04-02)\n\n* Rename mac releases (keep old naming) [Alexis Svinartchouk]\n* Disable spectron tests on macOS [Alexis Svinartchouk]\n* Update electron to v12.0.2 [Alexis Svinartchouk]\n\n<details>\n<summary> Update etcher-sdk from 6.1.1 to 6.2.1 [Alexis Svinartchouk] </summary>\n\n> ## etcher-sdk-6.2.1\n> ### (2021-03-26)\n> \n> \n> <details>\n> <summary> Update node-raspberrypi-usbboot from 0.2.11 to 0.3.0 [Alexis Svinartchouk] </summary>\n> \n>> ### node-raspberrypi-usbboot-0.3.0\n>> #### (2021-03-26)\n>> \n>> * Add support for compute module 4 [Alexis Svinartchouk]\n>> * Fix size endianness of boot_message_t message [Alexis Svinartchouk]\n>> \n> </details>\n> \n> \n> ## etcher-sdk-6.2.0\n> ### (2021-02-18)\n> \n> * Added BeagleBone USB Boot example [Parthiban Gandhi]\n> * Added BeagleBone USB Boot support [Parthiban Gandhi]\n> \n</details>\n\n* Fix getAppPath() returning an asar file on macOS [Alexis Svinartchouk]\n* Grammar fix [Andrew Scheller]\n* (docs) update README.md [vlad doster]\n* Update copyright year in electron-builder.yml [Andrew Scheller]\n* Update copyright year in .resinci.json [Andrew Scheller]\n* Separate the Yum and DNF instructions. [Dugan Chen]\n* Set msvs_version to 2019 when rebuilding [Alexis Svinartchouk]\n* Use moduleIds: 'natural' in webpack config to keep js files in arm64 and x64 mac builds identical [Alexis Svinartchouk]\n* Update electron-builder to 22.10.5 [Alexis Svinartchouk]\n* Update spectron to v13 [Alexis Svinartchouk]\n* Update dependencies, use aws4-axios@2.2.1 to avoid adding more dependiencies [Alexis Svinartchouk]\n* Update scripts to build universal mac dmgs on the ci [Alexis Svinartchouk]\n* Fix beforeBuild.js script to also work on mac [Alexis Svinartchouk]\n* Support building universal dmgs (x64 and arm64) for mac [Alexis Svinartchouk]\n* Update electron-builder to 22.10.4 [Alexis Svinartchouk]\n* Fix titlebar z-index [Alexis Svinartchouk]\n* Explicitly set contextIsolation to false [Alexis Svinartchouk]\n* Update electron from 9.4.1 to 11.2.3 [Alexis Svinartchouk]\n\n<details>\n<summary> Update etcher-sdk from 6.1.0 to 6.1.1 [Alexis Svinartchouk] </summary>\n\n> ## etcher-sdk-6.1.1\n> ### (2021-02-10)\n> \n> \n> <details>\n> <summary> Update node-raspberrypi-usbboot from 0.2.10 to 0.2.11 [Alexis Svinartchouk] </summary>\n> \n>> ### node-raspberrypi-usbboot-0.2.11\n>> #### (2021-02-10)\n>> \n>> * Update @balena.io/usb from 1.3.12 to 1.3.14 [Alexis Svinartchouk]\n>> \n> </details>\n> \n> \n</details>\n\n# v1.5.116\n## (2021-02-03)\n\n* Only cleanup temporary decompressed files in child-writer [Alexis Svinartchouk]\n* Add .versionbot/CHANGELOG.yml [Alexis Svinartchouk]\n* Stop using node-tmp, use withTmpFile from etcher-sdk instead [Alexis Svinartchouk]\n\n<details>\n<summary> Update etcher-sdk from 5.2.2 to 6.1.0 [Alexis Svinartchouk] </summary>\n\n> ## etcher-sdk-6.1.0\n> ### (2021-02-03)\n> \n> * Prefix temporary decompressed images filenames [Alexis Svinartchouk]\n> \n> ## etcher-sdk-6.0.1\n> ### (2021-02-02)\n> \n> * Ignore ENOENT errors on unlink in withTmpFile [Alexis Svinartchouk]\n> \n> ## etcher-sdk-6.0.0\n> ### (2021-02-01)\n> \n> * Export tmp and add prefix and postfix options [Alexis Svinartchouk]\n> \n> ## etcher-sdk-5.2.3\n> ### (2021-01-26)\n> \n> * upgrade lint [Zane Hitchcox]\n> \n</details>\n\n* Revert \"Change some border colors to have higher contrast\" [Alexis Svinartchouk]\n* Update electron to v9.4.1 [Alexis Svinartchouk]\n\n<details>\n<summary> Update etcher-sdk from 5.2.1 to 5.2.2 [Alexis Svinartchouk] </summary>\n\n> ## etcher-sdk-5.2.2\n> ### (2021-01-19)\n> \n> \n> <details>\n> <summary> Update drivelist from 9.2.2 to 9.2.4 [Alexis Svinartchouk] </summary>\n> \n>> ### drivelist-9.2.4\n>> #### (2021-01-19)\n>> \n>> * Pass strings between methods as std::string instead of char * [Floris Bos]\n>> \n>> ### drivelist-9.2.3\n>> #### (2021-01-19)\n>> \n>> * Support lsblk versions that do no support the pttype column [Alexis Svinartchouk]\n>> \n> </details>\n> \n> \n</details>\n\n# v1.5.115\n## (2021-01-18)\n\n\n<details>\n<summary> Update etcher-sdk from 5.1.12 to 5.2.1 [Alexis Svinartchouk] </summary>\n\n> ## etcher-sdk-5.2.1\n> ### (2021-01-15)\n> \n> * Only run one diskpart at a time [Alexis Svinartchouk]\n> * Ignore diskpart VDS_E_DISK_IS_OFFLINE errors [Alexis Svinartchouk]\n> \n> ## etcher-sdk-5.2.0\n> ### (2021-01-06)\n> \n> * Store progress on usbboot devices [Alexis Svinartchouk]\n> \n</details>\n\n# v1.5.114\n## (2021-01-12)\n\n* Remove libappindicator1 debian dependency [Alexis Svinartchouk]\n\n<details>\n<summary> Update etcher-sdk from 5.1.11 to 5.1.12 [Alexis Svinartchouk] </summary>\n\n> ## etcher-sdk-5.1.12\n> ### (2021-01-06)\n> \n> * Remove BlockDevice.mountpoints incorrect typing [Alexis Svinartchouk]\n> * Update axios to 0.21.1 and aws4-axios to 2.0.1 [Alexis Svinartchouk]\n> \n</details>\n\n\n<details>\n<summary> Update rendition from 18.8.3 to 19.2.0 [Alexis Svinartchouk] </summary>\n\n> ## rendition-19.2.0\n> ### (2020-12-29)\n> \n> * Add truncate property to Txt component [JSReds]\n> \n> ## rendition-19.1.0\n> ### (2020-12-29)\n> \n> * Add fallback image source to Img component [Stevche Radevski]\n> \n> ## rendition-19.0.0\n> ### (2020-12-21)\n> \n> * Remove Arcslider component [Stevche Radevski]\n> \n> ## rendition-18.20.4\n> ### (2020-12-17)\n> \n> * Upgrade rehype-raw to latest version [Kakhaber]\n> \n> ## rendition-18.20.3\n> ### (2020-12-17)\n> \n> * Fix disabled button tooltip [JSReds]\n> \n> ## rendition-18.20.2\n> ### (2020-12-16)\n> \n> * Turn keydown handler into an arrow function [Stevche Radevski]\n> \n> ## rendition-18.20.1\n> ### (2020-12-14)\n> \n> * Fix form not getting the Enter key event when nested in a modal [Stevche Radevski]\n> \n> ## rendition-18.20.0\n> ### (2020-12-14)\n> \n> * feat: Add new StatsBar component [Graham McCulloch]\n> \n> ## rendition-18.19.2\n> ### (2020-12-14)\n> \n> * Update snapshots [Graham McCulloch]\n> * Removed out-of-date documentation and template text [Graham McCulloch]\n> \n> ## rendition-18.19.1\n> ### (2020-12-04)\n> \n> * Markdown: Fix line breaks [Kakhaber]\n> \n> ## rendition-18.19.0\n> ### (2020-12-02)\n> \n> * Make card size responsive [Stevche Radevski]\n> \n> ## rendition-18.18.0\n> ### (2020-12-02)\n> \n> * Allow passing responsive values to datagrid width props [Stevche Radevski]\n> \n> ## rendition-18.17.2\n> ### (2020-12-01)\n> \n> * Update snapshots due to a Card change [JSReds]\n> \n> ## rendition-18.17.1\n> ### (2020-12-01)\n> \n> * Card: make body to be full height [JSReds]\n> \n> ## rendition-18.17.0\n> ### (2020-12-01)\n> \n> * Add star rating component [Kakhaber]\n> \n> ## rendition-18.16.0\n> ### (2020-11-23)\n> \n> * Completely revamp the development setup for rendition [Stevche Radevski]\n> \n> ## rendition-18.15.1\n> ### (2020-11-16)\n> \n> * Modal: Change the button margins to use the predefined spacing palette [Thodoris Greasidis]\n> \n> ## rendition-18.15.0\n> ### (2020-11-16)\n> \n> * Modal: Move the cancel button first for dangerous & warning actions [Thodoris Greasidis]\n> \n> ## rendition-18.14.0\n> ### (2020-11-16)\n> \n> * Allow passing checked items as a prop to Table [Stevche Radevski]\n> \n> ## rendition-18.13.4\n> ### (2020-11-16)\n> \n> * Fix accidental complete lodash import [Thodoris Greasidis]\n> \n> ## rendition-18.13.3\n> ### (2020-11-16)\n> \n> * Form: Remove the flaky Captcha sceenshot test [Thodoris Greasidis]\n> * Update react-simplemde-editor & snapshots for upstream versions [Thodoris Greasidis]\n> \n> ## rendition-18.13.2\n> ### (2020-10-29)\n> \n> * Updated snapshots [Graham McCulloch]\n> * Fix: Confirm only depends on the files it needs [Graham McCulloch]\n> \n> ## rendition-18.13.1\n> ### (2020-10-23)\n> \n> * Button: Preserve event during confirmation [Kakhaber]\n> \n> ## rendition-18.13.0\n> ### (2020-10-22)\n> \n> * Button: Add confirmation property [Kakhaber]\n> \n> ## rendition-18.12.2\n> ### (2020-10-21)\n> \n> * Tabs: changed interfaces and props [JSReds]\n> \n> ## rendition-18.12.1\n> ### (2020-10-20)\n> \n> * Fix Tabs typings [Stevche Radevski]\n> \n> ## rendition-18.12.0\n> ### (2020-10-19)\n> \n> * Add a Grid component [Stevche Radevski]\n> \n> ## rendition-18.11.3\n> ### (2020-10-14)\n> \n> * Added more documentation for JsonSchemaRenderer [Graham McCulloch]\n> \n> ## rendition-18.11.2\n> ### (2020-10-14)\n> \n> * fix: UI schema for JsonSchemaRenderer DropDownButton and ButtonGroup widgets [Graham McCulloch]\n> \n> ## rendition-18.11.1\n> ### (2020-10-13)\n> \n> * Add dark mode to storybook [Stevche Radevski]\n> \n> ## rendition-18.11.0\n> ### (2020-10-08)\n> \n> * Allow passing widget to extraFormats field [Stevche Radevski]\n> \n> ## rendition-18.10.2\n> ### (2020-09-30)\n> \n> * Resolve module path not relying on node_moules dir [Kakhaber]\n> \n> ## rendition-18.10.1\n> ### (2020-09-29)\n> \n> * Set tabpanel height so it stretches to full height [StefKors]\n> * Specify tabs width to fix layout problems [StefKors]\n> \n> ## rendition-18.10.0\n> ### (2020-09-24)\n> \n> * feat: Add ColorWidget for JsonSchemaRenderer [Graham McCulloch]\n> \n> ## rendition-18.9.2\n> ### (2020-09-22)\n> \n> * Markdown: Ignore decorators inside a code block [Kakhaber]\n> \n> ## rendition-18.9.1\n> ### (2020-09-21)\n> \n> * Add compact variation to tabs [StefKors]\n> \n> ## rendition-18.9.0\n> ### (2020-09-18)\n> \n> * Improve spacing for Modal and Select components [Stevche Radevski]\n> \n> ## rendition-18.8.4\n> ### (2020-09-17)\n> \n> * fix: Use widget's display name to reference the widget [Graham McCulloch]\n> \n</details>\n\n* Update dependencies [Alexis Svinartchouk]\n* Update @balena/lint to 5.3.0 [Alexis Svinartchouk]\n* Update webpack to v5 [Alexis Svinartchouk]\n* Fix typo in webpack.config.ts comment [Alexis Svinartchouk]\n* docs: fix quote marks [Aaron Shaw]\n* Disable screensaver while flashing (on balena-electron-env) [Alexis Svinartchouk]\n\n# v1.5.113\n## (2020-12-16)\n\n* Show the first error for each drive (not the last) [Alexis Svinartchouk]\n* Fix red leds not showing for failed devices [Alexis Svinartchouk]\n* docs: add documentation links [Aaron Shaw]\n* docs: update macOS version [Aaron Shaw]\n* Improve hover message when the drive is too small [Alexis Svinartchouk]\n* Update electron to v9.4.0 [Alexis Svinartchouk]\n* Update npm to v6.14.8 [Giovanni Garufi]\n* Update rgb leds colors [Alexis Svinartchouk]\n* Remove unmountOnSuccess setting [Alexis Svinartchouk]\n* Only show auto-updates setting on supported targets [Alexis Svinartchouk]\n* Remove dead code in settings modal [Alexis Svinartchouk]\n* Fix effective flashing speed calculation for compressed images [Alexis Svinartchouk]\n* Change some border colors to have higher contrast [Lorenzo Alberto Maria Ambrosi]\n\n<details>\n<summary> Update etcher-sdk from 5.1.10 to 5.1.11 [Alexis Svinartchouk] </summary>\n\n> ## etcher-sdk-5.1.11\n> ### (2020-12-07)\n> \n> * Don't use the O_SYNC flag for block devices, only O_DIRECT [Alexis Svinartchouk]\n> \n</details>\n\n\n<details>\n<summary> Update sys-class-rgb-led from 2.1.1 to 3.0.0 [Alexis Svinartchouk] </summary>\n\n> ## sys-class-rgb-led-3.0.0\n> ### (2020-12-03)\n> \n> * Add example etcher-pro rainbow animation [Alexis Svinartchouk]\n> * Use one setInterval instead of a loop for each led, t in seconds [Alexis Svinartchouk]\n> \n</details>\n\n# v1.5.112\n## (2020-12-02)\n\n* Add rendition and sys-class-rgb-led to repo.yml [Alexis Svinartchouk]\n\n<details>\n<summary> Update sys-class-rgb-led from 2.1.0 to 2.1.1 [Alexis Svinartchouk] </summary>\n\n> ## sys-class-rgb-led-2.1.1\n> ### (2020-12-01)\n> \n> * Replace resin-lint with @balena/lint [Alexis Svinartchouk]\n> * Update typescript to v4.1.2 [Alexis Svinartchouk]\n> * Add versionbot changelog [Alexis Svinartchouk]\n> \n</details>\n\n* Fix layout when the featured project is not showing [Alexis Svinartchouk]\n* Improve flashing error handling [Alexis Svinartchouk]\n* Fix modal content height on Windows [Alexis Svinartchouk]\n\n<details>\n<summary> Update etcher-sdk from 5.1.5 to 5.1.10 [Alexis Svinartchouk] </summary>\n\n> ## etcher-sdk-5.1.10\n> ### (2020-12-02)\n> \n> \n> <details>\n> <summary> Update balena-image-fs from 7.0.5 to 7.0.6 [Alexis Svinartchouk] </summary>\n> \n>> ### balena-image-fs-7.0.6\n>> #### (2020-12-02)\n>> \n>> \n>> <details>\n>> <summary> Update ext2fs from 3.0.4 to 3.0.5 [Alexis Svinartchouk] </summary>\n>> \n>>> #### node-ext2fs-3.0.5\n>>> ##### (2020-12-02)\n>>> \n>>> * Fix reading and discarding with offsets > 32 bits [Alexis Svinartchouk]\n>>> \n>> </details>\n>> \n>> \n> </details>\n> \n> \n> ## etcher-sdk-5.1.9\n> ### (2020-12-01)\n> \n> * Add repo.yml file [Alexis Svinartchouk]\n> * Update @balena/udif from 1.1.0 to 1.1.1 [Alexis Svinartchouk]\n> \n> <details>\n> <summary> Update zip-part-stream from 1.0.2 to 1.0.3 [Alexis Svinartchouk] </summary>\n> \n>> ### zip-part-stream-1.0.3\n>> #### (2020-11-30)\n>> \n>> * Add versionbot changelog [Alexis Svinartchouk]\n>> \n> </details>\n> \n> \n> <details>\n> <summary> Update node-raspberrypi-usbboot from 0.2.9 to 0.2.10 [Alexis Svinartchouk] </summary>\n> \n>> ### node-raspberrypi-usbboot-0.2.10\n>> #### (2020-11-30)\n>> \n>> * Update typescript to v4.1.2 [Alexis Svinartchouk]\n>> * Add versionbot changelog [Alexis Svinartchouk]\n>> \n> </details>\n> \n> \n> <details>\n> <summary> Update mountutils from 1.3.19 to 1.3.20 [Alexis Svinartchouk] </summary>\n> \n>> ### mountutils-1.3.20\n>> #### (2020-11-30)\n>> \n>> * Add versionbot changelog [Alexis Svinartchouk]\n>> \n> </details>\n> \n> \n> <details>\n> <summary> Update gzip-stream from 1.1.1 to 1.1.2 [Alexis Svinartchouk] </summary>\n> \n>> ### gzip-stream-1.1.2\n>> #### (2020-11-30)\n>> \n>> * Add versionbot changelog [Alexis Svinartchouk]\n>> \n> </details>\n> \n> \n> <details>\n> <summary> Update drivelist from 9.2.1 to 9.2.2 [Alexis Svinartchouk] </summary>\n> \n>> ### drivelist-9.2.2\n>> #### (2020-11-30)\n>> \n>> * Update typescript to v4.1.2 [Alexis Svinartchouk]\n>> * Add versionbot changelog [Alexis Svinartchouk]\n>> \n> </details>\n> \n> \n> <details>\n> <summary> Update blockmap from 4.0.2 to 4.0.3 [Alexis Svinartchouk] </summary>\n> \n>> ### blockmap-4.0.3\n>> #### (2020-11-30)\n>> \n>> * Update typescript to v4.1.2 [Alexis Svinartchouk]\n>> * Add versionbot changelog [Alexis Svinartchouk]\n>> \n> </details>\n> \n> \n> <details>\n> <summary> Update partitioninfo from 6.0.1 to 6.0.2 [Alexis Svinartchouk] </summary>\n> \n>> ### partitioninfo-6.0.2\n>> #### (2020-11-27)\n>> \n>> \n>> <details>\n>> <summary> Update file-disk from 8.0.0 to 8.0.1 [Alexis Svinartchouk] </summary>\n>> \n>>> #### file-disk-8.0.1\n>>> ##### (2020-11-26)\n>>> \n>>> * Add versionbot changelog [Alexis Svinartchouk]\n>>> \n>> </details>\n>> \n>> * Add versionbot changelog [Alexis Svinartchouk]\n>> \n> </details>\n> \n> \n> <details>\n> <summary> Update file-disk from 8.0.0 to 8.0.1 [Alexis Svinartchouk] </summary>\n> \n>> ### file-disk-8.0.1\n>> #### (2020-11-26)\n>> \n>> * Add versionbot changelog [Alexis Svinartchouk]\n>> \n>> ### file-disk-8.0.1\n>> #### (2020-11-26)\n>> \n>> * Add versionbot changelog [Alexis Svinartchouk]\n>> \n> </details>\n> \n> \n> <details>\n> <summary> Update balena-image-fs from 7.0.4 to 7.0.5 [Alexis Svinartchouk] </summary>\n> \n>> ### balena-image-fs-7.0.5\n>> #### (2020-11-27)\n>> \n>> \n>> <details>\n>> <summary> Update file-disk from 8.0.0 to 8.0.1 [Alexis Svinartchouk] </summary>\n>> \n>>> #### file-disk-8.0.1\n>>> ##### (2020-11-26)\n>>> \n>>> * Add versionbot changelog [Alexis Svinartchouk]\n>>> \n>> </details>\n>> \n>> \n>> <details>\n>> <summary> Update ext2fs from 3.0.3 to 3.0.4 [Alexis Svinartchouk] </summary>\n>> \n>>> #### node-ext2fs-3.0.4\n>>> ##### (2020-11-26)\n>>> \n>>> * Add versionbot changelog [Alexis Svinartchouk]\n>>> \n>> </details>\n>> \n>> \n>> <details>\n>> <summary> Update partitioninfo from 6.0.1 to 6.0.2 [Alexis Svinartchouk] </summary>\n>> \n>>> #### partitioninfo-6.0.2\n>>> ##### (2020-11-27)\n>>> \n>>> \n>>> <details>\n>>> <summary> Update file-disk from 8.0.0 to 8.0.1 [Alexis Svinartchouk] </summary>\n>>> \n>>>> ##### file-disk-8.0.1\n>>>> ###### (2020-11-26)\n>>>> \n>>>> * Add versionbot changelog [Alexis Svinartchouk]\n>>>> \n>>> </details>\n>>> \n>>> * Add versionbot changelog [Alexis Svinartchouk]\n>>> \n>> </details>\n>> \n>> * Add versionbot changelog [Alexis Svinartchouk]\n>> \n> </details>\n> \n> \n> ## etcher-sdk-5.1.8\n> ### (2020-11-26)\n> \n> * Add versionbot changelog [Alexis Svinartchouk]\n> \n> ## etcher-sdk-5.1.7\n> ### (2020-11-25)\n> \n> * Don't start opening drives in advance to avoid unhandled rejections [Alexis Svinartchouk]\n> * Update generated docs [Alexis Svinartchouk]\n> \n> ## etcher-sdk-5.1.6\n> ### (2020-11-24)\n> \n> * Do not unmount source drives [Alexis Svinartchouk]\n> * Factorize retrying transient errors [Alexis Svinartchouk]\n> * Retry opening files & block devices on transient errors [Alexis Svinartchouk]\n> * Update generated docs [Alexis Svinartchouk]\n> \n</details>\n\n* Set useContentSize to true so the size is the same on all platforms [Alexis Svinartchouk]\n\n# v1.5.111\n## (2020-11-23)\n\n* Warn when the source drive has no partition table [Alexis Svinartchouk]\n* Use a different icon when no source drive is available [Alexis Svinartchouk]\n* Allow selecting a locked SD card as the source drive [Alexis Svinartchouk]\n* Remove \"Validate write on success\" setting. Validation is always enabled, press the \"skip\" button to skip it. [Alexis Svinartchouk]\n* Update electron to v9.3.3 [Alexis Svinartchouk]\n* Update etcher-sdk to 5.1.1, use WASM ext2fs module [Alexis Svinartchouk]\n\n# v1.5.110\n## (2020-11-04)\n\n* Remove console.log in tests [Lorenzo Alberto Maria Ambrosi]\n* Fix URL not being selected with custom protocol [Lorenzo Alberto Maria Ambrosi]\n* Add skip function to validation [Lorenzo Alberto Maria Ambrosi]\n* Rework success screen [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.109\n## (2020-09-14)\n\n* Workaround elevation bug on Windows when the username contains an ampersand [Alexis Svinartchouk]\n\n# v1.5.108\n## (2020-09-10)\n\n* Fix content not loading when the app path contains special characters [Alexis Svinartchouk]\n\n# v1.5.107\n## (2020-09-04)\n\n* Re-enable ext partitions trimming on 32 bit Windows [Alexis Svinartchouk]\n* Rework system & large drives handling logic [Lorenzo Alberto Maria Ambrosi]\n* Reword macOS Catalina askpass message [Lorenzo Alberto Maria Ambrosi]\n* Add clone-drive workflow [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.106\n## (2020-08-27)\n\n* Disable ext partitions trimming on 32 bit windows until it is fixed [Alexis Svinartchouk]\n* Fix opening zip files from servers accepting Range headers [Alexis Svinartchouk]\n\n# v1.5.105\n## (2020-08-25)\n\n* Update etcher-sdk to 4.1.26 [Alexis Svinartchouk]\n* URL selector cancel button cancels ongoing url selection [Alexis Svinartchouk]\n* Spinner for URL selector modal [Alexis Svinartchouk]\n\n# v1.5.104\n## (2020-08-20)\n\n* Fix writing config file [Alexis Svinartchouk]\n* Update electron to v9.2.1 [Alexis Svinartchouk]\n\n# v1.5.103\n## (2020-08-18)\n\n* Update rendition  to ^17 [Alexis Svinartchouk]\n* Update electron to 9.2.0 [Alexis Svinartchouk]\n* Update etcher-sdk to ^4.1.23 [Alexis Svinartchouk]\n* Move linting and testing into package.json [Alexis Svinartchouk]\n* Set module: es2015 in tsconfig.json [Alexis Svinartchouk]\n* Replace native elevator with sudo-prompt on windows [Alexis Svinartchouk]\n* Don't import WeakMap polyfill in deep-map-keys [Alexis Svinartchouk]\n* Don't use lodash in child-writer.js [Alexis Svinartchouk]\n* Optimize svgs [Alexis Svinartchouk]\n* User regular stream in lzma-native instead of readable-stream [Alexis Svinartchouk]\n* Remove Bluebird [Alexis Svinartchouk]\n\n# v1.5.102\n## (2020-07-27)\n\n* Fix flashing truncated images, fix flashing large dmgs [Alexis Svinartchouk]\n* Electron 9.1.1 [Alexis Svinartchouk]\n* Remove bluebird from main process, reduce lodash usage [Alexis Svinartchouk]\n* Centralize imports in child-writer [Alexis Svinartchouk]\n* Split main process and child-writer js files [Alexis Svinartchouk]\n* Stop using request, replace it with already used axios [Alexis Svinartchouk]\n* Remove font awesome unused icons from the generated bundle [Alexis Svinartchouk]\n* Remove no longer used .sass-lint.yml [Alexis Svinartchouk]\n* Use tslib [Alexis Svinartchouk]\n* Use strict typescript compiler option [Alexis Svinartchouk]\n* Update rendition to ^16.1.1 [Alexis Svinartchouk]\n\n# v1.5.101\n## (2020-07-09)\n\n* Resize modal to show content appropriately [Lorenzo Alberto Maria Ambrosi]\n* Update etcher-sdk to v4.1.16 [Lorenzo Alberto Maria Ambrosi]\n* Convert sass to plain css [Lorenzo Alberto Maria Ambrosi]\n* Remove unused scss [Lorenzo Alberto Maria Ambrosi]\n* Remove unused warning in settings [Lorenzo Alberto Maria Ambrosi]\n* Refactor UI without bootstrap & flexboxgrid [Lorenzo Alberto Maria Ambrosi]\n* Restyle modals [Lorenzo Alberto Maria Ambrosi]\n* Remove bootstrap & flexboxgrid [Lorenzo Alberto Maria Ambrosi]\n* Rework and move flashing view elements [Lorenzo Alberto Maria Ambrosi]\n* Refactor UI grid to use rendition [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.100\n## (2020-06-22)\n\n* Update partitioninfo to 5.3.5 [Alexis Svinartchouk]\n* Add .vhd to the list of supported extensions, allow opening any file [Alexis Svinartchouk]\n* Update mocha to v8.0.1 [Alexis Svinartchouk]\n* Update electron-notarize to v1.0.0 [Alexis Svinartchouk]\n* Update electron to v9.0.4 [Alexis Svinartchouk]\n* Update etcher-sdk to v4.1.15 [Alexis Svinartchouk]\n* Sticky header in target selection table [Alexis Svinartchouk]\n* Update rendition to 15.2.1 [Alexis Svinartchouk]\n* Fix source-selector image height [Lorenzo Alberto Maria Ambrosi]\n* Update rendition to v15.0.0 [Lorenzo Alberto Maria Ambrosi]\n* Merge unsafe mode with new target selector [Lorenzo Alberto Maria Ambrosi]\n* Rework target selector modal [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.99\n## (2020-06-12)\n\n* Update node-raspberrypi-usbboot to 0.2.8 [Alexis Svinartchouk]\n* Update electron to 9.0.3 [Alexis Svinartchouk]\n* Inline all svgs [Alexis Svinartchouk]\n\n# v1.5.98\n## (2020-06-10)\n\n* Use between 2 and 256MiB for buffering depending on the number of drives [Alexis Svinartchouk]\n* Check that argument is an url or a regular file before opening [Alexis Svinartchouk]\n* Update etcher-sdk to ^4.1.13 [Alexis Svinartchouk]\n\n# v1.5.97\n## (2020-06-08)\n\n* Update electron to v9.0.2 [Alexis Svinartchouk]\n* Fix flash from url on windows [Alexis Svinartchouk]\n* Avoid random access in http sources [Alexis Svinartchouk]\n* Update etcher-sdk to ^4.1.8 [Alexis Svinartchouk]\n* Read image path from arguments, register `etcher://...` protocol [Alexis Svinartchouk]\n* Update etcher-sdk to ^4.1.6 [Alexis Svinartchouk]\n* Fix sudo-prompt promisification [Alexis Svinartchouk]\n* Allow skipping notarization when building package (dev) [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.96\n## (2020-06-03)\n\n* Fix ia32 builds for windows [Alexis Svinartchouk]\n* Remove writing speed from finish screen [Alexis Svinartchouk]\n* Add effective speed in flash results [Alexis Svinartchouk]\n* Update progress bar style [Alexis Svinartchouk]\n* Change font to SourceSansPro and fix hover color [Alexis Svinartchouk]\n* Update rendition to ^14.13.0 [Alexis Svinartchouk]\n* Remove unused styles [Alexis Svinartchouk]\n\n# v1.5.95\n## (2020-06-01)\n\n* spectron: Make tests pass on Windows Docker containers [Juan Cruz Viotti]\n\n# v1.5.94\n## (2020-05-27)\n\n* Stop checking file extensions [Alexis Svinartchouk]\n* Fix flash from url (broken in 1.5.92) [Alexis Svinartchouk]\n* Update etcher-sdk to ^4.1.4 [Alexis Svinartchouk]\n\n# v1.5.93\n## (2020-05-25)\n\n* Update electron-builder to v22.6.1 [Alexis Svinartchouk]\n* Strip out comments from generated code [Alexis Svinartchouk]\n* Update electron to v9.0.0 [Alexis Svinartchouk]\n\n# v1.5.92\n## (2020-05-22)\n\n* Use electron.app.getAppPath() instead of reading it from argv in catalina-sudo [Alexis Svinartchouk]\n* Disable asar packing on all platforms [Alexis Svinartchouk]\n* Remove unneeded fortawesome from main.scss [Alexis Svinartchouk]\n* Remove unneeded font formats [Alexis Svinartchouk]\n* Webpack everything, reduce package size [Alexis Svinartchouk]\n\n# v1.5.91\n## (2020-05-21)\n\n* Minor fix - Init isSourceDrive param in correct place [Lorenzo Alberto Maria Ambrosi]\n* Fix undefined image from DriveCompatibilityWarning [Rob Evans]\n\n# v1.5.90\n## (2020-05-20)\n\n* Update leds behaviour [Alexis Svinartchouk]\n\n# v1.5.89\n## (2020-05-13)\n\n* Fix drive selector modal padding [Alexis Svinartchouk]\n* Update all dependencies minor versions [Alexis Svinartchouk]\n* Update @types/node 12.12.24 -> 12.12.39 [Alexis Svinartchouk]\n* Update ts-loader 6 -> 7 [Alexis Svinartchouk]\n* Update sinon 8 -> 9 [Alexis Svinartchouk]\n* Update node-gyp 3 -> 6 [Alexis Svinartchouk]\n* Update lint-staged 9 -> 10 [Alexis Svinartchouk]\n* Update husky 3 -> 4 [Alexis Svinartchouk]\n* Remove no longer used html-loader dev dependency [Alexis Svinartchouk]\n* Update electron-notarize 0.1.1 -> 0.3.0 [Alexis Svinartchouk]\n* Remove no longer used chalk dev dependency [Alexis Svinartchouk]\n* Update @types/tmp 0.1.0 -> 0.2.0 [Alexis Svinartchouk]\n* Update @types/sinon 7 -> 9 [Alexis Svinartchouk]\n* Update @types/semver 6 -> 7 [Alexis Svinartchouk]\n* Update @types/mocha 5 -> 7 [Alexis Svinartchouk]\n\n# v1.5.88\n## (2020-05-12)\n\n* Update roboto-fontface 0.9.0 -> 0.10.0 [Alexis Svinartchouk]\n* Update rendition 12 -> 14, styled-system and styled-components 4 -> 5 [Alexis Svinartchouk]\n* Update electron-updater 4.0.6 -> 4.3.1 [Alexis Svinartchouk]\n* Update redux 3 -> 4 [Alexis Svinartchouk]\n* Update debug 3 -> 4 [Alexis Svinartchouk]\n* Update semver 5 -> 7 [Alexis Svinartchouk]\n* Update tmp 0.1.0 -> 0.2.1 [Alexis Svinartchouk]\n* Update uuid v3 -> v8 [Alexis Svinartchouk]\n\n# v1.5.87\n## (2020-05-12)\n\n* Update etcher-sdk to ^4.1.3 to fix issues with some bz2 files [Alexis Svinartchouk]\n\n# v1.5.86\n## (2020-05-06)\n\n* Fix theme warnings [Alexis Svinartchouk]\n\n# v1.5.85\n## (2020-05-05)\n\n* Prefer balena-etcher to etcher-bin on Arch Linux [Alexis Svinartchouk]\n\n# v1.5.84\n## (2020-05-04)\n\n* Including Arch / Manjaro install instructions [Tom]\n* Fix notification icon path [Alexis Svinartchouk]\n\n# v1.5.83\n## (2020-04-30)\n\n* Decompress images before flashing, remove trim setting, trim ext partitions [Alexis Svinartchouk]\n\n# v1.5.82\n## (2020-04-24)\n\n* Allow http/https only for Flash from URL [Lorenzo Alberto Maria Ambrosi]\n* Add generic error's message [Lorenzo Alberto Maria Ambrosi]\n* Refactor buttons style [Lorenzo Alberto Maria Ambrosi]\n* Add flash from url workflow [Lorenzo Alberto Maria Ambrosi]\n* Add staging percentage for v1.5.81 [Lorenzo Alberto Maria Ambrosi]\n* Trigger update for v1.5.81 [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.81\n## (2020-04-14)\n\n* Add average speed in flash results [Lorenzo Alberto Maria Ambrosi]\n* docs: Update macOS drive recovery command [Wilson de Farias]\n* Update etcher-sdk to use direct IO [Alexis Svinartchouk]\n\n# v1.5.80\n## (2020-03-24)\n\n* Use zoomFactor to scale contents in fullscreen mode [Lorenzo Alberto Maria Ambrosi]\n* Update electron to v7.1.14 [Alexis Svinartchouk]\n* Fix sass files path for lint-sass [Alexis Svinartchouk]\n\n# v1.5.79\n## (2020-02-20)\n\n* Remove \"Download the React DevTools for a better development experience\" message [Alexis Svinartchouk]\n* Fix error when launching from terminal when installed via apt. [Alois Klink]\n\n# v1.5.78\n## (2020-02-19)\n\n* Update drivelist to 8.0.10 to fix parsing lsblk --pairs [Alexis Svinartchouk]\n\n# v1.5.77\n## (2020-02-17)\n\n* Fix error message not being shown on write error [Alexis Svinartchouk]\n* The RGBLed module has been moved to a separate repository [Alexis Svinartchouk]\n\n# v1.5.76\n## (2020-02-05)\n\n* Prefix temp permissions script name [Lorenzo Alberto Maria Ambrosi]\n* Fix image drop zone, remove react-dropzone dependency [Alexis Svinartchouk]\n* Update etcher-sdk to ^2.0.17 [Alexis Svinartchouk]\n\n# v1.5.75\n## (2020-02-05)\n\n* Initialize leds object map [Omar López]\n\n# v1.5.74\n## (2020-02-04)\n\n* Etcher pro leds feature [Alexis Svinartchouk]\n* Compress deb package with bzip instead of xz [Alexis Svinartchouk]\n* Update electron to 7.1.11 [Alexis Svinartchouk]\n* Sort devices by device path on Linux [Alexis Svinartchouk]\n\n# v1.5.73\n## (2020-01-28)\n\n* Update electron to v7.1.10 [Alexis Svinartchouk]\n\n# v1.5.72\n## (2020-01-27)\n\n* Remove no longer used angular svg-icon component [Alexis Svinartchouk]\n* Remove no longer used closestUnit angular filter [Alexis Svinartchouk]\n\n# v1.5.71\n## (2020-01-14)\n\n* Update resin-corvus to 2.0.5 [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.70\n## (2019-12-13)\n\n* Make header draggable again [Lorenzo Alberto Maria Ambrosi]\n* Refactor drive selector and confirm modal to React [Lorenzo Alberto Maria Ambrosi]\n* Rework lib/gui/app/styled-components to typescript [Alexis Svinartchouk]\n* Convert FlashAnother & FlashResults to typescript [Lorenzo Alberto Maria Ambrosi]\n* Use React instead of Angular for image selection [Lucian]\n* Convert the drive selection step to React [Thodoris Greasidis]\n* chore: move flash step to React [Stevche Radevski]\n* Use React instead of Angular for image selection [Lucian]\n\n# v1.5.69\n## (2019-12-10)\n\n* Don't add --no-sandbox when ELECTRON_RUN_AS_NODE true [Alexis Svinartchouk]\n\n# v1.5.68\n## (2019-12-08)\n\n* Add version in settings modal [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.67\n## (2019-12-06)\n\n* Fix elevation on macos in development [Alexis Svinartchouk]\n\n# v1.5.66\n## (2019-12-03)\n\n* Update spectron to ^8 [Alexis Svinartchouk]\n* Update dependencies, get node-usb from npm [Alexis Svinartchouk]\n* Update nan to ^2.14 [Alexis Svinartchouk]\n* Use the same entrypoint for etcher and the child writer [Alexis Svinartchouk]\n* Require angular-mocks only when needed [Alexis Svinartchouk]\n* Remove no longer needed pkg dev dependency [Alexis Svinartchouk]\n* Update mocha, remove nock [Alexis Svinartchouk]\n* Remove no longer needed xml2js [Alexis Svinartchouk]\n* Remove node-pre-gyp patch that is no longer needed with electron 6 [Alexis Svinartchouk]\n* Update electron-mocha to ^8.1.2, remove acorn [Alexis Svinartchouk]\n* Update electron to 6.0.10 [Alexis Svinartchouk]\n\n# v1.5.65\n## (2019-12-02)\n\n* Convert settings modal to typescript [Lorenzo Alberto Maria Ambrosi]\n* Refactor settings page into modal [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.64\n## (2019-11-22)\n\n* Use bash instead of sh for running the elevated process on Linux and Mac [Alexis Svinartchouk]\n\n# v1.5.63\n## (2019-11-08)\n\n* Introduce an FAQ file [Dimitrios Lytras]\n\n# v1.5.62\n## (2019-11-06)\n\n* Update drivelist to 8.0.9 [Alexis Svinartchouk]\n\n# v1.5.61\n## (2019-11-05)\n\n* Notarize app on macOS [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.60\n## (2019-10-18)\n\n* Upgrade ext2fs to 1.0.30 [Matthew McGinn]\n\n# v1.5.59\n## (2019-10-14)\n\n* Catch console log messages from SafeWebView [Roman Mazur]\n\n# v1.5.58\n## (2019-10-10)\n\n* Remove leftover GH-pages configuration file [Dimitrios Lytras]\n\n# v1.5.57\n## (2019-09-16)\n\n* Fix entrypoint when options are passed to electron [Alexis Svinartchouk]\n\n# v1.5.56\n## (2019-08-20)\n\n* Fix windows portable download [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.55\n## (2019-08-19)\n\n* Update etcher-sdk to ^2.0.13 [Alexis Svinartchouk]\n\n# v1.5.54\n## (2019-08-07)\n\n* Fix auto-updater check for updates [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.53\n## (2019-08-06)\n\n* Allow typescript files [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.52\n## (2019-07-22)\n\n* Don't use wmic's ProviderName if it's empty [Alexis Svinartchouk]\n\n# v1.5.51\n## (2019-06-28)\n\n* Update sudo-prompt to ^9.0.0 [Alexis Svinartchouk]\n\n# v1.5.50\n## (2019-06-13)\n\n* Option for trimming ext partitions on raw images [Alexis Svinartchouk]\n\n# v1.5.49\n## (2019-06-13)\n\n* Make window size configurable [Alexis Svinartchouk]\n\n# v1.5.48\n## (2019-06-13)\n\n* Don't use sudo-prompt when already elevated [Alexis Svinartchouk]\n\n# v1.5.47\n## (2019-06-10)\n\n* Rework drive-selector with react + rendition [Lorenzo Alberto Maria Ambrosi]\n* Use rendition theme property for step buttons [Lorenzo Alberto Maria Ambrosi]\n* Upgrade styled-system to v4.1.0 [Lorenzo Alberto Maria Ambrosi]\n* Upgrade rendition to v8.7.2 [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.46\n## (2019-06-09)\n\n* Update ext2fs to 1.0.29 [Alexis Svinartchouk]\n\n# v1.5.45\n## (2019-06-04)\n\n* Empty commit to trigger build [Alexis Svinartchouk]\n\n# v1.5.44\n## (2019-06-03)\n\n* Fix elevation on windows when the path contains \"&\" or \"'\" [Alexis Svinartchouk]\n\n# v1.5.43\n## (2019-05-28)\n\n* Revert \"Include sass in webpack configs\" [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.42\n## (2019-05-28)\n\n* Include sass in webpack configs [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.41\n## (2019-05-27)\n\n* waffle.io removal and adding a link to the license [Mateusz Hajder]\n\n# v1.5.40\n## (2019-05-24)\n\n* windows installer and portable version support both ia32 and x64 [Alexis Svinartchouk]\n\n# v1.5.39\n## (2019-05-14)\n\n* Add clean-shrinkwrap script to postshrinkwrap step [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.38\n## (2019-05-13)\n\n* Add mention to usbboot compatibility [Carlo Maria Curinga]\n\n# v1.5.37\n## (2019-05-13)\n\n* Bump react dependency to v16.8.5 [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.36\n## (2019-05-13)\n\n* Update etcher-sdk to ^2.0.9 [Alexis Svinartchouk]\n\n# v1.5.35\n## (2019-05-10)\n\n* Downgrade electron 4.1.5 -> 3.1.9 [Alexis Svinartchouk]\n\n# v1.5.34\n## (2019-05-09)\n\n* Use https url for fetching config, avoid redirection [Alexis Svinartchouk]\n* win32: fix running diskpart when the tmp file path contains spaces [Alexis Svinartchouk]\n\n# v1.5.33\n## (2019-04-30)\n\n* Fix gzipped files verification percentage and dmg verification. [Alexis Svinartchouk]\n\n# v1.5.32\n## (2019-04-30)\n\n* Export NPM_VERSION variable in Makefile [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.31\n## (2019-04-29)\n\n* Update etcher-sdk to ^2.0.3 [Alexis Svinartchouk]\n* Update electron to 4.1.5 [Alexis Svinartchouk]\n\n# v1.5.30\n## (2019-04-24)\n\n* Don't show a dialog when the write fails. [Alexis Svinartchouk]\n\n# v1.5.29\n## (2019-04-19)\n\n* Add support for auto-updating feature [Giovanni Garufi]\n\n# v1.5.28\n## (2019-04-18)\n\n* Update electron-builder to ^20.40.2 [Alexis Svinartchouk]\n* Update etcher-sdk to ^2.0.1 [Alexis Svinartchouk]\n\n# v1.5.27\n## (2019-04-16)\n\n* (Windows): Fix reading images from network drives when the tmp dir has spaces [Alexis Svinartchouk]\n\n# v1.5.26\n## (2019-04-12)\n\n* (Windows): Fix reading images from network drives containing non ascii characters [Alexis Svinartchouk]\n\n# v1.5.25\n## (2019-04-09)\n\n* New parameter in webview for opt-out analytics [Lorenzo Alberto Maria Ambrosi]\n\n# v1.5.24\n## (2019-04-05)\n\n* Update resin-corvus to ^2.0.3 [Alexis Svinartchouk]\n\n# v1.5.23\n## (2019-04-03)\n\n* Configure versionbot to publish repo metadata to github pages [Giovanni Garufi]\n\n# v1.5.22\n## (2019-04-02)\n\n* (Windows): Use full path to wmic as some systems don't have it in their PATH [Alexis Svinartchouk]\n\n# v1.5.21\n## (2019-04-02)\n\n* Fix error when config.analytics was undefined [Alexis Svinartchouk]\n\n# v1.5.20\n## (2019-04-01)\n\n* Don't try to flash when no device is selected [Alexis Svinartchouk]\n* Reformat changelog [Giovanni Garufi]\n* Avoid \"Error: There is already a flash in progress\" errors [Alexis Svinartchouk]\n\n# v1.5.19\n## (2019-03-28)\n\n* Update resin-corvus to ^2.0.2 [Alexis Svinartchouk]\n* Better reporting of unhandled rejections to sentry [Alexis Svinartchouk]\n\n# v1.5.18\n## (2019-03-26)\n\n* Update build scripts [Giovanni Garufi]\n\n## v1.5.17 - 2019-03-25\n\n### Misc\n\n- Automatically publish github release from CI\n\n## v1.5.16 - 2019-03-25\n\n### Misc\n\n- Add repo.yml\n\n## v1.5.15 - 2019-03-20\n\n### Misc\n\n- Show the correct logo on usbboot devices on Ubuntu\n\n## v1.5.14 - 2019-03-20\n\n### Misc\n\n- Update etcher-sdk to ^1.3.10\n\n## v1.5.13 - 2019-03-18\n\n### Misc\n\n- Update build scripts\n\n## v1.5.12 - 2019-03-15\n\n### Misc\n\n- Update build scripts\n\n## v1.5.11 - 2019-03-12\n\n### Misc\n\n- Fixed broken Hombrew cask link for etcher\n- Remove no longer used travis and appveyor configs\n\n## v1.5.10 - 2019-03-12\n\n### Misc\n\n- Update resin-scripts\n\n## v1.5.9 - 2019-03-05\n\n### Misc\n\n- Update etcher-sdk to 1.3.0\n\n## v1.5.8 - 2019-03-01\n\n### Misc\n\n- Update ext2fs to 1.0.27\n\n## v1.5.7 - 2019-03-01\n\n### Fixes\n\n- Update docs\n- Fix disappearing modal window\n\n### Misc\n\n- Fix blurred background image\n\n## v1.5.6 - 2019-02-28\n\n### Misc\n\n- Target electron 3 runtime in babel options\n\n## v1.5.5 - 2019-02-28\n\n### Misc\n\n- Don't pass undefined sockets to ipc.server.emit()\n- Fix error when event.dataTransfer.files is empty\n- Fix error message not showing when an unsupported image is selected\n- Avoid `Invalid percentage` exceptions\n- Update etcher-sdk to 1.1.0\n\n## v1.5.4 - 2019-02-27\n\n### Misc\n\n- Add missing step for submodule cloning in README\n\n## v1.5.3 - 2019-02-27\n\n### Misc\n\n- Throw error if no commit is annotated with a changelog entry\n\n## v1.5.2 - 2019-02-26\n\n- Enable versionist editVersion\n\n## v1.5.1 - 2019-02-22\n\n### Misc\n\n- Removed lodash dependency in versionist.conf.js\n\n## v1.5.0 - 2019-02-16\n\n### Misc\n\n- Reworked flashing logic with etcher-sdk\n- Add support for flashing Raspberry Pi CM3+\n- Upgrade to Electron v3.\n- Upgrade to NPM 6.7.0\n- Fix incorrect drives list on Linux\n- Changed “Drive Contains Image” to “Drive Mountpoint Contains Image”\n- Removed etcher-cli\n\n## v1.4.9 - 2018-12-19\n\n### Fixes\n\n- Fix update notifier error popping up on v1.4.1->1.4.8\n\n### Misc\n\n- Added React component for the Flash Results button\n- Added React component for the Flash Another button\n- Restyle success screen and enlarge UI elements\n- Use https for fetching sub modules\n- Add `.wic` image extension as supported format\n\n## v1.4.8 - 2018-11-23\n\n### Features\n\n- Added featured-project while flashing\n\n### Fixes\n\n- Moved back the write cancel button\n- Reject drives with null size (fixes pretty-bytes error)\n\n## v1.4.7 - 2018-11-12\n\n### Fixes\n\n- Fix typo in contributing guidelines\n- Modify versionist.conf.js to match new internal commit guidelines\n\n### Misc\n\n- Rename etcher to balena-etcher\n- Convert Select Image button to Rendition\n\n## v1.4.6 - 2018-10-28\n\n### Fixes\n\n- Provide a Buffer to xxhash.Stream\n- Fix 64 bit detection on arm\n- Fix incorrect file constraint path\n- Fix flash cancel button interaction\n\n### Misc\n\n- Add new balena.io logos\n- Use Resin CI scripts to build Etcher\n- Enable React lint rules\n- Convert Progress Button to Rendition\n\n## v1.4.5 - 2018-10-11\n\n### Features\n\n- Center content independent to window resolution.\n- Add electron-native file-picker component.\n- Hide unsafe mode option toggle with an env var.\n- Use new design background color and drive step size ordering.\n- Add a convenience Storage class on top of localStorage.\n- Introduce env var to toggle autoselection of all drives.\n- Add font-awesome.\n- Add support for configuration files\n- Use GTK-3 darkTheme mode.\n- Add environment variable to toggle fullscreen.\n- Allow blacklisting of drives through and environment variable ETCHER_BLACKLISTED_DRIVES.\n- Show selected drives below drive selection step.\n- Add a button to cancel the flash process.\n- Download usbboot drivers installer when clicking a driverless usbboot device on Windows.\n- Allow disabling links and hiding help link with an env var.\n\n### Fixes\n\n- Add \"make webpack\" to travis-ci build script\n- Makefile: Don't use tilde in rpm versions\n- Change Spectron port so not to overlap with other builds\n- Fix multi-writes analytics by reusing existing logic in multi-write events.\n- Load usbboot adapter on start on GNU/Linux if running as root.\n\n### Misc\n\n- Update drivelist to v6.4.2\n- Add instructions for installing and uninstalling on Solus.\n\n## v1.4.4 - 2018-04-24\n\n### Fixes\n\n- Don't display status dots with a quantity of zero on success screen\n- Correct wording of flash status to use \"successful\" instead of \"succeeded\"\n- Keep single drive-image pairs with warnings selected\n\n### Misc\n\n- Improve notification messages\n\n## v1.4.3 - 2018-04-19\n\n### Fixes\n\n- Fix blob handling for usbboot\n\n## v1.4.2 - 2018-04-18\n\n### Features\n\n- Make the progress button blue on verification\n- Display succeeded and failed devices on finish screen\n\n### Fixes\n\n- Exclude RAID devices from drive selection list\n- Display untitled device when device lacks description\n- Prefix multiple devices label with quantity\n- Fix handling of errors over IPC\n- Fix usbboot blob loading\n- Revert using native binding to clean disks on Windows\n\n## v1.4.1 - 2018-04-10\n\n### Fixes\n\n- Exclude package.json from UI bundle\n\n## v1.4.0 - 2018-04-05\n\n### Features\n\n- Move the drive selector warning dialog to the flash step\n- Display image size for comparison if drive is too small\n- Implement writing to multiple destinations simultaneously\n- Add colorised multi-writes progress status dots\n- Move CLI write preparation logic into SDK\n- Make the drive-selector button orange on warnings\n- Warn the user on selection of large drives\n- Consolidate low-level components into Etcher SDK\n- Use native code to clean drives on Windows\n- Increase UV_THREADPOOL_SIZE to allocate 4 threads per CPU\n- Add icon next to drive size when compatibility warnings exist\n- Display number of active devices while flashing in CLI\n- Replace CRC32 checksums with SHA512\n- Enable usbboot on Linux if run as root\n\n### Fixes\n\n- Improve spacing to the drive-selector warning/error labels\n- Line wrap selector size subtitles wholly\n- Hide the size label given multiple devices\n- Use correct usbboot blob path in AppImages\n- Fix EINVAL error on Linux\n- Fix enabling debug output\n- Fix DevTools opening in docked mode\n- Fix menu's application name\n- Fix \"Array buffer allocation failed\" when flashing some .dmg images\n- Log the banner load event to analytics\n- Warn on usbboot load error in the console on Linux\n- Ensure image/drive size is displayed on new line\n- Don't force-inherit process environment on Windows\n\n### Misc\n\n- Replace Helvetica as the main font with Roboto\n- Update Electron to v1.7.13\n- Add spacing to the drive warning icon\n- Use multi-drive methods with drive-list warning button\n- Remove unused & deprecated robot protocol\n- Update copyright years\n- Update instructions in ISSUE_TEMPLATE\n- Use Concourse CI for automated release builds\n- Only publish production packages to Bintray (remove devel)\n- Replace Gitter with Resin.io Forums for support\n- Add support for arm64 / armv8 / aarch64 in build scripts\n- Add descriptive name to modal popup windows\n\n## v1.3.1 - 2018-01-23\n\n### Fixes\n\n- Fix \"stdout maxBuffer\" error on Linux\n- Fix Etcher not working / crashing on older Windows systems\n- Fix not all partitions being unmounted after flashing on Linux\n- Fix selection of images in folders with file extension on Mac OS\n\n### Misc\n\n- Update Electron to v1.7.11\n\n## v1.3.0 - 2018-01-04\n\n### Features\n\n- Display connected Compute Modules even if Windows doesn't have the necessary drivers to act on them\n- Add read/write retry delays with backoff to ...\n- Add native application menu (which fixes OS native window management shortcuts not working)\n\n### Fixes\n\n- Fix \"Couldn't scan drives\" error\n- Ensure the writer process dies when the GUI application is killed\n- Run elevated writing process asynchronously on Windows\n- Fix trailing space in environment variables during Windows elevation\n- Don't send analytics events when attempting to toggle a disabled drive\n- Fix handling of transient write errors on Linux (EBUSY)\n- Fix runaway perl process in drivelist on Mac OS\n\n### Misc\n\n- Update Electron from v1.7.9 to v1.7.10\n- Remove Angular dependency from image-writer\n\n## v1.2.1 - 2017-12-06\n\n### Fixes\n\n- Fix handling of temporary read/write errors\n- Don't send initial Mixpanel events before \"Anonymous Tracking\" settings are loaded\n- Fix verification step reading from the cache\n\n## v1.2.0 - 2017-11-22\n\n### Features\n\n- Display actual write speed\n- Add the progress and status to the window title.\n- Add a sudo-prompt upon launch on Linux-based systems.\n- Add optional progress bars to drive-selector drives.\n- Increase the flashing speed of usbboot discovered devices.\n- Add eye candy to usbboot initialized devices.\n- Integrate Raspberry Pi's usbboot technology.\n\n### Fixes\n\n- Fix bzip2 streaming with the new pipelines\n- Remove Linux elevation meant for usbboot.\n- Fix `LIBUSB_ERROR_NO_DEVICE` error at the end of usbboot.\n- Gracefully handle scenarios where a USB drive is disconnected halfway through the usbboot procedure.\n- Make sure the progress button is always rounded.\n- Fix permission denied issues when XDG_RUNTIME_DIR is mounted with the `noexec` option.\n- Fix Etcher being unable to read certain zip files\n- Fix \"Couldn't scan the drives: An unknown error occurred\" error when there is a drive locked with BitLocker.\n- Fix \"Missing state eta\" error when speed is zero\n- Fix \"Stuck on Starting...\" error\n- Fix situations where the process would get stuck while flashing\n\n### Misc\n\n- Add the Python version (2.7) to the CONTRIBUTING doc.\n- Remove duplicate debug enabling in usbboot module.\n- Update Electron to v1.7.9\n- Retry ejection various times before giving up on Windows.\n- Try to use `$XDG_RUNTIME_DIR` to extract temporary scripts on GNU/Linux.\n\n## v1.1.2 - 2017-08-07\n\n### Features\n\n- Add support for `.rpi-sdcard` images\n\n### Fixes\n\n- Avoid \"broken\" icon when selecting a zip image archive with invalid SVG\n- Fix `UNABLE_TO_GET_ISSUER_CERT_LOCALLY` error at startup when behind certain proxies\n- Fix `EHOSTDOWN` error at startup\n- Display a user-friendly error message if the user is not in the sudoers file\n- Make archive-embedded SVG icons work again\n- Fix \"imageBasename is not defined\" error on the CLI\n- Fix various drive scanning Windows errors\n\n### Misc\n\n- Improve Windows drive detection error codes.\n\n## v1.1.1 - 2017-07-25\n\n### Fixes\n\n- Prevent \"percentage above 100%\" errors on DMG images\n- Fix Etcher not starting flashes in AppImages\n- Fix most \"Unmount failed\" errors on macOS\n\n## v1.1.0 - 2017-07-20\n\n### Features\n\n- Add image name, drive name, and icon to OS notifications\n- Add support for `.sdcard` images\n- Start publishing RPM packages\n- Generate single-binary portable installers on Windows\n- Show friendlier error dialogs when opening an image results in an error\n- Generate one-click Windows NSIS installers\n- Show the application version in the WebView banners\n- Show a warning message if the selected image has no partition table\n- Make use of `pkg` to package the Etcher CLI\n- Send anonymous analytics about package types\n- Minor style improvements to the fallback success page banner\n- Turn the update notifier modal into a native dialog\n\n### Fixes\n\n- Fix \"You don't have access to this resource\" error at startup when behind a firewall\n- Fix `UNABLE_TO_VERIFY_LEAF_SIGNATURE` error at startup when behind a proxy\n- Reset webview after navigating away from the success screen\n- Fix occasional increased CPU usage because of perl regular expression in macOS\n- Don't install to `C:\\Program Files (x86)` on 64-bit Windows systems\n- Fix \"file is not accessible\" error when flashing an image that lives inside a directory whose name is UTF-16 encoded on Windows.\n- Fix various interrelated Windows `.bat` spawning issues\n- Fix 0.0 GB Windows drive detection issues\n- Cleanup drive detection temporary scripts in GNU/Linux and macOS\n- Ensure no analytics events are sent if error reporting is disabled\n- Retry various times on `EAGAIN` when spawning drive scanning scripts\n- Don't break up size numbers in the drive selector\n\n### Misc\n\n- Remove \"Advanced\" settings subtitle\n- Remove support for the `ETCHER_DISABLE_UPDATES` environment variable\n- Swap speed and time below the flashing progress bar\n\n## v1.0.0 - 2017-05-12\n\n### Features\n\n- Implement a dynamic finish page.\n- Display nicer error dialog when reading an invalid image.\n\n### Fixes\n\n- Prevent drive from getting re-mounted in macOS even when the unmount on success setting is enabled.\n- Fix `ECONNRESET` and `ECONNREFUSED` errors when checking for updates on unstable connections.\n- Fix application stuck at \"Starting...\" on Windows.\n- Fix error on startup when Windows username contained an ampersand.\n\n## v1.0.0-rc.5 - 2017-05-02\n\n### Fixes\n\n- Fix various elevation issues on Windows\n- Treat unknown images as octet stream\n- Fix uncaught errors when cancelling elevation requests on Windows when the system's language is not English.\n\n## v1.0.0-rc.4 - 2017-04-22\n\n### Fixes\n\n- Fix \"Unmount failed\" on Windows where the PC is connected to network drives.\n- Various fixes for when drive descriptions contain special characters.\n\n### Misc\n\n- Show a friendly user message on EIO after many retries.\n- Show user friendly messages for `EBUSY, read` and `EBUSY, write` errors on macOS.\n\n## v1.0.0-rc.3 - 2017-04-14\n\n### Fixes\n\n- Show a user friendly message when the drive is unplugged half-way through.\n- Fix \"UNKNOWN: unknown error\" error when unplugging an SD Card from an internal reader on Windows.\n- Fix \"function createError(opts) {}\" error on validation failure.\n- Fix \"Unmount failed, invalid drive\" error on Windows.\n- Fix Apple disk image detection & streaming.\n\n### Misc\n\n- Improve error reporting accuracy.\n\n## v1.0.0-rc.2 - 2017-04-11\n\n### Fixes\n\n- Display a user error if the image is no longer accessible when the writer starts.\n- Prevent uncaught `EISDIR` when dropping a directory to the application.\n- Fix \"Path must be a string. Received undefined\" when selecting Apple images.\n- Don't interpret certain ISO images as unsupported.\n\n## v1.0.0-rc.1 - 2017-04-10\n\n### Features\n\n- Add support for Apple Disk images.\n- Add the un-truncated drive description to the selected drive step tooltip.\n- Prevent flashing an image that is larger than the drive with the CLI.\n\n### Fixes\n\n- Prevent progress button percentage to exceed 100%.\n- Don't print stack traces by default in the CLI.\n- Prevent blank application when sending SIGINT on GNU/Linux and macOS.\n- Fix unmounting freezing in macOS.\n- Fix GNU/Linux udev error when `net.ifnames` is set.\n- Fix `ENOSPC` image alignment errors.\n- Fix errors when unplugging drives exactly when the drive scanning scripts are running.\n- Fix several unmount related issues in all platforms.\n- Fix \"rawr i'm a dinosaur\" bzip2 error.\n\n### Misc\n\n- Make errors more user friendly throughout the application.\n- Don't report \"invalid archive\" errors to TrackJS.\n- Stop drive scanning loop if an error occurs.\n- Don't include user paths in Mixpanel analytics events.\n- Provide a user friendly error message when no polkit authentication agent is available on the system.\n- Show friendly drive name instead of device name in the main screen.\n- Start reporting errors to Sentry instead of to TrackJS.\n\n## v1.0.0-beta.19 - 2017-02-24\n\n### Features\n\n- Show warning when user tries to flash a Windows image\n- Update the image step icon with an hexagonal \"plus\" icon.\n- Update main page design to its new style.\n- Swap the order of the drive and image selection steps.\n\n### Fixes\n\n- Fix `transformRequest` error at startup when not connected to the internet, or when on an unstable connection.\n- Prevent flashing the drive where the source image is located.\n- Fix text overflowing on tooltips.\n- Don't ignore errors coming from the Windows drive detection script.\n- Omit empty SD Card readers in the drive selector on Windows.\n- Fix \"Error: Command Failed\" error when unmounting on Windows.\n- Fix duplicate error messages on some errors.\n- Fix 'MySQL' is not recognised as an internal or external command error on Windows.\n- Ignore `stderr` output from drive detection scripts if they exit with code zero.\n\n### Misc\n\n- Improve validation error message.\n- Emit an analytics event on `ENOSPC`.\n- Normalize button text casing.\n- Don't auto select system drives in unsafe mode.\n- Use a OS dialog to show the \"exit while flashing\" warning.\n- Capitalize every text throughout the application.\n\n## v1.0.0-beta.18 - 2017-01-16\n\n### Features\n\n- Improve Etcher CLI error messages.\n- Replace the `--robot` CLI option with an `ETCHER_CLI_ROBOT` environment variable.\n- Sort supported extensions alphabetically in the image file-picker.\n- Label system drives in the drive-list widget.\n- Show available Etcher version in the update notifier.\n- Confirm before user quits while writing.\n- Add a changelog link to the update notifier modal.\n- Make the image file picker attach to the main window (as a real modal).\n\n### Fixes\n\n- Fix alignment of single call to action buttons inside modals.\n- Fix \"Invalid message\" error caused by the IPC client emitting multiple JSON objects as a single message.\n- Fix \"This key is already associated with an element of this collection\" error when multiple partitions point to the same drive letter on Windows.\n- Fix system drives detected as removable drives on Mac Mini.\n- Fix sporadic \"EIO: i/o error, read\" errors during validation.\n- Fix \"EIO: i/o error, write\" error.\n\n## v1.0.0-beta.17 - 2016-11-28\n\n### Fixes\n\n- Fix command line arguments not interpreted correctly when running the CLI with a custom named NodeJS binary.\n- Wrap drive names and descriptions in the drive selector widget.\n- Allow the user to press ESC to cancel a modal dialog.\n- Fix \"Can't set the flashing state when not flashing\" error.\n- Fix writing process remaining alive after the GUI is closed.\n- Check available permissions in the CLI early on.\n- Fix `this.log is not a function` error when clicking \"flash again\".\n- Fix duplicate drives in Windows.\n- Fix drive scanning exceptions on GNU/Linux systems with `net.ifnames` enabled.\n- Fix `0x80131700` error when scanning drives on Windows.\n- Fix internal SDCard drive descriptions.\n- Fix unmount issues in GNU/Linux and OS X when paths contain spaces.\n- Fix \"Not Enough Space\" error when flashing unaligned images.\n- Fix `at least one volume could not be unmounted` error in OS X.\n\n## v1.0.0-beta.16 - 2016-10-28\n\n### Features\n\n- Use info icon instead of \"SHOW FULL FILE NAME\" in first step.\n- Display image path base name as a tooltip on truncated image name.\n- Add support for `etch` images.\n\n### Fixes\n\n- Fix Etcher leaving zombie processes behind in GNU/Linux.\n- Prevent escaping issues during elevation by surrounding paths in double quotes.\n- Fix \"Unexpected end of JSON\" error in Windows.\n- Fix drag and drop not working anymore.\n- Don't clear selection state when re-selecting an image.\n\n### Misc\n\n- Publish standalone Windows builds.\n\n## v1.0.0-beta.15 - 2016-09-26\n\n### Features\n\n- Allow the user to disable auto-update notifications with an environment variable.\n- Allow images to declare a recommended minimum drive size.\n\n### Fixes\n\n- Fix flashing never starting after elevation in GNU/Linux.\n- Fix sporadic EPERM write errors on Windows.\n- Fix incorrect validation errors when flashing bzip2 images.\n- Fix `cscript is not recognised as an internal or external command` Windows error.\n\n## v1.0.0-beta.14 - 2016-09-12\n\n### Features\n\n- Allow archive images to configure a certain amount of bytes to be zeroed out from the beginning of the drive when using bmaps.\n- Make the \"Need help?\" link dynamically open the image support url.\n- Add `.bmap` support.\n\n### Fixes\n\n- Don't clear the drive selection if clicking the \"Retry\" button.\n- Fix \"`modal.dismiss` is not a function\" exception.\n- Prevent `ENOSPC` if the drive capacity is equal to the image size.\n- Prevent failed validation due to drive getting auto-mounted in GNU/Linux.\n- Fix incorrect estimated entry sizes in certain ZIP archives.\n- Show device id if device doesn't have an assigned drive letter in Windows.\n- Fix `blkid: command not found` error in certain GNU/Linux distributions.\n\n### Misc\n\n- Upgrade `etcher-image-stream` to v4.3.0.\n- Upgrade `drivelist` to v3.3.0.\n- Improve speed when retrieving archive image metadata.\n- Improve image full file name modal tooltip.\n\n## v1.0.0-beta.13 - 2016-08-05\n\n### Features\n\n- Show \"Unmounting...\" while unmounting a drive.\n- Perform drive auto-selection even when there is no selected image.\n\n### Fixes\n\n- Prevent selected drive from getting auto-removed when navigating back to the main screen from another screen.\n- Fix new available drives not being recognised automatically in Windows.\n- Fix application stuck at \"Finishing\".\n- Display an error if no graphical polkit authentication agent was found.\n- Only enable error reporting if running inside an `asar`.\n- Fix \"backdrop click\" uncaught errors on modals.\n\n### Misc\n\n- Fix internal removable drives considered system drives in macOS Sierra.\n- Upgrade `etcher-image-write` to v6.0.1.\n- Upgrade `removedrive` to v1.0.0.\n\n## v1.0.0-beta.12 - 2016-07-26\n\n### Features\n\n- Support rich image extensions.\n- Add support for `raw` images.\n- Display a nice alert ribbon if drive runs out of space.\n- Validate the existence of the passed drive.\n- Add an \"unsafe\" option to bypass drive protection.\n\n### Fixes\n\n- Escape quotes from image paths to prevent Bash errors on GNU/Linux and OS X.\n- Check if drive is large enough using the final uncompressed size of the image.\n\n### Misc\n\n- Upgrade `drivelist` to v3.2.4.\n\n## v1.0.0-beta.11 - 2016-07-17\n\n### Features\n\n- Set dialog default directory to the place where the AppImage was run from in GNU/Linux.\n\n### Fixes\n\n- Don't throw an \"Invalid image\" error if the extension is not in lowercase.\n- Fix `ENOENT` error when selecting certain images with multiple extensions on GNU/Linux.\n- Fix flashing not starting when an image name contains a space.\n- Fix error when writing images containing parenthesis in GNU/Linux and OS X.\n- Fix error when cancelling an elevation request.\n- Fix incorrect ETA numbers in certain timezones.\n- Fix state validation error when speed equals zero.\n- Display `*.zip` in the supported images tooltip.\n- Fix uncaught exception when showing the update notifier modal.\n\n### Misc\n\n- Upgrade `etcher-image-write` to v5.0.2.\n\n## v1.0.0-beta.10 - 2016-06-27\n\n### Features\n\n- Add support for `dsk` images.\n- Only elevate the writer process instead of the whole application.\n- Make sure a drive is instantly deselected if its not available anymore.\n- Make Etcher CLI `--robot` option output parseable JSON strings.\n\n### Fixes\n\n- Fix an error that prevented an AppImage from being directly ran as `root`.\n- Ensure we pass the correct argument types to `electron.dialog.showErrorBox()`.\n- Don't re-check for updates when navigating back to the main screen.\n- Emit window progress even when not on the main screen.\n- Improve aliasing of the striped progress button.\n- Fix `EPERM` errors on Windows.\n\n### Misc\n\n- Add documentation for the Etcher CLI.\n- Add a GitHub issue template.\n- Open DevTools in \"undocked\" mode by default.\n\n## v1.0.0-beta.9 - 2016-06-20\n\n### Fixes\n\n- Don't interpret image file name information between dots as image extensions.\n\n## v1.0.0-beta.8 - 2016-06-15\n\n### Features\n\n- Display ETA during flash and check.\n- Show an informative label if the drive is not large enough for the selected image.\n- Show an informative label if the drive is locked (write protected).\n\n### Fixes\n\n- Prevent certain system drives to be detected as removable in GNU/Linux.\n- Fix external resources not opening on GNU/Linux when the application is elevated.\n- Don't show an unnecessary scroll bar in the update notifier modal.\n- Prevent selection of invalid images by drag and drop.\n- Fix `EPERM` errors on Windows on drives formatted with a GUID Partition Table.\n- Prevent a very long image name from breaking the UI.\n\n### Misc\n\n- Write a document explaining Etcher's architecture.\n\n## v1.0.0-beta.7 - 2016-05-26\n\n### Features\n\n- Add `gzip` compression support.\n- Add `bzip2` compression support.\n- Provide a GUI elevation dialog for GNU/Linux.\n\n### Fixes\n\n- Fix broken image drag and drop functionality.\n- Prevent global shortcuts from interfering with another applications.\n- Prevent re-activating the \"Flash\" button with the keyboard shortcuts when a flash is already in process.\n- Fix certain non-removable Windows devices not being filtered out.\n- Display non-mountable Windows drives in the drive selector.\n\n### Misc\n\n- Upgrade Electron to v1.1.1.\n- Various improvements to the build system.\n\n## v1.0.0-beta.6 - 2016-05-12\n\n### Features\n\n- Implement update notifier modal.\n- Implement writing by forking the Etcher CLI as a child process.\n\n### Fixes\n\n- Prevent selection of drives that are not large enough for the selected image.\n\n### Misc\n\n- Remove implicit \"Enable\" from settings screen items.\n\n## v1.0.0-beta.5 - 2016-05-04\n\n### Features\n\n- Add `xz` compression support.\n\n### Fixes\n\n- Improve \"Select Image\" supported file types label.\n- Fix error that prevented the application to be elevated correctly on Windows.\n\n### Misc\n\n- Deprecate GNU/Linux `.tar.gz` installers in favor of AppImages.\n\n## v1.0.0-beta.4 - 2016-04-22\n\n### Features\n\n- Generate [AppImage](http://appimage.org) packages for GNU/Linux.\n- Add application version to footer, which links to the `CHANGELOG`.\n- Allow to bypass elevation with an environment variable (`ETCHER_BYPASS_ELEVATION`).\n\n### Fixes\n\n- Improve drive selector modal.\n- Add dashed underline stlying to footer links.\n\n### Misc\n\n- Upgrade Electron to v0.37.6.\n- Integrate Etcher CLI in this git repository.\n\n## v1.0.0-beta.3 - 2016-04-17\n\n### Features\n\n- Show drive name in drive selector modal.\n- Add subtle hover styling to footer links.\n- Implement OS notifications on completion.\n- Allow to drag and drop an image to the first step.\n- Add Etcher logo to application footer.\n- Add \"Change\" button links below each step.\n- Invert progress bar stripes during validation.\n\n### Fixes\n\n- Fix window contents being pushed below when opening the drive selector modal.\n- Detect removal of selected drive.\n- Detect MacBook SDCard readers in OS X.\n- Improve removable drive detection on Windows.\n- Keep one decimal in Windows drive sizes.\n- Prevent error dialog not showing on malformed `Error` objects.\n- Fix window being resizable on GNU/Linux.\n- Hide drive selector modal if no available drives.\n- Make drive selector modal react to drive auto-selection.\n- Improve UX when attempting to re-selecta single available drive.\n- Reset writer state on flash error.\n- Fix `stream.push() after EOF` error when flashing unaligned images.\n\n### Misc\n\n- Compress Linux executables and libraries.\n- Compress Windows DLLs.\n- Make GNU/Linux binary lowercase.\n- Replace all occurrences of \"burn\" with \"flash\".\n\n## v1.0.0-beta.2 - 2016-04-07\n\n### Features\n\n- Implement a new drive selector modal widget.\n- Log Etcher version in Mixpanel and TrackJS events to aid debugging.\n- Implement write validation support.\n- Add a setting to enable/disable write validation.\n\n### Fixes\n\n- Make sure window size is uniform between platforms.\n- Fix \"Use same image\" button not preserving the image selection.\n- Fix step vertical bars slight mis-alignment.\n- Fix vertical spacing between success message and disk unmount notice label.\n- Fix focus CSS style being persisted in the buttons after a click in some cases.\n- Fix uncaught exception if no file was selected from a dialog.\n- Fix external URL opening freezing applications in GNU/Linux.\n- Fix code-signing issues in OS X in some systems.\n\n### Misc\n\n- Heavy general refactoring.\n\n## v1.0.0-beta.1 - 2016-03-28\n\n### Features\n\n- Allow window to be dragged from anywhere.\n- Add more application metadata to installation package.\n- Setup code-signing for Windows.\n\n### Fixes\n\n- Fix uncaught error after rejecting elevation in OS X.\n- Upgrade `drivelist` to v2.0.9, which includes various drive scanning improvements.\n- Make sure error is logged if its trapped with an error dialog.\n- Fix broken state when going to settings from the success screen.\n- Fix `Cannot read property 'length' of undefined` frequent issue.\n"
  },
  {
    "path": "LICENSE",
    "content": "\n                              Apache License\n                        Version 2.0, January 2004\n                     http://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n   \"License\" shall mean the terms and conditions for use, reproduction,\n   and distribution as defined by Sections 1 through 9 of this document.\n\n   \"Licensor\" shall mean the copyright owner or entity authorized by\n   the copyright owner that is granting the License.\n\n   \"Legal Entity\" shall mean the union of the acting entity and all\n   other entities that control, are controlled by, or are under common\n   control with that entity. For the purposes of this definition,\n   \"control\" means (i) the power, direct or indirect, to cause the\n   direction or management of such entity, whether by contract or\n   otherwise, or (ii) ownership of fifty percent (50%) or more of the\n   outstanding shares, or (iii) beneficial ownership of such entity.\n\n   \"You\" (or \"Your\") shall mean an individual or Legal Entity\n   exercising permissions granted by this License.\n\n   \"Source\" form shall mean the preferred form for making modifications,\n   including but not limited to software source code, documentation\n   source, and configuration files.\n\n   \"Object\" form shall mean any form resulting from mechanical\n   transformation or translation of a Source form, including but\n   not limited to compiled object code, generated documentation,\n   and conversions to other media types.\n\n   \"Work\" shall mean the work of authorship, whether in Source or\n   Object form, made available under the License, as indicated by a\n   copyright notice that is included in or attached to the work\n   (an example is provided in the Appendix below).\n\n   \"Derivative Works\" shall mean any work, whether in Source or Object\n   form, that is based on (or derived from) the Work and for which the\n   editorial revisions, annotations, elaborations, or other modifications\n   represent, as a whole, an original work of authorship. For the purposes\n   of this License, Derivative Works shall not include works that remain\n   separable from, or merely link (or bind by name) to the interfaces of,\n   the Work and Derivative Works thereof.\n\n   \"Contribution\" shall mean any work of authorship, including\n   the original version of the Work and any modifications or additions\n   to that Work or Derivative Works thereof, that is intentionally\n   submitted to Licensor for inclusion in the Work by the copyright owner\n   or by an individual or Legal Entity authorized to submit on behalf of\n   the copyright owner. For the purposes of this definition, \"submitted\"\n   means any form of electronic, verbal, or written communication sent\n   to the Licensor or its representatives, including but not limited to\n   communication on electronic mailing lists, source code control systems,\n   and issue tracking systems that are managed by, or on behalf of, the\n   Licensor for the purpose of discussing and improving the Work, but\n   excluding communication that is conspicuously marked or otherwise\n   designated in writing by the copyright owner as \"Not a Contribution.\"\n\n   \"Contributor\" shall mean Licensor and any individual or Legal Entity\n   on behalf of whom a Contribution has been received by Licensor and\n   subsequently incorporated within the Work.\n\n2. Grant of Copyright License. Subject to the terms and conditions of\n   this License, each Contributor hereby grants to You a perpetual,\n   worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n   copyright license to reproduce, prepare Derivative Works of,\n   publicly display, publicly perform, sublicense, and distribute the\n   Work and such Derivative Works in Source or Object form.\n\n3. Grant of Patent License. Subject to the terms and conditions of\n   this License, each Contributor hereby grants to You a perpetual,\n   worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n   (except as stated in this section) patent license to make, have made,\n   use, offer to sell, sell, import, and otherwise transfer the Work,\n   where such license applies only to those patent claims licensable\n   by such Contributor that are necessarily infringed by their\n   Contribution(s) alone or by combination of their Contribution(s)\n   with the Work to which such Contribution(s) was submitted. If You\n   institute patent litigation against any entity (including a\n   cross-claim or counterclaim in a lawsuit) alleging that the Work\n   or a Contribution incorporated within the Work constitutes direct\n   or contributory patent infringement, then any patent licenses\n   granted to You under this License for that Work shall terminate\n   as of the date such litigation is filed.\n\n4. Redistribution. You may reproduce and distribute copies of the\n   Work or Derivative Works thereof in any medium, with or without\n   modifications, and in Source or Object form, provided that You\n   meet the following conditions:\n\n   (a) You must give any other recipients of the Work or\n       Derivative Works a copy of this License; and\n\n   (b) You must cause any modified files to carry prominent notices\n       stating that You changed the files; and\n\n   (c) You must retain, in the Source form of any Derivative Works\n       that You distribute, all copyright, patent, trademark, and\n       attribution notices from the Source form of the Work,\n       excluding those notices that do not pertain to any part of\n       the Derivative Works; and\n\n   (d) If the Work includes a \"NOTICE\" text file as part of its\n       distribution, then any Derivative Works that You distribute must\n       include a readable copy of the attribution notices contained\n       within such NOTICE file, excluding those notices that do not\n       pertain to any part of the Derivative Works, in at least one\n       of the following places: within a NOTICE text file distributed\n       as part of the Derivative Works; within the Source form or\n       documentation, if provided along with the Derivative Works; or,\n       within a display generated by the Derivative Works, if and\n       wherever such third-party notices normally appear. The contents\n       of the NOTICE file are for informational purposes only and\n       do not modify the License. You may add Your own attribution\n       notices within Derivative Works that You distribute, alongside\n       or as an addendum to the NOTICE text from the Work, provided\n       that such additional attribution notices cannot be construed\n       as modifying the License.\n\n   You may add Your own copyright statement to Your modifications and\n   may provide additional or different license terms and conditions\n   for use, reproduction, or distribution of Your modifications, or\n   for any such Derivative Works as a whole, provided Your use,\n   reproduction, and distribution of the Work otherwise complies with\n   the conditions stated in this License.\n\n5. Submission of Contributions. Unless You explicitly state otherwise,\n   any Contribution intentionally submitted for inclusion in the Work\n   by You to the Licensor shall be under the terms and conditions of\n   this License, without any additional terms or conditions.\n   Notwithstanding the above, nothing herein shall supersede or modify\n   the terms of any separate license agreement you may have executed\n   with Licensor regarding such Contributions.\n\n6. Trademarks. This License does not grant permission to use the trade\n   names, trademarks, service marks, or product names of the Licensor,\n   except as required for reasonable and customary use in describing the\n   origin of the Work and reproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty. Unless required by applicable law or\n   agreed to in writing, Licensor provides the Work (and each\n   Contributor provides its Contributions) on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n   implied, including, without limitation, any warranties or conditions\n   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n   PARTICULAR PURPOSE. You are solely responsible for determining the\n   appropriateness of using or redistributing the Work and assume any\n   risks associated with Your exercise of permissions under this License.\n\n8. Limitation of Liability. In no event and under no legal theory,\n   whether in tort (including negligence), contract, or otherwise,\n   unless required by applicable law (such as deliberate and grossly\n   negligent acts) or agreed to in writing, shall any Contributor be\n   liable to You for damages, including any direct, indirect, special,\n   incidental, or consequential damages of any character arising as a\n   result of this License or out of the use or inability to use the\n   Work (including but not limited to damages for loss of goodwill,\n   work stoppage, computer failure or malfunction, or any and all\n   other commercial damages or losses), even if such Contributor\n   has been advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability. While redistributing\n   the Work or Derivative Works thereof, You may choose to offer,\n   and charge a fee for, acceptance of support, warranty, indemnity,\n   or other liability obligations and/or rights consistent with this\n   License. However, in accepting such obligations, You may act only\n   on Your own behalf and on Your sole responsibility, not on behalf\n   of any other Contributor, and only if You agree to indemnify,\n   defend, and hold each Contributor harmless for any liability\n   incurred by, or claims asserted against, such Contributor by reason\n   of your accepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n"
  },
  {
    "path": "README.md",
    "content": "# Etcher\n\n> Flash OS images to SD cards & USB drives, safely and easily.\n\nEtcher is a powerful OS image flasher built with web technologies to ensure\nflashing an SDCard or USB drive is a pleasant and safe experience. It protects\nyou from accidentally writing to your hard-drives, ensures every byte of data\nwas written correctly, and much more. It can also directly flash Raspberry Pi devices that support [USB device boot mode](https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#usb-device-boot-mode).\n\n[![Current Release](https://img.shields.io/github/release/balena-io/etcher.svg?style=flat-square)](https://balena.io/etcher)\n[![License](https://img.shields.io/github/license/balena-io/etcher.svg?style=flat-square)](https://github.com/balena-io/etcher/blob/master/LICENSE)\n[![Balena.io Forums](https://img.shields.io/discourse/https/forums.balena.io/topics.svg?style=flat-square&label=balena.io%20forums)](https://forums.balena.io/c/etcher)\n\n---\n\n[**Download**][etcher] | [**Support**][support] | [**Documentation**][user-documentation] | [**Contributing**][contributing] | [**Roadmap**][milestones]\n\n## Supported Operating Systems\n\n- Linux; most distros; Intel 64-bit.\n- Windows 10 and later; Intel 64-bit.\n- macOS 10.13 (High Sierra) and later; both Intel and Apple Silicon.\n\n## Installers\n\nRefer to the [downloads page][etcher] for the latest pre-made\ninstallers for all supported operating systems.\n\n## Packages\n\n#### Debian and Ubuntu based Package Repository (GNU/Linux x86/x64)\n\nPackage for Debian and Ubuntu can be downloaded from the [Github release page](https://github.com/balena-io/etcher/releases/)\n\n##### Install .deb file using apt\n\n   ```sh\n      sudo apt install ./balena-etcher_******_amd64.deb\n   ```\n\n##### Uninstall\n\n   ```sh\n      sudo apt remove balena-etcher\n   ```\n\n#### Redhat (RHEL) and Fedora-based Package Repository (GNU/Linux x86/x64)\n\n##### Yum\n\nPackage for Fedora-based and Redhat can be downloaded from the [Github release page](https://github.com/balena-io/etcher/releases/)\n\n1. Install using yum\n\n```sh\n   sudo yum localinstall balena-etcher-***.x86_64.rpm\n```\n\n#### Arch/Manjaro Linux (GNU/Linux x64)\n\nEtcher is offered through the Arch User Repository and can be installed on both Manjaro and Arch systems. You can compile it from the source code in this repository using [`balena-etcher`](https://aur.archlinux.org/packages/balena-etcher/). The following example uses a common AUR helper to install the latest release:\n\n```sh\nyay -S balena-etcher\n```\n\n##### Uninstall\n\n```sh\nyay -R balena-etcher\n```\n\n#### WinGet (Windows)\n\nThis package is updated by [gh-action](https://github.com/vedantmgoyal2009/winget-releaser), and is kept up to date automatically.\n\n```sh\nwinget install balenaEtcher #or Balena.Etcher\n```\n\n##### Uninstall\n\n```sh\nwinget uninstall balenaEtcher\n```\n\n#### Chocolatey (Windows)\n\nThis package is maintained by [@majkinetor](https://github.com/majkinetor), and\nis kept up to date automatically.\n\n```sh\nchoco install etcher\n```\n\n##### Uninstall\n\n```sh\nchoco uninstall etcher\n```\n\n## Support\n\nIf you're having any problem, please [raise an issue][newissue] on GitHub, and\nthe balena.io team will be happy to help.\n\n## License\n\nEtcher is free software and may be redistributed under the terms specified in\nthe [license].\n\n[etcher]: https://balena.io/etcher\n[electron]: https://electronjs.org/\n[electron-supported-platforms]: https://electronjs.org/docs/tutorial/support#supported-platforms\n[support]: https://github.com/balena-io/etcher/blob/master/docs/SUPPORT.md\n[contributing]: https://github.com/balena-io/etcher/blob/master/docs/CONTRIBUTING.md\n[user-documentation]: https://github.com/balena-io/etcher/blob/master/docs/USER-DOCUMENTATION.md\n[milestones]: https://github.com/balena-io/etcher/milestones\n[newissue]: https://github.com/balena-io/etcher/issues/new\n[license]: https://github.com/balena-io/etcher/blob/master/LICENSE\n"
  },
  {
    "path": "after-install.tpl",
    "content": "#!/bin/bash\n\n# Link to the binary\n# Must hardcode balenaEtcher directory; no variable available\nln -sf '/opt/balenaEtcher/${executable}' '/usr/bin/${executable}'\n\n# SUID chrome-sandbox for Electron 5+\nchmod 4755 '/opt/balenaEtcher/chrome-sandbox' || true\n\nupdate-mime-database /usr/share/mime || true\nupdate-desktop-database /usr/share/applications || true\n"
  },
  {
    "path": "docs/ARCHITECTURE.md",
    "content": "Etcher Architecture\n===================\n\nThis document aims to serve as a high-level overview of how Etcher works,\nspecially oriented for contributors who want to understand the big picture.\n\nTechnologies\n------------\n\nThis is a non exhaustive list of the major frameworks, libraries, and other\ntechnologies used in Etcher that you should become familiar with:\n\n- [Electron][electron]\n- [NodeJS][nodejs]\n- [Redux][redux]\n- [ImmutableJS][immutablejs]\n- [Sass][sass]\n- [Mocha][mocha]\n- [JSDoc][jsdoc]\n\nModule architecture\n-------------------\n\nInstead of embedding all the functionality required to create a full-featured\nimage writer as a monolithic project, we try to hard to follow the [\"lego block\napproach\"][lego-blocks].\n\nThis has the advantage of allowing other applications to re-use logic we\nimplemented for Etcher in their own project, even for things we didn't expect,\nwhich leads to users benefitting from what we've built, and we benefitting from\nuser's bug reports, suggestions, etc, as an indirect way to make Etcher better.\n\nThe fact that low-level details are scattered around many different modules can\nmake it challenging for a new contributor to wrap their heads around the\nproject as a whole, and get a clear high level view of how things work or where\nto submit their work or bug reports.\n\nThese are the main Etcher components, in a nutshell:\n\n- [Drivelist](https://github.com/balena-io-modules/drivelist)\n\nAs the name implies, this module's duty is to detect the connected drives\nuniformly in all major operating systems, along with valuable metadata, like if\na drive is removable or not, to prevent users from trying to write an image to\na system drive.\n\n- [Etcher](https://github.com/balena-io/etcher)\n\nThis is the *\"main repository\"*, from which you're reading this from, which is\nbasically the front-end and glue for all previously listed projects.\n\nSummary\n-------\n\nWe always welcome contributions to Etcher as well as our documentation. If you\nwant to give back, but feel that your knowledge on how Etcher works is not\nenough to tackle a bug report or feature request, use that as your advantage,\nsince fresh eyes could help unveil things that we take for granted, but should\nbe documented instead!\n\n[lego-blocks]: https://github.com/sindresorhus/ama/issues/10#issuecomment-117766328\n[exit-codes]: https://github.com/balena-io/etcher/blob/master/lib/shared/exit-codes.js\n[gui-dir]: https://github.com/balena-io/etcher/tree/master/lib/gui\n[electron]: http://electron.atom.io\n[nodejs]: https://nodejs.org\n[redux]: http://redux.js.org\n[immutablejs]: http://facebook.github.io/immutable-js/\n[sass]: http://sass-lang.com\n[mocha]: http://mochajs.org\n[jsdoc]: http://usejsdoc.org\n"
  },
  {
    "path": "docs/COMMIT-GUIDELINES.md",
    "content": "Commit Guidelines\n=================\n\nWe enforce certain rules on commits with the following goals in mind:\n\n- Be able to reliably auto-generate the `CHANGELOG.md` *without* any human\nintervention.\n- Be able to automatically and correctly increment the semver version number\nbased on what was done since the last release.\n- Be able to get a quick overview of what happened to the project by glancing\nover the commit history.\n- Be able to automatically reference relevant changes from a dependency\nupgrade.\n\n\nCommit structure\n----------------\n\nEach commit message needs to specify the semver-type. Which can be `patch|minor|major`.\nSee the [Semantic Versioning][semver] specification for a more detailed explanation of the meaning of these types.\nSee balena commit guidelines for more info about the whole commit structure.\n\n```\n<semver-type>: <subject>\n```\nor\n```\n<subject>\n<BLANK LINE>\n<details>\n<BLANK LINE>\nChange-Type: <semver-type>\n```\n\nThe subject should not contain more than 70 characters, including the type and\nscope, and the body should be wrapped at 72 characters.\n\nTags\n----\n\n### `See: <url>`/`Link: <url>`\n\nThis tag can be used to reference a resource that is relevant to the commit,\nand can be repeated multiple times in the same commit.\n\nResource examples include:\n\n- A link to pull requests.\n- A link to a GitHub issue.\n- A link to a website providing useful information.\n- A commit hash.\n\nIts recommended that you avoid relative URLs, and that you include the whole\ncommit hash to avoid any potential ambiguity issues in the future.\n\nIf the commit type equals `upgrade`, this tag should be present, and should\nlink to the CHANGELOG section of the dependency describing the changes\nintroduced from the previously used version.\n\nExamples:\n\n```\nSee: https://github.com/xxx/yyy/\nSee: 49d89b4acebd80838303b011d30517cd6229fdbe\nLink: https://github.com/xxx/yyy/issues/zzz\n```\n\n### `Closes: <url>`/`Fixes: <url>`\n\nThis tag is used to make GitHub close the referenced issue automatically when\nthe commit is merged.\n\nIts recommended that you provide the absolute URL to the GitHub issue rather\nthan simply writing the ID prefixed by a hash tag for convenience when browsing\nthe commit history outside the GitHub web interface.\n\nA commit can include multiple instances of this tag.\n\nExamples:\n\n```\nCloses: https://github.com/balena-io/etcher/issues/XXX\nFixes: https://github.com/balena-io/etcher/issues/XXX\n```\n\n[semver]: http://semver.org\n"
  },
  {
    "path": "docs/CONTRIBUTING.md",
    "content": "Contributing Guide\n==================\n\nThanks for your interest in contributing to this project! This document aims to\nserve as a friendly guide for making your first contribution.\n\nHigh-level Etcher overview\n--------------------------\n\nMake sure you checkout our [ARCHITECTURE.md][ARCHITECTURE] guide, which aims to\nexplain how all the pieces fit together.\n\nDeveloping\n----------\n\n### Prerequisites\n\n#### Common\n\n- [NodeJS](https://nodejs.org) (at least v16.11)\n- [Python 3](https://www.python.org)\n- [jq](https://stedolan.github.io/jq/)\n- [curl](https://curl.haxx.se/)\n- [npm](https://www.npmjs.com/)\n\n```sh\npip install -r requirements.txt\n```\n\nYou might need to run this with `sudo` or administrator permissions.\n\n#### Windows\n\n- [NSIS v2.51](http://nsis.sourceforge.net/Main_Page) (v3.x won't work)\n- Either one of the following:\n  - [Visual C++ 2019 Build Tools](https://visualstudio.microsoft.com/vs/features/cplusplus/) containing standalone compilers, libraries and scripts\n  - The [windows-build-tools](https://github.com/felixrieseberg/windows-build-tools#windows-build-tools) should be installed along with NodeJS\n  - [Visual Studio Community 2019](https://visualstudio.microsoft.com/vs/) (free) (other editions, like Professional and Enterprise, should work too)\n    **NOTE:** Visual Studio doesn't install C++ by default. You have to rerun the\n    setup, select \"Modify\" and then check `Visual C++ -> Common Tools for Visual\n    C++` (see http://stackoverflow.com/a/31955339)\n- [MinGW](http://www.mingw.org)\n\nYou might need to `npm config set msvs_version 2019` for node-gyp to correctly detect\nthe version of Visual Studio you're using (in this example VS2019).\n\nThe following MinGW packages are required:\n\n- `msys-make`\n- `msys-unzip`\n- `msys-zip`\n- `msys-bash`\n- `msys-coreutils`\n\n#### macOS\n\n- [Xcode](https://developer.apple.com/xcode/)\n\nIt's not enough to have [Xcode Command Line Tools] installed. Xcode must be installed\nas well.\n\n#### Linux\n\n- `libudev-dev` for libusb (for example install with `sudo apt install libudev-dev`, or on fedora `systemd-devel` contains the required package)\n\n### Cloning the project\n\n```sh\ngit clone --recursive https://github.com/balena-io/etcher\ncd etcher\n```\n\n### Running the application\n\n#### GUI\n\n```sh\n# Build and start application\nnpm start\n```\n\nTesting\n-------\n\nTo run the test suite, run the following command:\n\n```sh\nnpm test\n```\n\nGiven the nature of this application, not everything can be unit tested. For\nexample:\n\n- The writing operating on real raw devices.\n- Platform inconsistencies.\n- Style changes.\n- Artwork.\n\nWe encourage our contributors to test the application on as many operating\nsystems as they can before sending a pull request.\n\n*The test suite is run automatically by CI servers when you send a pull\nrequest.*\n\nWe make use of [EditorConfig] to communicate indentation, line endings and\nother text editing default. We encourage you to install the relevant plugin in\nyour text editor of choice to avoid having to fix any issues during the review\nprocess.\n\nUpdating a dependency\n---------------------\n\n- Install new version of dependency using npm\n- Commit *both* `package.json` and `npm-shrinkwrap.json`.\n\nDiffing Binaries\n----------------\n\nBinary files are tagged as \"binary\" in the `.gitattributes` file, but also have\na `diff=hex` tag, which allows you to see hexdump-style diffs for binaries,\nif you add the following to either your global or repository-local git config:\n\n```sh\n$ git config diff.hex.textconv hexdump\n$ git config diff.hex.binary true\n```\n\nAnd global, respectively:\n\n```sh\n$ git config --global diff.hex.textconv hexdump\n$ git config --global diff.hex.binary true\n```\n\nIf you don't have `hexdump` available on your platform,\nyou can try [hxd], which is also a bit faster.\n\nCommit Guidelines\n-----------------\n\nSee [COMMIT-GUIDELINES.md][COMMIT-GUIDELINES] for a thorough guide on how to\nwrite commit messages.\n\nSending a pull request\n----------------------\n\nWhen sending a pull request, consider the following guidelines:\n\n- Write a concise commit message explaining your changes.\n\n- If applies, write more descriptive information in the commit body.\n\n- Mention the operating systems with the corresponding versions in which you\ntested your changes.\n\n- If your change affects the visuals of the application, consider attaching a\nscreenshot.\n\n- Refer to the issue/s your pull request fixes, so they're closed automatically\nwhen your pull request is merged.\n\n- Write a descriptive pull request title.\n\n- Squash commits when possible, for example, when committing review changes.\n\nBefore your pull request can be merged, the following conditions must hold:\n\n- The linter doesn't throw any warning.\n\n- All the tests pass.\n\n- The coding style aligns with the project's convention.\n\n- Your changes are confirmed to be working in recent versions of the operating\nsystems we support.\n\nDon't hesitate to get in touch if you have any questions or need any help!\n\n[ARCHITECTURE]: https://github.com/balena-io/etcher/blob/master/docs/ARCHITECTURE.md\n[COMMIT-GUIDELINES]: https://github.com/balena-io/etcher/blob/master/docs/COMMIT-GUIDELINES.md\n[EditorConfig]: http://editorconfig.org\n[shrinkwrap]: https://docs.npmjs.com/cli/shrinkwrap\n[hxd]: https://github.com/jhermsmeier/hxd\n[Xcode Command Line Tools]: https://developer.apple.com/library/content/technotes/tn2339/_index.html\n"
  },
  {
    "path": "docs/FAQ.md",
    "content": "## Why is my drive not bootable?\n\nEtcher copies images to drives byte by byte, without doing any transformation to the final device, which means images that require special treatment to be made bootable, like Windows images, will not work out of the box. In these cases, the general advice is to use software specific to those kind of images, usually available from the image publishers themselves. You can find more information [here](https://github.com/balena-io/etcher/blob/master/docs/USER-DOCUMENTATION.md#why-is-my-drive-not-bootable).\n\n## How can I configure persistent storage?\n\nSome programs, usually oriented at making GNU/Linux live USB drives, include an option to set persistent storage. This is currently not supported by Etcher, so if you require this functionality, we advise to fallback to [UNetbootin](https://unetbootin.github.io/).\n\n## How do I flash Ubuntu ISOs\n\nUbuntu images (and potentially some other related GNU/Linux distributions) have a peculiar format that allows the image to boot without any further modification from both CDs and USB drives.\nA consequence of this enhancement is that some programs, like parted get confused about the drive's format and partition table, printing warnings such as:\n\n> /dev/xxx contains GPT signatures, indicating that it has a GPT table. However, it does not have a valid fake msdos partition table, as it should. Perhaps it was corrupted -- possibly by a program that doesn't understand GPT partition tables. Or perhaps you deleted the GPT table, and are now using an msdos partition table. Is this a GPT partition table? Both the primary and backup GPT tables are corrupt. Try making a fresh table, and using Parted's rescue feature to recover partitions.\n\n> Warning: The driver descriptor says the physical block size is 2048 bytes, but Linux says it is 512 bytes.\n\nAll these warnings are safe to ignore, and your drive should be able to boot without any problems.\nRefer to [the following message from Ubuntu's mailing list](https://lists.ubuntu.com/archives/ubuntu-devel/2011-June/033495.html) if you want to learn more.\n\n## How do I run Etcher on Wayland?\n\nThe XWayland Server provides backwards compatibility to run any X client on Wayland, including Etcher.\nThis usually works out of the box on mainstream GNU/Linux distributions that properly support Wayland. If it doesn't, make sure the xwayland.so module is being loaded by declaring it in your [weston.ini](http://manpages.ubuntu.com/manpages/wily/man5/weston.ini.5.html):\n\n```\n[core]\nmodules=xwayland.so\n```\n\n## What are the runtime GNU/LINUX dependencies?\n\n[This entry](https://github.com/balena-io/etcher/blob/master/docs/USER-DOCUMENTATION.md#runtime-gnulinux-dependencies) aims to provide an up to date list of runtime dependencies needed to run Etcher on a GNU/Linux system.\n\n## How can I recover the broken drive?\n\nSometimes, things might go wrong, and you end up with a half-flashed drive that is unusable by your operating systems, and common graphical tools might even refuse to get it back to a normal state.\nTo solve these kinds of problems, we've collected [a list of fail-proof methods](https://github.com/balena-io/etcher/blob/master/docs/USER-DOCUMENTATION.md#recovering-broken-drives) to completely erase your drive in major operating systems.\n\n## I receive \"No polkit authentication agent found\" error in GNU/Linux\n\nEtcher requires an available [polkit authentication agent](https://wiki.archlinux.org/index.php/Polkit#Authentication_agents) in your system in order to show a secure password prompt dialog to perform elevation. Make sure you have one installed for the desktop environment of your choice.\n\n## May I run Etcher in older macOS versions?\n\nEtcher GUI is based on the [Electron](http://electron.atom.io/) framework, [which only supports macOS 10.10 and newer versions](https://github.com/electron/electron/blob/master/docs/tutorial/support.md#supported-platforms).\n\n## Can I use the Flash With Etcher button on my site?\n\nYou can use the Flash with Etcher button on your site or blog, if you have an OS that you want your users to be able to easily flash using Etcher, add the following code where you want to button to be:\n\n`<a href=\"https://efp.balena.io/open-image-url?imageUrl=<your image URL>\"><img src=\"http://balena.io/flash-with-etcher.png\" /></a>`"
  },
  {
    "path": "docs/MAINTAINERS.md",
    "content": "# Maintaining Etcher\n\nThis document is meant to serve as a guide for maintainers to perform common tasks.\n\n## Releasing\n\n### Release Types\n\n- **draft**: A continues snapshot of current master, made by the CI services\n- **pre-release** (default): A continues snapshot of current master, made by the CI services\n- **release**: Full releases\n\nDraft release is created from each PR, tagged with the branch name.\nAll merged PR will generate a new tag/version as a _pre-release_.\nMark the pre-release as final when it is necessary, then distribute the packages in alternative channels as necessary.\n\n#### Preparation\n\n- [Prepare the new version](#preparing-a-new-version)\n- [Generate build artifacts](#generating-binaries) (binaries, archives, etc.)\n- [Draft a release on GitHub](https://github.com/balena-io/etcher/releases)\n  - Upload build artifacts to GitHub release draft\n\n#### Testing\n\n- Test the prepared release and build artifacts properly on **all supported operating systems** to prevent regressions that went uncaught by the CI tests (see [MANUAL-TESTING.md](MANUAL-TESTING.md))\n- If regressions or other issues arise, create issues on the repository for each one, and decide whether to fix them in this release (meaning repeating the process up until this point), or to follow up with a patch release\n\n#### Publishing\n\n- [Publish release draft on GitHub](https://github.com/balena-io/etcher/releases)\n- [Post release note to forums](https://forums.balena.io/c/etcher)\n- [Submit Windows binaries to Symantec for whitelisting](#submitting-binaries-to-symantec)\n- [Update the website](https://github.com/balena-io/etcher-homepage)\n- Wait 2-3 hours for analytics (Sentry) to trickle in and check for elevated error rates, or regressions\n- If regressions arise; pull the release, and release a patched version, else:\n- [Upload deb & rpm packages to Cloudfront](#uploading-packages-to-cloudfront)\n- Post changelog with `#release-notes` tag on internal chat\n- If this release packs noteworthy major changes:\n  - Write a blog post about it, and / or\n  - Write about it to the Etcher mailing list\n\n### Generating binaries\n\n**Environment**\n\nMake sure to set the analytics tokens when generating production release binaries:\n\n```bash\nexport ANALYTICS_SENTRY_TOKEN=\"xxxxxx\"\n```\n\n#### Linux\n\n##### Clean dist folder\n\nDelete `.webpack` and `out/`.\n\n##### Generating artifacts\n\nThe artifacts are generated by the CI and published as draft-release or pre-release.\nEtcher is built with electron-forge. Run:\n\n```\nnpm run make\n```\n\nOur CI will appropriately sign artifacts for macOS and some Windows targets.\n\n### Uploading packages to Cloudfront\n\nLog in to cloudfront and upload the `rpm` and `deb` files.\n\n### Dealing with a Problematic Release\n\nThere can be times where a release is accidentally plagued with bugs. If you\nreleased a new version and notice the error rates are higher than normal, then\nrevert the problematic release as soon as possible, until the bugs are fixed.\n\nYou can revert a version by deleting its builds from the S3 bucket and Bintray.\nRefer to the `Makefile` for the up to date information about the S3 bucket\nwhere we push builds to, and get in touch with the balena.io operations team to\nget write access to it.\n\nThe Etcher update notifier dialog and the website only show the a certain\nversion if all the expected files have been uploaded to it, so deleting a\nsingle package or two is enough to bring down the whole version.\n\nUse the following command to delete files from S3:\n\n```bash\naws s3api delete-object --bucket <bucket name> --key <file name>\n```\n\nThe Bintray dashboard provides an easy way to delete a version's files.\n\n### Submitting binaries to Symantec\n\n- [Report a Suspected Erroneous Detection](https://submit.symantec.com/false_positive/standard/)\n- Fill out form:\n  - **Select Submission Type:** \"Provide a direct download URL\"\n  - **Name of the software being detected:** Etcher\n  - **Name of detection given by Symantec product:** WS.Reputation.1\n  - **Contact name:** Balena.io Ltd\n  - **E-mail address:** hello@etcher.io\n  - **Are you the creator or distributor of the software in question?** Yes\n"
  },
  {
    "path": "docs/MANUAL-TESTING.md",
    "content": "# Manual Testing\n\nThis document describes a high-level script of manual tests to check for. We\nshould aim to replace items on this list with automated Spectron test cases.\n\n## Image Selection\n\n- [ ] Cancel image selection dialog\n- [ ] Select an unbootable image (without a partition table), and expect a\n      sensible warning\n- [ ] Attempt to select a ZIP archive with more than one image\n- [ ] Attempt to select a tar archive (with any compression method)\n- [ ] Change image selection\n- [ ] Select a Windows image, and expect a sensible warning\n\n## Drive Selection\n\n- [ ] Open the drive selection modal\n- [ ] Switch drive selection\n- [ ] Insert a single drive, and expect auto-selection\n- [ ] Insert more than one drive, and don't expect auto-selection\n- [ ] Insert a locked SD Card and expect a warning\n- [ ] Insert a too small drive and expect a warning\n- [ ] Put an image into a drive and attempt to flash the image to the drive\n      that contains it\n- [ ] Attempt to flash a compressed image (for which we can get the\n      uncompressed size) into a drive that is big enough to hold the compressed\n      image, but not big enough to hold the uncompressed version\n- [ ] Enable \"Unsafe Mode\" and attempt to select a system drive\n- [ ] Enable \"Unsafe Mode\", and if there is only one system drive (and no\n      removable ones), don't expect autoselection\n\n## Image Support\n\nRun the following tests with and without validation enabled:\n\n- [ ] Flash an uncompressed image\n- [ ] Flash a Bzip2 image\n- [ ] Flash a XZ image\n- [ ] Flash a ZIP image\n- [ ] Flash a GZ image\n- [ ] Flash a DMG image\n- [ ] Flash an image whose size is not a multiple of 512 bytes\n- [ ] Flash a compressed image whose size is not a multiple of 512 bytes\n- [ ] Flash an archive whose image size is not a multiple of 512 bytes\n- [ ] Flash an archive image containing a logo\n- [ ] Flash an archive image containing a blockmap file\n- [ ] Flash an archive image containing a manifest metadata file\n\n## Flashing Process\n\n- [ ] Unplug the drive during flash or validation\n- [ ] Click \"Flash\", cancel elevation dialog, and click \"Flash\" again\n- [ ] Start flashing an image, try to close Etcher, cancel the application\n      close warning dialog, and check that Etcher continues to flash the image\n\n### Child Writer\n\n- [ ] Kill the child writer process (i.e. with `SIGINT` or `SIGKILL`), and\n      check that the UI reacts appropriately\n- [ ] Close the application while flashing using the window manager close icon\n- [ ] Close the application while flashing using the OS keyboard shortcut\n- [ ] Close the application from the terminal using Ctrl-C while flashing\n- [ ] Force kill the application (using a process monitor tool, etc)\n\nIn all these cases, the child writer process should not remain alive. Note that\nin some systems you need to open your process monitor tool of choice with extra\npermissions to see the elevated child writer process.\n\n## GUI\n\n- [ ] Close application from the terminal using Ctrl-C while the application is\n      idle\n- [ ] Click footer links that take you to an external website\n- [ ] Attempt to change image or drive selection while flashing\n- [ ] Go to the settings page while flashing and come back\n- [ ] Flash consecutive images without closing the application\n- [ ] Remove the selected drive right before clicking \"Flash\"\n- [ ] Minimize the application\n- [ ] Start the application given no internet connection\n\n## Success Banner\n\n- [ ] Click an external link on the success banner (with and without internet\n      connection)\n\n## Elevation Prompt\n\n- [ ] Flash an image as `root`/administrator\n- [ ] Reject elevation prompt\n- [ ] Put incorrect elevation prompt password\n- [ ] Unplug the drive during elevation\n\n## Unmounting\n\n- [ ] Disable unmounting and flash an image\n- [ ] Flash an image with a file system that is readable by the host OS, and\n      check that is unmounted correctly\n"
  },
  {
    "path": "docs/PUBLISHING.md",
    "content": "Publishing Etcher\n=================\n\nThis is a small guide to package and publish Etcher to all supported operating\nsystems.\n\nRelease Types\n-------------\n\nEtcher supports **pre-release** and **final** release types as does Github. Each is\npublished to Github releases.\nThe release version is generated automatically from the commit messasges.\n\nSigning\n-------\n\n### OS X\n\n1. Get our Apple Developer ID certificate for signing applications distributed\noutside the Mac App Store from the balena.io Apple account.\n\n2. Install the Developer ID certificate to your Mac's Keychain by double\nclicking on the certificate file.\n\nThe application will be signed automatically using this certificate when\npackaging for OS X.\n\n### Windows\n\n1. Get access to our code signing certificate and decryption key as a balena.io\nemployee by asking for it from the relevant people.\n\n2. Place the certificate in the root of the Etcher repository naming it\n`certificate.p12`.\n\nPackaging\n---------\n\nRun the following command on each platform:\n\n```sh\nnpm run make\n```\n\nThis will produce all targets (eg. zip, dmg) specified in forge.config.ts for the\nhost platform and architecture.\n\nThe resulting artifacts can be found in `out/make`.\n\n\nPublishing to Cloudfront\n---------------------\n\nWe publish GNU/Linux Debian packages to [Cloudfront][cloudfront].\n\nLog in to cloudfront and upload the `rpm` and `deb` files.\n\nPublishing to Homebrew Cask\n---------------------------\n\n1. Update [`Casks/etcher.rb`][etcher-cask-file] with the new version and\n   `sha256`\n\n2. Send a PR with the changes above to\n   [`caskroom/homebrew-cask`][homebrew-cask]\n\nAnnouncing\n----------\n\nPost messages to the [Etcher forum][balena-forum-etcher] announcing the new version\nof Etcher, and including the relevant section of the Changelog.\n\n[aws-cli]: https://aws.amazon.com/cli\n[cloudfront]: https://cloudfront.com\n[etcher-cask-file]: https://github.com/caskroom/homebrew-cask/blob/master/Casks/balenaetcher.rb\n[homebrew-cask]: https://github.com/caskroom/homebrew-cask\n[balena-forum-etcher]: https://forums.balena.io/c/etcher\n[github-releases]: https://github.com/balena-io/etcher/releases\n\nUpdating EFP / Success-Banner\n-----------------------------\nEtcher Featured Project is automatically run based on an algorithm which promoted projects from the balena marketplace which have been contributed by the community, the algorithm prioritises projects which give uses the best experience. Editing both EFP and the Etcher Success-Banner can only be done by someone from balena, instruction are on the [Etcher-EFP repo (private)](https://github.com/balena-io/etcher-efp)\n"
  },
  {
    "path": "docs/SUPPORT.md",
    "content": "Getting help with BalenaEtcher\n===============================\n\nThere are various ways to get support for Etcher if you experience an issue or\nhave an idea you'd like to share with us.\n\nDocumentation\n------\n\nWe have answers to a variety of frequently asked questions in the [user \ndocumentation][documentation] and also in the [FAQs][faq] on the Etcher website.\n\n\nForums\n------\n\nWe have a [Discourse forum][discourse] which is open to everyone, so please\ncome join us :). Drop us a line there and the balena.io staff and community\nusers will be happy to assist. Your question might already be answered, so take\na look at the existing threads before opening a new one!\n\nMake sure to mention the following information to help us provide better\nsupport:\n\n- The BalenaEtcher version you're running.\n\n- The operating system you're running Etcher in.\n\n- Relevant logging output, if any, from DevTools, which you can open by\n  pressing `Ctrl+Shift+I` or `Cmd+Alt+I` depending on your platform.\n\nGitHub\n------\n\nIf you encounter an issue or have a suggestion, head on over to BalenaEtcher's [issue\ntracker][issues] and if there isn't a ticket covering it, [create\none][new-issue].\n\n[discourse]: https://forums.balena.io/c/etcher\n[issues]: https://github.com/balena-io/etcher/issues\n[new-issue]: https://github.com/balena-io/etcher/issues/new\n[documentation]: https://github.com/balena-io/etcher/blob/master/docs/USER-DOCUMENTATION.md\n[faq]: https://etcher.io\n"
  },
  {
    "path": "docs/USER-DOCUMENTATION.md",
    "content": "Etcher User Documentation\n=========================\n\nThis document contains how-tos and FAQs oriented to Etcher users.\n\nConfig\n------\nEtcher's configuration is saved to the `config.json` file in the apps folder.\nNot all the options are surfaced to the UI. You may edit this file to tweak settings even before launching the app.\n\nWhy is my drive not bootable?\n-----------------------------\n\nEtcher copies images to drives byte by byte, without doing any transformation\nto the final device, which means images that require special treatment to be\nmade bootable, like Windows images, will not work out of the box. In these\ncases, the general advice is to use software specific to those kind of\nimages, usually available from the image publishers themselves.\n\nImages known to require special treatment:\n\n- Microsoft Windows (use [Windows USB/DVD Download Tool][windows-usb-tool], \n  [Rufus][rufus], or [WoeUSB][woeusb]).\n\n- Windows 10 IoT (use the [Windows 10 IoT Core Dashboard][windows-iot-dashboard])\n\nHow can I configure persistent storage?\n---------------------------------------\n\nSome programs, usually oriented at making GNU/Linux live USB drives, include an\noption to set persistent storage. This is currently not supported by Etcher, so\nif you require this functionality, we advise to fallback to\n[UNetbootin][unetbootin].\n\nDeactivate desktop shortcut prompt on GNU/Linux\n-----------------------------------------------\n\nThis is a feature provided by [AppImages][appimage], where the applications\nprompts the user to automatically register a desktop shortcut to easily access\nthe application.\n\nTo deactivate this feature, `touch` any of the files listed below:\n\n- `$HOME/.local/share/appimagekit/no_desktopintegration`\n- `/usr/share/appimagekit/no_desktopintegration`\n- `/etc/appimagekit/no_desktopintegration`\n\nAlternatively, set the `SKIP` environment variable before executing the\nAppImage:\n\n```sh\nSKIP=1 ./Etcher-linux-<arch>.AppImage\n```\n\nFlashing Ubuntu ISOs\n--------------------\n\nUbuntu images (and potentially some other related GNU/Linux distributions) have\na peculiar format that allows the image to boot without any further\nmodification from both CDs and USB drives.\n\nA consequence of this enhancement is that some programs, like `parted` get\nconfused about the drive's format and partition table, printing warnings such\nas:\n\n> /dev/xxx contains GPT signatures, indicating that it has a GPT table.\n> However, it does not have a valid fake msdos partition table, as it should.\n> Perhaps it was corrupted -- possibly by a program that doesn't understand GPT\n> partition tables.  Or perhaps you deleted the GPT table, and are now using an\n> msdos partition table.  Is this a GPT partition table?  Both the primary and\n> backup GPT tables are corrupt.  Try making a fresh table, and using Parted's\n> rescue feature to recover partitions.\n\n***\n\n> Warning: The driver descriptor says the physical block size is 2048 bytes,\n> but Linux says it is 512 bytes.\n\nAll these warnings are **safe to ignore**, and your drive should be able to\nboot without any problems.\n\nRefer to [the following message from Ubuntu's mailing\nlist](https://lists.ubuntu.com/archives/ubuntu-devel/2011-June/033495.html) if\nyou want to learn more.\n\nRunning on Wayland\n------------------\n\nElectron is based on Gtk2, which can't run natively on Wayland. Fortunately,\nthe [XWayland Server][xwayland] provides backwards compatibility to run *any* X\nclient on Wayland, including Etcher.\n\nThis usually works out of the box on mainstream GNU/Linux distributions that\nproperly support Wayland. If it doesn't, make sure the `xwayland.so` module is\nbeing loaded by declaring it in your [weston.ini]:\n\n```\n[core]\nmodules=xwayland.so\n```\n\nRuntime GNU/Linux dependencies\n------------------------------\n\nThis entry aims to provide an up to date list of runtime dependencies needed to\nrun Etcher on a GNU/Linux system.\n\n### Electron specific\n\n> See [brightray's gyp file](https://github.com/electron/brightray/blob/master/brightray.gyp#L4)\n\n- gtk+-2.0\n- dbus-1\n- x11\n- xi\n- xcursor\n- xdamage\n- xrandr\n- xcomposite\n- xext\n- xfixes\n- xrender\n- xtst\n- xscrnsaver\n- gmodule-2.0\n- nss\n\n### Optional dependencies:\n\n- libnotify (for notifications)\n- libspeechd (for text-to-speech)\n\n### Etcher specific:\n\n- liblzma (for xz decompression)\n\nRecovering broken drives\n------------------------\n\nSometimes, things might go wrong, and you end up with a half-flashed drive that\nis unusable by your operating systems, and common graphical tools might even\nrefuse to get it back to a normal state.\n\nTo solve these kinds of problems, we've collected a list of fail-proof methods\nto completely erase your drive in major operating systems.\n\n### Windows\n\nIn Windows, we'll use [diskpart], a command line utility tool that comes\npre-installed in all modern Windows versions.\n\n- Open `cmd.exe` from either the list of all installed applications, or from\n  the \"Run...\" dialog usually accessible by pressing Ctrl+X.\n\n- Type `diskpart.exe` and press \"Enter\". You'll be asked to provide\n  administrator permissions, and a new prompt window will appear. The following\n  commands should be run **in the new window**.\n\n- Run `list disk` to list the available drives. Take note of the number id that\n  identifies the drive you want to clean.\n\n- Run `select disk N`, where `N` corresponds to the id from the previous step.\n\n- Run `clean`. This command will completely clean your drive by erasing any\n  existent filesystem.\n  \n- Run `create partition primary`. This command will create a new partition.\n\n- Run  `active`. This command will active the partition.\n\n- Run  `list partition`. This command will show available partition.\n\n- Run  `select partition N`, where `N` corresponds to the id of the newly available partition.\n\n- Run `format override quick`. This command will format the partition. You can choose a specific formatting by adding `FS=xx` where `xx` could be `NTFS or FAT or FAT32` after `format`. Example : `format FS=NTFS override quick`\n\n- Run `exit` to quit diskpart.\n\n### OS X\n\nRun the following command in `Terminal.app`, replacing `N` by the corresponding\ndisk number, which you can find by running `diskutil list`:\n\n```sh\ndiskutil eraseDisk FAT32 UNTITLED MBRFormat /dev/diskN\n```\n\n### GNU/Linux\n\nMake sure the drive is unmounted (`umount /dev/xxx`), and run the following\ncommand as `root`, replacing `xxx` by your actual device path:\n\n```sh\ndd if=/dev/zero of=/dev/xxx bs=512 count=1 conv=notrunc\n```\n\n\"No polkit authentication agent found\" error in GNU/Linux\n----------------------------------------------------------\n\nEtcher requires an available [polkit authentication\nagent](https://wiki.archlinux.org/index.php/Polkit#Authentication_agents) in\nyour system in order to show a secure password prompt dialog to perform\nelevation. Make sure you have one installed for the desktop environment of your\nchoice.\n\nRunning in older macOS versions\n-------------------------------\n\nEtcher GUI is based on the [Electron][electron] framework, [which only supports\nmacOS 10.10 (Yosemite) and newer versions][electron-supported-platforms].\n\n[balena.io]: https://balena.io\n[appimage]: http://appimage.org\n[xwayland]: https://wayland.freedesktop.org/xserver.html\n[weston.ini]: http://manpages.ubuntu.com/manpages/wily/man5/weston.ini.5.html\n[diskpart]: https://technet.microsoft.com/en-us/library/cc770877(v=ws.11).aspx\n[electron]: https://electronjs.org/\n[electron-supported-platforms]: https://electronjs.org/docs/tutorial/support#supported-platforms\n[publishing]: https://github.com/balena-io/etcher/blob/master/docs/PUBLISHING.md\n[windows-usb-tool]: https://www.microsoft.com/en-us/download/windows-usb-dvd-download-tool\n[rufus]: https://rufus.akeo.ie\n[unetbootin]: https://unetbootin.github.io\n[windows-iot-dashboard]: https://developer.microsoft.com/en-us/windows/iot/downloads\n[woeusb]: https://github.com/slacka/WoeUSB\n\nSee [PUBLISHING](/docs/PUBLISHING.md) for more details about release types."
  },
  {
    "path": "entitlements.mac.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n  <dict>\n    <key>com.apple.security.cs.allow-jit</key>\n    <true/>\n    <key>com.apple.security.cs.allow-unsigned-executable-memory</key>\n    <true/>\n    <key>com.apple.security.cs.allow-dyld-environment-variables</key>\n    <true/>\n    <key>com.apple.security.device.usb</key>\n    <true/>\n    <key>com.apple.security.files.user-selected.read-only</key>\n    <true/>\n    <key>com.apple.security.network.client</key>\n    <true/>\n    <key>com.apple.security.cs.disable-library-validation</key>\n    <true/>\n    <key>com.apple.security.get-task-allow</key>\n    <true/>\n    <key>com.apple.security.cs.disable-executable-page-protection</key>\n    <true/>\n  </dict>\n</plist>\n"
  },
  {
    "path": "forge.config.ts",
    "content": "import type { ForgeConfig } from '@electron-forge/shared-types';\nimport { MakerSquirrel } from '@electron-forge/maker-squirrel';\nimport { MakerZIP } from '@electron-forge/maker-zip';\nimport { MakerDeb } from '@electron-forge/maker-deb';\nimport { MakerRpm } from '@electron-forge/maker-rpm';\nimport { MakerDMG } from '@electron-forge/maker-dmg';\n// import { MakerAppImage } from '@reforged/maker-appimage';\nimport { AutoUnpackNativesPlugin } from '@electron-forge/plugin-auto-unpack-natives';\nimport { WebpackPlugin } from '@electron-forge/plugin-webpack';\nimport { exec } from 'child_process';\n\nimport { mainConfig, rendererConfig } from './webpack.config';\nimport * as sidecar from './forge.sidecar';\n\nimport { hostDependencies, productDescription } from './package.json';\n\nconst osxSigningConfig: any = {};\nlet winSigningConfig: any = {};\n\nif (process.env.NODE_ENV === 'production') {\n\tosxSigningConfig.osxNotarize = {\n\t\ttool: 'notarytool',\n\t\tappleId: process.env.XCODE_APP_LOADER_EMAIL,\n\t\tappleIdPassword: process.env.XCODE_APP_LOADER_PASSWORD,\n\t\tteamId: process.env.XCODE_APP_LOADER_TEAM_ID,\n\t};\n\n\twinSigningConfig = {\n\t\tsignWithParams: `-sha1 ${process.env.SM_CODE_SIGNING_CERT_SHA1_HASH} -tr ${process.env.TIMESTAMP_SERVER} -td sha256 -fd sha256 -d balena-etcher`,\n\t};\n}\n\nconst config: ForgeConfig = {\n\tpackagerConfig: {\n\t\tasar: true,\n\t\ticon: './assets/icon',\n\t\texecutableName:\n\t\t\tprocess.platform === 'linux' ? 'balena-etcher' : 'balenaEtcher',\n\t\tappBundleId: 'io.balena.etcher',\n\t\tappCategoryType: 'public.app-category.developer-tools',\n\t\tappCopyright: 'Copyright 2016-2023 Balena Ltd',\n\t\tdarwinDarkModeSupport: true,\n\t\tprotocols: [{ name: 'etcher', schemes: ['etcher'] }],\n\t\textraResource: [\n\t\t\t'lib/shared/sudo/sudo-askpass.osascript-zh.js',\n\t\t\t'lib/shared/sudo/sudo-askpass.osascript-en.js',\n\t\t],\n\t\tosxSign: {\n\t\t\toptionsForFile: () => ({\n\t\t\t\tentitlements: './entitlements.mac.plist',\n\t\t\t\thardenedRuntime: true,\n\t\t\t}),\n\t\t},\n\t\t...osxSigningConfig,\n\t},\n\trebuildConfig: {\n\t\tonlyModules: [], // prevent rebuilding *any* native modules as they won't be used by electron but by the sidecar\n\t},\n\tmakers: [\n\t\tnew MakerZIP(),\n\t\tnew MakerSquirrel({\n\t\t\tsetupIcon: 'assets/icon.ico',\n\t\t\tloadingGif: 'assets/icon.png',\n\t\t\t...winSigningConfig,\n\t\t}),\n\t\tnew MakerDMG({\n\t\t\tbackground: './assets/dmg/background.tiff',\n\t\t\ticon: './assets/icon.icns',\n\t\t\ticonSize: 110,\n\t\t\tcontents: ((opts: { appPath: string }) => {\n\t\t\t\treturn [\n\t\t\t\t\t{ x: 140, y: 250, type: 'file', path: opts.appPath },\n\t\t\t\t\t{ x: 415, y: 250, type: 'link', path: '/Applications' },\n\t\t\t\t];\n\t\t\t}) as any, // type of MakerDMGConfig omits `appPath`\n\t\t\tadditionalDMGOptions: {\n\t\t\t\twindow: {\n\t\t\t\t\tsize: {\n\t\t\t\t\t\twidth: 540,\n\t\t\t\t\t\theight: 425,\n\t\t\t\t\t},\n\t\t\t\t\tposition: {\n\t\t\t\t\t\tx: 400,\n\t\t\t\t\t\ty: 500,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t}),\n\t\t// new MakerAppImage({\n\t\t// \toptions: {\n\t\t// \t\ticon: './assets/icon.png',\n\t\t// \t\tcategories: ['Utility'],\n\t\t// \t},\n\t\t// }),\n\t\tnew MakerRpm({\n\t\t\toptions: {\n\t\t\t\ticon: './assets/icon.png',\n\t\t\t\tcategories: ['Utility'],\n\t\t\t\tproductDescription,\n\t\t\t\trequires: ['util-linux'],\n\t\t\t},\n\t\t}),\n\t\tnew MakerDeb({\n\t\t\toptions: {\n\t\t\t\ticon: './assets/icon.png',\n\t\t\t\tcategories: ['Utility'],\n\t\t\t\tsection: 'utils',\n\t\t\t\tpriority: 'optional',\n\t\t\t\tproductDescription,\n\t\t\t\tscripts: {\n\t\t\t\t\tpostinst: './after-install.tpl',\n\t\t\t\t},\n\t\t\t\tdepends: hostDependencies['debian'],\n\t\t\t},\n\t\t}),\n\t],\n\tplugins: [\n\t\tnew AutoUnpackNativesPlugin({}),\n\t\tnew WebpackPlugin({\n\t\t\tmainConfig,\n\t\t\trenderer: {\n\t\t\t\tconfig: rendererConfig,\n\t\t\t\tnodeIntegration: true,\n\t\t\t\tentryPoints: [\n\t\t\t\t\t{\n\t\t\t\t\t\thtml: './lib/gui/app/index.html',\n\t\t\t\t\t\tjs: './lib/gui/app/renderer.ts',\n\t\t\t\t\t\tname: 'main_window',\n\t\t\t\t\t\tpreload: {\n\t\t\t\t\t\t\tjs: './lib/gui/app/preload.ts',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t}),\n\t\tnew sidecar.SidecarPlugin(),\n\t],\n\thooks: {\n\t\tpostPackage: async (_forgeConfig, options) => {\n\t\t\tif (options.platform === 'linux') {\n\t\t\t\t// symlink the etcher binary from balena-etcher to balenaEtcher to ensure compatibility with the wdio suite and the old name\n\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\texec(\n\t\t\t\t\t\t`ln -s \"${options.outputPaths}/balena-etcher\" \"${options.outputPaths}/balenaEtcher\"`,\n\t\t\t\t\t\t(err) => {\n\t\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t},\n};\n\nexport default config;\n"
  },
  {
    "path": "forge.sidecar.ts",
    "content": "import { PluginBase } from '@electron-forge/plugin-base';\nimport type {\n\tForgeMultiHookMap,\n\tResolvedForgeConfig,\n} from '@electron-forge/shared-types';\nimport { WebpackPlugin } from '@electron-forge/plugin-webpack';\nimport { DefinePlugin } from 'webpack';\n\nimport { execFileSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nimport debug from 'debug';\n\nconst log = debug('sidecar');\n\nfunction isStartScrpt(): boolean {\n\treturn process.env.npm_lifecycle_event === 'start';\n}\n\nfunction addWebpackDefine(\n\tconfig: ResolvedForgeConfig,\n\tdefineName: string,\n\tbinDir: string,\n\tbinName: string,\n): ResolvedForgeConfig {\n\tconfig.plugins.forEach((plugin) => {\n\t\tif (plugin.name !== 'webpack' || !(plugin instanceof WebpackPlugin)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { mainConfig } = plugin.config as any;\n\t\tif (mainConfig.plugins == null) {\n\t\t\tmainConfig.plugins = [];\n\t\t}\n\n\t\tconst value = isStartScrpt()\n\t\t\t? // on `npm start`, point directly to the binary\n\t\t\t\tpath.resolve(binDir, binName)\n\t\t\t: // otherwise point relative to the resources folder of the bundled app\n\t\t\t\tbinName;\n\n\t\tlog(`define '${defineName}'='${value}'`);\n\n\t\tmainConfig.plugins.push(\n\t\t\tnew DefinePlugin({\n\t\t\t\t// expose path to helper via this webpack define\n\t\t\t\t[defineName]: JSON.stringify(value),\n\t\t\t}),\n\t\t);\n\t});\n\n\treturn config;\n}\n\nfunction build(\n\tsourcesDir: string,\n\tbuildForArchs: string,\n\tbinDir: string,\n\tbinName: string,\n) {\n\tconst commands: Array<[string, string[], object?]> = [\n\t\t['tsc', ['--project', 'tsconfig.sidecar.json', '--outDir', sourcesDir]],\n\t];\n\n\tbuildForArchs.split(',').forEach((arch) => {\n\t\tconst binPath = isStartScrpt()\n\t\t\t? // on `npm start`, we don't know the arch we're building for at the time we're\n\t\t\t\t// adding the webpack define, so we just build under binDir\n\t\t\t\tpath.resolve(binDir, binName)\n\t\t\t: // otherwise build in arch-specific directory within binDir\n\t\t\t\tpath.resolve(binDir, arch, binName);\n\n\t\t// FIXME: rebuilding mountutils shouldn't be necessary, but it is.\n\t\t// It's coming from etcher-sdk, a fix has been upstreamed but to use\n\t\t// the latest etcher-sdk we need to upgrade axios at the same time.\n\t\tcommands.push(['npm', ['rebuild', 'mountutils', `--arch=${arch}`]]);\n\n\t\tcommands.push([\n\t\t\t'pkg',\n\t\t\t[\n\t\t\t\tpath.join(sourcesDir, 'util', 'api.js'),\n\t\t\t\t'-c',\n\t\t\t\t'pkg-sidecar.json',\n\t\t\t\t// `--no-bytecode` so that we can cross-compile for arm64 on x64\n\t\t\t\t'--no-bytecode',\n\t\t\t\t'--public',\n\t\t\t\t'--public-packages',\n\t\t\t\t'\"*\"',\n\t\t\t\t// always build for host platform and node version\n\t\t\t\t// https://github.com/vercel/pkg-fetch/releases\n\t\t\t\t'--target',\n\t\t\t\t`node20-${arch}`,\n\t\t\t\t'--output',\n\t\t\t\tbinPath,\n\t\t\t],\n\t\t]);\n\t});\n\n\tcommands.forEach(([cmd, args, opt]) => {\n\t\tlog('running command:', cmd, args.join(' '));\n\t\texecFileSync(cmd, args, { shell: true, stdio: 'inherit', ...opt });\n\t});\n}\n\nfunction copyArtifact(\n\tbuildPath: string,\n\tarch: string,\n\tbinDir: string,\n\tbinName: string,\n) {\n\tconst binPath = isStartScrpt()\n\t\t? // on `npm start`, we don't know the arch we're building for at the time we're\n\t\t\t// adding the webpack define, so look for the binary directly under binDir\n\t\t\tpath.resolve(binDir, binName)\n\t\t: // otherwise look into arch-specific directory within binDir\n\t\t\tpath.resolve(binDir, arch, binName);\n\n\t// buildPath points to appPath, which is inside resources dir which is the one we actually want\n\tconst resourcesPath = path.dirname(buildPath);\n\tconst dest = path.resolve(resourcesPath, path.basename(binPath));\n\tlog(`copying '${binPath}' to '${dest}'`);\n\tfs.copyFileSync(binPath, dest);\n}\n\nexport class SidecarPlugin extends PluginBase<void> {\n\tname = 'sidecar';\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.getHooks = this.getHooks.bind(this);\n\t\tlog('isStartScript:', isStartScrpt());\n\t}\n\n\tgetHooks(): ForgeMultiHookMap {\n\t\tconst DEFINE_NAME = 'ETCHER_UTIL_BIN_PATH';\n\t\tconst BASE_DIR = path.join('out', 'sidecar');\n\t\tconst SRC_DIR = path.join(BASE_DIR, 'src');\n\t\tconst BIN_DIR = path.join(BASE_DIR, 'bin');\n\t\tconst BIN_NAME = `etcher-util${process.platform === 'win32' ? '.exe' : ''}`;\n\n\t\treturn {\n\t\t\tresolveForgeConfig: async (currentConfig) => {\n\t\t\t\tlog('resolveForgeConfig');\n\t\t\t\treturn addWebpackDefine(currentConfig, DEFINE_NAME, BIN_DIR, BIN_NAME);\n\t\t\t},\n\t\t\tgenerateAssets: async (_config, platform, arch) => {\n\t\t\t\tlog('generateAssets', { platform, arch });\n\t\t\t\tbuild(SRC_DIR, arch, BIN_DIR, BIN_NAME);\n\t\t\t},\n\t\t\tpackageAfterCopy: async (\n\t\t\t\t_config,\n\t\t\t\tbuildPath,\n\t\t\t\telectronVersion,\n\t\t\t\tplatform,\n\t\t\t\tarch,\n\t\t\t) => {\n\t\t\t\tlog('packageAfterCopy', {\n\t\t\t\t\tbuildPath,\n\t\t\t\t\telectronVersion,\n\t\t\t\t\tplatform,\n\t\t\t\t\tarch,\n\t\t\t\t});\n\t\t\t\tcopyArtifact(buildPath, arch, BIN_DIR, BIN_NAME);\n\t\t\t},\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "lib/gui/app/app.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as electron from 'electron';\nimport * as remote from '@electron/remote';\nimport type { Dictionary } from 'lodash';\nimport { debounce, capitalize, values } from 'lodash';\nimport outdent from 'outdent';\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { v4 as uuidV4 } from 'uuid';\n\nimport * as packageJSON from '../../../package.json';\nimport type { DrivelistDrive } from '../../shared/drive-constraints';\nimport * as EXIT_CODES from '../../shared/exit-codes';\nimport * as messages from '../../shared/messages';\nimport * as availableDrives from './models/available-drives';\nimport * as flashState from './models/flash-state';\nimport * as settings from './models/settings';\nimport { Actions, observe, store } from './models/store';\nimport * as analytics from './modules/analytics';\nimport { spawnChildAndConnect } from './modules/api';\nimport * as exceptionReporter from './modules/exception-reporter';\nimport * as osDialog from './os/dialog';\nimport * as windowProgress from './os/window-progress';\nimport MainPage from './pages/main/MainPage';\nimport './css/main.css';\nimport * as i18next from 'i18next';\nimport type { SourceMetadata } from '../../shared/typings/source-selector';\n\nwindow.addEventListener(\n\t'unhandledrejection',\n\t(event: PromiseRejectionEvent | any) => {\n\t\t// Promise: event.reason\n\t\t// Anything else: event\n\t\tconst error = event.reason || event;\n\t\tanalytics.logException(error);\n\t\tevent.preventDefault();\n\t},\n);\n\n// Set application session UUID\nstore.dispatch({\n\ttype: Actions.SET_APPLICATION_SESSION_UUID,\n\tdata: uuidV4(),\n});\n\n// Set first flashing workflow UUID\nstore.dispatch({\n\ttype: Actions.SET_FLASHING_WORKFLOW_UUID,\n\tdata: uuidV4(),\n});\n\nconsole.log(outdent`\n\t${outdent}\n\t _____ _       _\n\t|  ___| |     | |\n\t| |__ | |_ ___| |__   ___ _ __\n\t|  __|| __/ __| '_ \\\\ / _ \\\\ '__|\n\t| |___| || (__| | | |  __/ |\n\t\\\\____/ \\\\__\\\\___|_| |_|\\\\___|_|\n\n\tInterested in joining the Etcher team?\n\tDrop us a line at join+etcher@balena.io\n\n\tVersion = ${packageJSON.version}, Type = ${packageJSON.packageType}\n`);\n\nconst debouncedLog = debounce(console.log, 1000, { maxWait: 1000 });\n\nfunction pluralize(word: string, quantity: number) {\n\treturn `${quantity} ${word}${quantity === 1 ? '' : 's'}`;\n}\n\nobserve(() => {\n\tif (!flashState.isFlashing()) {\n\t\treturn;\n\t}\n\tconst currentFlashState = flashState.getFlashState();\n\twindowProgress.set(currentFlashState);\n\n\tlet eta = '';\n\tif (currentFlashState.eta !== undefined) {\n\t\teta = `eta in ${currentFlashState.eta.toFixed(0)}s`;\n\t}\n\tlet active = '';\n\tif (currentFlashState.type !== 'decompressing') {\n\t\tactive = pluralize('device', currentFlashState.active);\n\t}\n\t// NOTE: There is usually a short time period between the `isFlashing()`\n\t// property being set, and the flashing actually starting, which\n\t// might cause some non-sense flashing state logs including\n\t// `undefined` values.\n\tdebouncedLog(outdent({ newline: ' ' })`\n\t\t${capitalize(currentFlashState.type)}\n\t\t${active},\n\t\t${currentFlashState.percentage}%\n\t\tat\n\t\t${(currentFlashState.speed || 0).toFixed(2)}\n\t\tMB/s\n\t\t(total ${(currentFlashState.speed * currentFlashState.active).toFixed(2)} MB/s)\n\t\t${eta}\n\t\twith\n\t\t${pluralize('failed device', currentFlashState.failed)}\n\t`);\n});\n\nfunction setDrives(drives: Dictionary<DrivelistDrive>) {\n\t// prevent setting drives while flashing otherwise we might lose some while we unmount them\n\tif (!flashState.isFlashing()) {\n\t\tavailableDrives.setDrives(values(drives));\n\t}\n}\n\n// Spawning the child process without privileges to get the drives list\n// TODO: clean up this mess of exports\nexport let requestMetadata: any;\n\n// start the api and spawn the child process\nspawnChildAndConnect({\n\twithPrivileges: false,\n})\n\t.then(({ emit, registerHandler }) => {\n\t\t// start scanning\n\t\temit('scan', {});\n\n\t\t// make the sourceMetada awaitable to be used on source selection\n\t\trequestMetadata = async (params: any): Promise<SourceMetadata> => {\n\t\t\temit('sourceMetadata', JSON.stringify(params));\n\n\t\t\treturn new Promise((resolve) =>\n\t\t\t\tregisterHandler('sourceMetadata', (data: any) => {\n\t\t\t\t\tresolve(JSON.parse(data));\n\t\t\t\t}),\n\t\t\t);\n\t\t};\n\n\t\tregisterHandler('drives', (data: any) => {\n\t\t\tsetDrives(JSON.parse(data));\n\t\t});\n\t})\n\t.catch((error: any) => {\n\t\tthrow new Error(`Failed to start the flasher process. error: ${error}`);\n\t});\n\nlet popupExists = false;\n\nanalytics.initAnalytics();\n\nwindow.addEventListener('beforeunload', async (event) => {\n\tif (!flashState.isFlashing() || popupExists) {\n\t\treturn;\n\t}\n\n\t// Don't close window while flashing\n\tevent.returnValue = false;\n\n\t// Don't open any more popups\n\tpopupExists = true;\n\n\ttry {\n\t\tconst confirmed = await osDialog.showWarning({\n\t\t\tconfirmationLabel: i18next.t('yesExit'),\n\t\t\trejectionLabel: i18next.t('cancel'),\n\t\t\ttitle: i18next.t('reallyExit'),\n\t\t\tdescription: messages.warning.exitWhileFlashing(),\n\t\t});\n\t\tif (confirmed) {\n\t\t\t// This circumvents the 'beforeunload' event unlike\n\t\t\t// remote.app.quit() which does not.\n\t\t\tremote.process.exit(EXIT_CODES.SUCCESS);\n\t\t}\n\n\t\tpopupExists = false;\n\t} catch (error: any) {\n\t\texceptionReporter.report(error);\n\t}\n});\n\nexport async function main() {\n\ttry {\n\t\tconst { init: ledsInit } = require('./models/leds');\n\t\tawait ledsInit();\n\t} catch (error: any) {\n\t\texceptionReporter.report(error);\n\t}\n\n\tReactDOM.render(\n\t\tReact.createElement(MainPage),\n\t\tdocument.getElementById('main'),\n\t\t// callback to set the correct zoomFactor for webviews as well\n\t\tasync () => {\n\t\t\tconst fullscreen = await settings.get('fullscreen');\n\t\t\tconst width = fullscreen ? window.screen.width : window.outerWidth;\n\t\t\ttry {\n\t\t\t\telectron.webFrame.setZoomFactor(width / settings.DEFAULT_WIDTH);\n\t\t\t} catch (err) {\n\t\t\t\t// noop\n\t\t\t}\n\t\t},\n\t);\n}\n"
  },
  {
    "path": "lib/gui/app/components/drive-selector/drive-selector.tsx",
    "content": "/*\n * Copyright 2019 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport ExclamationTriangleSvg from '@fortawesome/fontawesome-free/svgs/solid/triangle-exclamation.svg';\nimport ChevronDownSvg from '@fortawesome/fontawesome-free/svgs/solid/chevron-down.svg';\nimport type * as sourceDestination from 'etcher-sdk/build/source-destination/';\nimport * as React from 'react';\nimport type { ModalProps, TableColumn } from 'rendition';\nimport { Flex, Txt, Badge, Link } from 'rendition';\nimport styled from 'styled-components';\n\nimport type {\n\tDriveStatus,\n\tDrivelistDrive,\n} from '../../../../shared/drive-constraints';\nimport {\n\tgetDriveImageCompatibilityStatuses,\n\tisDriveValid,\n\tisDriveSizeLarge,\n} from '../../../../shared/drive-constraints';\nimport { compatibility, warning } from '../../../../shared/messages';\nimport prettyBytes from 'pretty-bytes';\nimport { getDrives, hasAvailableDrives } from '../../models/available-drives';\nimport { getImage, isDriveSelected } from '../../models/selection-state';\nimport { store } from '../../models/store';\nimport { logException } from '../../modules/analytics';\nimport { open as openExternal } from '../../os/open-external/services/open-external';\nimport type { GenericTableProps } from '../../styled-components';\nimport { Alert, Modal, Table } from '../../styled-components';\n\nimport type { SourceMetadata } from '../../../../shared/typings/source-selector';\nimport { middleEllipsis } from '../../utils/middle-ellipsis';\nimport * as i18next from 'i18next';\n\ninterface UsbbootDrive extends sourceDestination.UsbbootDrive {\n\tprogress: number;\n}\n\ninterface DriverlessDrive {\n\tdisplayName: string; // added in app.ts\n\tdescription: string;\n\tlink: string;\n\tlinkTitle: string;\n\tlinkMessage: string;\n\tlinkCTA: string;\n}\n\ntype Drive = DrivelistDrive | DriverlessDrive | UsbbootDrive;\n\nfunction isUsbbootDrive(drive: Drive): drive is UsbbootDrive {\n\treturn (drive as UsbbootDrive).progress !== undefined;\n}\n\nfunction isDriverlessDrive(drive: Drive): drive is DriverlessDrive {\n\treturn (drive as DriverlessDrive).link !== undefined;\n}\n\nfunction isDrivelistDrive(drive: Drive): drive is DrivelistDrive {\n\treturn typeof (drive as DrivelistDrive).size === 'number';\n}\n\nconst DrivesTable = styled((props: GenericTableProps<Drive>) => (\n\t<Table<Drive> {...props} />\n))`\n\t[data-display='table-head'],\n\t[data-display='table-body'] {\n\t\t> [data-display='table-row'] > [data-display='table-cell'] {\n\t\t\t&:nth-child(2) {\n\t\t\t\twidth: 32%;\n\t\t\t}\n\n\t\t\t&:nth-child(3) {\n\t\t\t\twidth: 15%;\n\t\t\t}\n\n\t\t\t&:nth-child(4) {\n\t\t\t\twidth: 15%;\n\t\t\t}\n\n\t\t\t&:nth-child(5) {\n\t\t\t\twidth: 32%;\n\t\t\t}\n\t\t}\n\t}\n`;\n\nfunction badgeShadeFromStatus(status: string) {\n\tswitch (status) {\n\t\tcase compatibility.containsImage():\n\t\t\treturn 16;\n\t\tcase compatibility.system():\n\t\tcase compatibility.tooSmall():\n\t\t\treturn 5;\n\t\tdefault:\n\t\t\treturn 14;\n\t}\n}\n\nconst InitProgress = styled(\n\t({\n\t\tvalue,\n\t\t...props\n\t}: {\n\t\tvalue: number;\n\t\tprops?: React.ProgressHTMLAttributes<Element>;\n\t}) => {\n\t\treturn <progress max=\"100\" value={value} {...props} />;\n\t},\n)`\n\t/* Reset the default appearance */\n\tappearance: none;\n\n\t::-webkit-progress-bar {\n\t\twidth: 130px;\n\t\theight: 4px;\n\t\tbackground-color: #dde1f0;\n\t\tborder-radius: 14px;\n\t}\n\n\t::-webkit-progress-value {\n\t\tbackground-color: #1496e1;\n\t\tborder-radius: 14px;\n\t}\n`;\n\nexport interface DriveSelectorProps\n\textends Omit<ModalProps, 'done' | 'cancel' | 'onSelect'> {\n\twrite: boolean;\n\tmultipleSelection: boolean;\n\tshowWarnings?: boolean;\n\tcancel: (drives: DrivelistDrive[]) => void;\n\tdone: (drives: DrivelistDrive[]) => void;\n\ttitleLabel: string;\n\temptyListLabel: string;\n\temptyListIcon: JSX.Element;\n\tselectedList?: DrivelistDrive[];\n\tupdateSelectedList?: () => DrivelistDrive[];\n\tonSelect?: (drive: DrivelistDrive) => void;\n}\n\ninterface DriveSelectorState {\n\tdrives: Drive[];\n\timage?: SourceMetadata;\n\tmissingDriversModal: { drive?: DriverlessDrive };\n\tselectedList: DrivelistDrive[];\n\tshowSystemDrives: boolean;\n}\n\nfunction isSystemDrive(drive: Drive) {\n\treturn isDrivelistDrive(drive) && drive.isSystem;\n}\n\nexport class DriveSelector extends React.Component<\n\tDriveSelectorProps,\n\tDriveSelectorState\n> {\n\tprivate unsubscribe: (() => void) | undefined;\n\ttableColumns: Array<TableColumn<Drive>>;\n\toriginalList: DrivelistDrive[];\n\n\tconstructor(props: DriveSelectorProps) {\n\t\tsuper(props);\n\n\t\tconst defaultMissingDriversModalState: { drive?: DriverlessDrive } = {};\n\t\tconst selectedList = this.props.selectedList || [];\n\t\tthis.originalList = [...(this.props.selectedList || [])];\n\n\t\tthis.state = {\n\t\t\tdrives: getDrives(),\n\t\t\timage: getImage(),\n\t\t\tmissingDriversModal: defaultMissingDriversModalState,\n\t\t\tselectedList,\n\t\t\tshowSystemDrives: false,\n\t\t};\n\n\t\tthis.tableColumns = [\n\t\t\t{\n\t\t\t\tfield: 'description',\n\t\t\t\tlabel: i18next.t('drives.name'),\n\t\t\t\trender: (description: string, drive: Drive) => {\n\t\t\t\t\tif (isDrivelistDrive(drive)) {\n\t\t\t\t\t\tconst isLargeDrive = isDriveSizeLarge(drive);\n\t\t\t\t\t\tconst hasWarnings =\n\t\t\t\t\t\t\tthis.props.showWarnings && (isLargeDrive || drive.isSystem);\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Flex alignItems=\"center\">\n\t\t\t\t\t\t\t\t{hasWarnings && (\n\t\t\t\t\t\t\t\t\t<ExclamationTriangleSvg\n\t\t\t\t\t\t\t\t\t\theight=\"1em\"\n\t\t\t\t\t\t\t\t\t\tfill={drive.isSystem ? '#fca321' : '#8f9297'}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<Txt ml={(hasWarnings && 8) || 0}>\n\t\t\t\t\t\t\t\t\t{middleEllipsis(description, 32)}\n\t\t\t\t\t\t\t\t</Txt>\n\t\t\t\t\t\t\t</Flex>\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn <Txt>{description}</Txt>;\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tfield: 'description',\n\t\t\t\tkey: 'size',\n\t\t\t\tlabel: i18next.t('drives.size'),\n\t\t\t\trender: (_description: string, drive: Drive) => {\n\t\t\t\t\tif (isDrivelistDrive(drive) && drive.size !== null) {\n\t\t\t\t\t\treturn prettyBytes(drive.size);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tfield: 'description',\n\t\t\t\tkey: 'link',\n\t\t\t\tlabel: i18next.t('drives.location'),\n\t\t\t\trender: (_description: string, drive: Drive) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Txt>\n\t\t\t\t\t\t\t{drive.displayName}\n\t\t\t\t\t\t\t{isDriverlessDrive(drive) && (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t{' '}\n\t\t\t\t\t\t\t\t\t-{' '}\n\t\t\t\t\t\t\t\t\t<b>\n\t\t\t\t\t\t\t\t\t\t<a onClick={() => this.installMissingDrivers(drive)}>\n\t\t\t\t\t\t\t\t\t\t\t{drive.linkCTA}\n\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t</b>\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Txt>\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tfield: 'description',\n\t\t\t\tkey: 'extra',\n\t\t\t\t// We use an empty React fragment otherwise it uses the field name as label\n\t\t\t\tlabel: <></>,\n\t\t\t\trender: (_description: string, drive: Drive) => {\n\t\t\t\t\tif (isUsbbootDrive(drive)) {\n\t\t\t\t\t\treturn this.renderProgress(drive.progress);\n\t\t\t\t\t} else if (isDrivelistDrive(drive)) {\n\t\t\t\t\t\treturn this.renderStatuses(drive);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t}\n\n\tprivate driveShouldBeDisabled(drive: Drive, image?: SourceMetadata) {\n\t\treturn (\n\t\t\tisUsbbootDrive(drive) ||\n\t\t\tisDriverlessDrive(drive) ||\n\t\t\t!isDriveValid(drive, image, this.props.write) ||\n\t\t\t(this.props.write && drive.isReadOnly)\n\t\t);\n\t}\n\n\tprivate getDisplayedDrives(drives: Drive[]): Drive[] {\n\t\treturn drives.filter((drive) => {\n\t\t\treturn (\n\t\t\t\tisUsbbootDrive(drive) ||\n\t\t\t\tisDriverlessDrive(drive) ||\n\t\t\t\tisDriveSelected(drive.device) ||\n\t\t\t\tthis.state.showSystemDrives ||\n\t\t\t\t!drive.isSystem\n\t\t\t);\n\t\t});\n\t}\n\n\tprivate getDisabledDrives(drives: Drive[], image?: SourceMetadata): string[] {\n\t\treturn drives\n\t\t\t.filter((drive) => this.driveShouldBeDisabled(drive, image))\n\t\t\t.map((drive) => drive.displayName);\n\t}\n\n\tprivate renderProgress(progress: number) {\n\t\treturn (\n\t\t\t<Flex flexDirection=\"column\">\n\t\t\t\t<Txt fontSize={12}>Initializing device</Txt>\n\t\t\t\t<InitProgress value={progress} />\n\t\t\t</Flex>\n\t\t);\n\t}\n\n\tprivate warningFromStatus(\n\t\tstatus: string,\n\t\tdrive: { device: string; size: number },\n\t) {\n\t\tswitch (status) {\n\t\t\tcase compatibility.containsImage():\n\t\t\t\treturn warning.sourceDrive();\n\t\t\tcase compatibility.largeDrive():\n\t\t\t\treturn warning.largeDriveSize();\n\t\t\tcase compatibility.system():\n\t\t\t\treturn warning.systemDrive();\n\t\t\tcase compatibility.tooSmall():\n\t\t\t\treturn warning.tooSmall(\n\t\t\t\t\t{\n\t\t\t\t\t\tsize:\n\t\t\t\t\t\t\tthis.state.image?.recommendedDriveSize ||\n\t\t\t\t\t\t\tthis.state.image?.size ||\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t},\n\t\t\t\t\tdrive,\n\t\t\t\t);\n\t\t\tdefault:\n\t\t\t\treturn '';\n\t\t}\n\t}\n\n\tprivate renderStatuses(drive: DrivelistDrive) {\n\t\tconst statuses: DriveStatus[] = getDriveImageCompatibilityStatuses(\n\t\t\tdrive,\n\t\t\tthis.state.image,\n\t\t\tthis.props.write,\n\t\t).slice(0, 2);\n\t\treturn (\n\t\t\t// the column render fn expects a single Element\n\t\t\t<>\n\t\t\t\t{statuses.map((status) => {\n\t\t\t\t\tconst badgeShade = badgeShadeFromStatus(status.message);\n\t\t\t\t\tconst warningMessage = this.warningFromStatus(status.message, {\n\t\t\t\t\t\tdevice: drive.device,\n\t\t\t\t\t\tsize: drive.size || 0,\n\t\t\t\t\t});\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\tkey={status.message}\n\t\t\t\t\t\t\tshade={badgeShade}\n\t\t\t\t\t\t\tmr=\"8px\"\n\t\t\t\t\t\t\ttooltip={this.props.showWarnings ? warningMessage : ''}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{status.message}\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</>\n\t\t);\n\t}\n\n\tprivate installMissingDrivers(drive: DriverlessDrive) {\n\t\tif (drive.link) {\n\t\t\tthis.setState({ missingDriversModal: { drive } });\n\t\t}\n\t}\n\n\tcomponentDidMount() {\n\t\tthis.unsubscribe = store.subscribe(() => {\n\t\t\tconst drives = getDrives();\n\t\t\tconst image = getImage();\n\t\t\tthis.setState({\n\t\t\t\tdrives,\n\t\t\t\timage,\n\t\t\t\tselectedList:\n\t\t\t\t\t(this.props.updateSelectedList && this.props.updateSelectedList()) ||\n\t\t\t\t\t[],\n\t\t\t});\n\t\t});\n\t}\n\n\tcomponentWillUnmount() {\n\t\tthis.unsubscribe?.();\n\t}\n\n\trender() {\n\t\tconst { cancel, done, ...props } = this.props;\n\t\tconst { selectedList, drives, image, missingDriversModal } = this.state;\n\n\t\tconst displayedDrives = this.getDisplayedDrives(drives);\n\t\tconst disabledDrives = this.getDisabledDrives(drives, image);\n\t\tconst numberOfSystemDrives = drives.filter(isSystemDrive).length;\n\t\tconst numberOfDisplayedSystemDrives =\n\t\t\tdisplayedDrives.filter(isSystemDrive).length;\n\t\tconst numberOfHiddenSystemDrives =\n\t\t\tnumberOfSystemDrives - numberOfDisplayedSystemDrives;\n\t\tconst hasSystemDrives = selectedList.filter(isSystemDrive).length;\n\t\tconst showWarnings = this.props.showWarnings && hasSystemDrives;\n\n\t\treturn (\n\t\t\t<Modal\n\t\t\t\ttitleElement={\n\t\t\t\t\t<Flex alignItems=\"baseline\" mb={18}>\n\t\t\t\t\t\t<Txt fontSize={24} align=\"left\">\n\t\t\t\t\t\t\t{this.props.titleLabel}\n\t\t\t\t\t\t</Txt>\n\t\t\t\t\t\t<Txt\n\t\t\t\t\t\t\tfontSize={11}\n\t\t\t\t\t\t\tml={12}\n\t\t\t\t\t\t\tcolor=\"#5b82a7\"\n\t\t\t\t\t\t\tstyle={{ fontWeight: 600 }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{i18next.t('drives.find', { length: drives.length })}\n\t\t\t\t\t\t</Txt>\n\t\t\t\t\t</Flex>\n\t\t\t\t}\n\t\t\t\ttitleDetails={<Txt fontSize={11}>{getDrives().length} found</Txt>}\n\t\t\t\tcancel={() => cancel(this.originalList)}\n\t\t\t\tdone={() => done(selectedList)}\n\t\t\t\taction={i18next.t('drives.select', { select: selectedList.length })}\n\t\t\t\tprimaryButtonProps={{\n\t\t\t\t\tprimary: !showWarnings,\n\t\t\t\t\twarning: showWarnings,\n\t\t\t\t\tdisabled: !hasAvailableDrives(),\n\t\t\t\t}}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{!hasAvailableDrives() ? (\n\t\t\t\t\t<Flex\n\t\t\t\t\t\tflexDirection=\"column\"\n\t\t\t\t\t\tjustifyContent=\"center\"\n\t\t\t\t\t\talignItems=\"center\"\n\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{this.props.emptyListIcon}\n\t\t\t\t\t\t<b>{this.props.emptyListLabel}</b>\n\t\t\t\t\t</Flex>\n\t\t\t\t) : (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<DrivesTable\n\t\t\t\t\t\t\trefFn={() => {\n\t\t\t\t\t\t\t\t// noop\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tcheckedItems={selectedList}\n\t\t\t\t\t\t\tcheckedRowsNumber={selectedList.length}\n\t\t\t\t\t\t\tmultipleSelection={this.props.multipleSelection}\n\t\t\t\t\t\t\tcolumns={this.tableColumns}\n\t\t\t\t\t\t\tdata={displayedDrives}\n\t\t\t\t\t\t\tdisabledRows={disabledDrives}\n\t\t\t\t\t\t\tgetRowClass={(row: Drive) =>\n\t\t\t\t\t\t\t\tisDrivelistDrive(row) && row.isSystem ? ['system'] : []\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\trowKey=\"displayName\"\n\t\t\t\t\t\t\tonCheck={(rows) => {\n\t\t\t\t\t\t\t\tif (rows == null) {\n\t\t\t\t\t\t\t\t\trows = [];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlet newSelection = rows.filter(isDrivelistDrive);\n\t\t\t\t\t\t\t\tif (this.props.multipleSelection) {\n\t\t\t\t\t\t\t\t\tif (rows.length === 0) {\n\t\t\t\t\t\t\t\t\t\tnewSelection = [];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst deselecting = selectedList.filter(\n\t\t\t\t\t\t\t\t\t\t(selected) =>\n\t\t\t\t\t\t\t\t\t\t\tnewSelection.filter(\n\t\t\t\t\t\t\t\t\t\t\t\t(row) => row.device === selected.device,\n\t\t\t\t\t\t\t\t\t\t\t).length === 0,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tconst selecting = newSelection.filter(\n\t\t\t\t\t\t\t\t\t\t(row) =>\n\t\t\t\t\t\t\t\t\t\t\tselectedList.filter(\n\t\t\t\t\t\t\t\t\t\t\t\t(selected) => row.device === selected.device,\n\t\t\t\t\t\t\t\t\t\t\t).length === 0,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tdeselecting.concat(selecting).forEach((row) => {\n\t\t\t\t\t\t\t\t\t\tif (this.props.onSelect) {\n\t\t\t\t\t\t\t\t\t\t\tthis.props.onSelect(row);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tthis.setState({\n\t\t\t\t\t\t\t\t\t\tselectedList: newSelection,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (this.props.onSelect) {\n\t\t\t\t\t\t\t\t\tthis.props.onSelect(newSelection[newSelection.length - 1]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis.setState({\n\t\t\t\t\t\t\t\t\tselectedList: newSelection.slice(newSelection.length - 1),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonRowClick={(row: Drive) => {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t!isDrivelistDrive(row) ||\n\t\t\t\t\t\t\t\t\tthis.driveShouldBeDisabled(row, image)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (this.props.onSelect) {\n\t\t\t\t\t\t\t\t\tthis.props.onSelect(row);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst index = selectedList.findIndex(\n\t\t\t\t\t\t\t\t\t(d) => d.device === row.device,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tconst newList = this.props.multipleSelection\n\t\t\t\t\t\t\t\t\t? [...selectedList]\n\t\t\t\t\t\t\t\t\t: [];\n\t\t\t\t\t\t\t\tif (index === -1) {\n\t\t\t\t\t\t\t\t\tnewList.push(row);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// Deselect if selected\n\t\t\t\t\t\t\t\t\tnewList.splice(index, 1);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis.setState({\n\t\t\t\t\t\t\t\t\tselectedList: newList,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{numberOfHiddenSystemDrives > 0 && (\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tmt={15}\n\t\t\t\t\t\t\t\tmb={15}\n\t\t\t\t\t\t\t\tfontSize=\"14px\"\n\t\t\t\t\t\t\t\tonClick={() => this.setState({ showSystemDrives: true })}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Flex alignItems=\"center\">\n\t\t\t\t\t\t\t\t\t<ChevronDownSvg height=\"1em\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t<Txt ml={8}>\n\t\t\t\t\t\t\t\t\t\t{i18next.t('drives.showHidden', {\n\t\t\t\t\t\t\t\t\t\t\tnum: numberOfHiddenSystemDrives,\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t</Txt>\n\t\t\t\t\t\t\t\t</Flex>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{this.props.showWarnings && hasSystemDrives ? (\n\t\t\t\t\t<Alert className=\"system-drive-alert\" style={{ width: '67%' }}>\n\t\t\t\t\t\t{i18next.t('drives.systemDriveDanger')}\n\t\t\t\t\t</Alert>\n\t\t\t\t) : null}\n\n\t\t\t\t{missingDriversModal.drive !== undefined && (\n\t\t\t\t\t<Modal\n\t\t\t\t\t\twidth={400}\n\t\t\t\t\t\ttitle={missingDriversModal.drive.linkTitle}\n\t\t\t\t\t\tcancel={() => this.setState({ missingDriversModal: {} })}\n\t\t\t\t\t\tdone={() => {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tif (missingDriversModal.drive !== undefined) {\n\t\t\t\t\t\t\t\t\topenExternal(missingDriversModal.drive.link);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch (error: any) {\n\t\t\t\t\t\t\t\tlogException(error);\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tthis.setState({ missingDriversModal: {} });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\taction={i18next.t('yesContinue')}\n\t\t\t\t\t\tcancelButtonProps={{\n\t\t\t\t\t\t\tchildren: i18next.t('cancel'),\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tchildren={\n\t\t\t\t\t\t\tmissingDriversModal.drive.linkMessage ||\n\t\t\t\t\t\t\ti18next.t('drives.openInBrowser', {\n\t\t\t\t\t\t\t\tlink: missingDriversModal.drive.link,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t);\n\t}\n}\n"
  },
  {
    "path": "lib/gui/app/components/drive-status-warning-modal/drive-status-warning-modal.tsx",
    "content": "import ExclamationTriangleSvg from '@fortawesome/fontawesome-free/svgs/solid/triangle-exclamation.svg';\nimport * as React from 'react';\nimport type { ModalProps } from 'rendition';\nimport { Badge, Flex, Txt } from 'rendition';\nimport { Modal, ScrollableFlex } from '../../styled-components';\nimport { middleEllipsis } from '../../utils/middle-ellipsis';\n\nimport prettyBytes from 'pretty-bytes';\nimport type { DriveWithWarnings } from '../../pages/main/Flash';\nimport * as i18next from 'i18next';\n\nconst DriveStatusWarningModal = ({\n\tdone,\n\tcancel,\n\tisSystem,\n\tdrivesWithWarnings,\n}: ModalProps & {\n\tisSystem: boolean;\n\tdrivesWithWarnings: DriveWithWarnings[];\n}) => {\n\tlet warningSubtitle = i18next.t('drives.largeDriveWarning');\n\tlet warningCta = i18next.t('drives.largeDriveWarningMsg');\n\n\tif (isSystem) {\n\t\twarningSubtitle = i18next.t('drives.systemDriveWarning');\n\t\twarningCta = i18next.t('drives.systemDriveWarningMsg');\n\t}\n\treturn (\n\t\t<Modal\n\t\t\tfooterShadow={false}\n\t\t\treverseFooterButtons={true}\n\t\t\tdone={done}\n\t\t\tcancel={cancel}\n\t\t\tcancelButtonProps={{\n\t\t\t\tprimary: false,\n\t\t\t\twarning: true,\n\t\t\t\tchildren: i18next.t('drives.changeTarget'),\n\t\t\t}}\n\t\t\taction={i18next.t('sure')}\n\t\t\tprimaryButtonProps={{\n\t\t\t\tprimary: false,\n\t\t\t\toutline: true,\n\t\t\t}}\n\t\t>\n\t\t\t<Flex\n\t\t\t\tflexDirection=\"column\"\n\t\t\t\talignItems=\"center\"\n\t\t\t\tjustifyContent=\"center\"\n\t\t\t\twidth=\"100%\"\n\t\t\t>\n\t\t\t\t<Flex flexDirection=\"column\">\n\t\t\t\t\t<ExclamationTriangleSvg height=\"2em\" fill=\"#fca321\" />\n\t\t\t\t\t<Txt fontSize=\"24px\" color=\"#fca321\">\n\t\t\t\t\t\t{i18next.t('warning')}\n\t\t\t\t\t</Txt>\n\t\t\t\t</Flex>\n\t\t\t\t<Txt fontSize=\"24px\">{warningSubtitle}</Txt>\n\t\t\t\t<ScrollableFlex\n\t\t\t\t\tflexDirection=\"column\"\n\t\t\t\t\tbackgroundColor=\"#fff5e6\"\n\t\t\t\t\tm=\"2em 0\"\n\t\t\t\t\tp=\"1em 2em\"\n\t\t\t\t\twidth=\"420px\"\n\t\t\t\t\tmaxHeight=\"100px\"\n\t\t\t\t>\n\t\t\t\t\t{drivesWithWarnings.map((drive, i, array) => (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Flex justifyContent=\"space-between\" alignItems=\"baseline\">\n\t\t\t\t\t\t\t\t<strong>{middleEllipsis(drive.description, 28)}</strong>{' '}\n\t\t\t\t\t\t\t\t{drive.size && prettyBytes(drive.size) + ' '}\n\t\t\t\t\t\t\t\t<Badge shade={5}>{drive.statuses[0].message}</Badge>\n\t\t\t\t\t\t\t</Flex>\n\t\t\t\t\t\t\t{i !== array.length - 1 ? <hr style={{ width: '100%' }} /> : null}\n\t\t\t\t\t\t</>\n\t\t\t\t\t))}\n\t\t\t\t</ScrollableFlex>\n\t\t\t\t<Txt style={{ fontWeight: 600 }}>{warningCta}</Txt>\n\t\t\t</Flex>\n\t\t</Modal>\n\t);\n};\n\nexport default DriveStatusWarningModal;\n"
  },
  {
    "path": "lib/gui/app/components/finish/finish.tsx",
    "content": "/*\n * Copyright 2019 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as React from 'react';\nimport { Flex } from 'rendition';\nimport { v4 as uuidV4 } from 'uuid';\n\nimport * as flashState from '../../models/flash-state';\nimport * as selectionState from '../../models/selection-state';\nimport * as settings from '../../models/settings';\nimport { Actions, store } from '../../models/store';\nimport { FlashAnother } from '../flash-another/flash-another';\nimport type { FlashError } from '../flash-results/flash-results';\nimport { FlashResults } from '../flash-results/flash-results';\nimport { SafeWebview } from '../safe-webview/safe-webview';\n\nfunction restart(goToMain: () => void) {\n\tselectionState.deselectAllDrives();\n\n\t// Reset the flashing workflow uuid\n\tstore.dispatch({\n\t\ttype: Actions.SET_FLASHING_WORKFLOW_UUID,\n\t\tdata: uuidV4(),\n\t});\n\n\tgoToMain();\n}\n\nasync function getSuccessBannerURL() {\n\treturn (\n\t\t(await settings.get('successBannerURL')) ??\n\t\t'https://efp.balena.io/success-banner?borderTop=false&darkBackground=true'\n\t);\n}\n\nfunction FinishPage({ goToMain }: { goToMain: () => void }) {\n\tconst [webviewShowing, setWebviewShowing] = React.useState(false);\n\tconst [successBannerURL, setSuccessBannerURL] = React.useState('');\n\t(async () => {\n\t\tsetSuccessBannerURL(await getSuccessBannerURL());\n\t})();\n\tconst flashResults = flashState.getFlashResults();\n\tconst errors: FlashError[] = (\n\t\tstore.getState().toJS().failedDeviceErrors || []\n\t).map(([, error]: [string, FlashError]) => ({\n\t\t...error,\n\t}));\n\tconst { averageSpeed, blockmappedSize, bytesWritten, failed, size } =\n\t\tflashState.getFlashState();\n\tconst {\n\t\tskip,\n\t\tresults = {\n\t\t\tbytesWritten,\n\t\t\tsourceMetadata: {\n\t\t\t\tsize,\n\t\t\t\tblockmappedSize,\n\t\t\t},\n\t\t\taverageFlashingSpeed: averageSpeed,\n\t\t\tdevices: { failed, successful: 0 },\n\t\t},\n\t} = flashResults;\n\treturn (\n\t\t<Flex height=\"100%\" justifyContent=\"space-between\">\n\t\t\t<Flex\n\t\t\t\twidth={webviewShowing ? '36.2vw' : '100vw'}\n\t\t\t\theight=\"100vh\"\n\t\t\t\talignItems=\"center\"\n\t\t\t\tjustifyContent=\"center\"\n\t\t\t\tflexDirection=\"column\"\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tzIndex: 1,\n\t\t\t\t\tboxShadow: '0 2px 15px 0 rgba(0, 0, 0, 0.2)',\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<FlashResults\n\t\t\t\t\timage={selectionState.getImage()?.name}\n\t\t\t\t\tresults={results}\n\t\t\t\t\tskip={skip}\n\t\t\t\t\terrors={errors}\n\t\t\t\t\tmb=\"32px\"\n\t\t\t\t\tgoToMain={goToMain}\n\t\t\t\t/>\n\n\t\t\t\t<FlashAnother\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\trestart(goToMain);\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</Flex>\n\t\t\t{successBannerURL.length && (\n\t\t\t\t<SafeWebview\n\t\t\t\t\tsrc={successBannerURL}\n\t\t\t\t\tonWebviewShow={setWebviewShowing}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: webviewShowing ? 'flex' : 'none',\n\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\twidth: '63.8vw',\n\t\t\t\t\t\theight: '100vh',\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</Flex>\n\t);\n}\n\nexport default FinishPage;\n"
  },
  {
    "path": "lib/gui/app/components/flash-another/flash-another.tsx",
    "content": "/*\n * Copyright 2019 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as React from 'react';\n\nimport { BaseButton } from '../../styled-components';\nimport * as i18next from 'i18next';\n\nexport interface FlashAnotherProps {\n\tonClick: () => void;\n}\n\nexport const FlashAnother = (props: FlashAnotherProps) => {\n\treturn (\n\t\t<BaseButton primary onClick={props.onClick}>\n\t\t\t{i18next.t('flash.another')}\n\t\t</BaseButton>\n\t);\n};\n"
  },
  {
    "path": "lib/gui/app/components/flash-results/flash-results.tsx",
    "content": "/*\n * Copyright 2019 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport CircleSvg from '@fortawesome/fontawesome-free/svgs/solid/circle.svg';\nimport CheckCircleSvg from '@fortawesome/fontawesome-free/svgs/solid/circle-check.svg';\nimport TimesCircleSvg from '@fortawesome/fontawesome-free/svgs/solid/circle-xmark.svg';\nimport * as React from 'react';\nimport type { FlexProps, TableColumn } from 'rendition';\nimport { Flex, Link, Txt } from 'rendition';\nimport styled from 'styled-components';\n\nimport { progress } from '../../../../shared/messages';\nimport { bytesToMegabytes } from '../../../../shared/units';\n\nimport FlashSvg from '../../../assets/flash.svg';\nimport { getDrives } from '../../models/available-drives';\nimport { resetState } from '../../models/flash-state';\nimport * as selection from '../../models/selection-state';\nimport { middleEllipsis } from '../../utils/middle-ellipsis';\nimport { Modal, Table } from '../../styled-components';\nimport * as i18next from 'i18next';\n\nconst ErrorsTable = styled((props) => <Table<FlashError> {...props} />)`\n\t&&& [data-display='table-head'],\n\t&&& [data-display='table-body'] {\n\t\t> [data-display='table-row'] {\n\t\t\t> [data-display='table-cell'] {\n\t\t\t\t&:first-child {\n\t\t\t\t\twidth: 30%;\n\t\t\t\t}\n\n\t\t\t\t&:nth-child(2) {\n\t\t\t\t\twidth: 20%;\n\t\t\t\t}\n\n\t\t\t\t&:last-child {\n\t\t\t\t\twidth: 50%;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n`;\nconst DoneIcon = (props: {\n\tskipped: boolean;\n\tcolor: string;\n\tallFailed: boolean;\n}) => {\n\tconst svgProps = {\n\t\twidth: '28px',\n\t\tfill: props.color,\n\t\tstyle: {\n\t\t\tmarginTop: '-25px',\n\t\t\tmarginLeft: '13px',\n\t\t\tzIndex: 1,\n\t\t},\n\t};\n\treturn props.allFailed && !props.skipped ? (\n\t\t<TimesCircleSvg {...svgProps} />\n\t) : (\n\t\t<CheckCircleSvg {...svgProps} />\n\t);\n};\n\nexport interface FlashError extends Error {\n\tdescription: string;\n\tdevice: string;\n\tcode: string;\n}\n\nfunction formattedErrors(errors: FlashError[]) {\n\treturn errors\n\t\t.map((error) => `${error.device}: ${error.message || error.code}`)\n\t\t.join('\\n');\n}\n\nconst columns: Array<TableColumn<FlashError>> = [\n\t{\n\t\tfield: 'description',\n\t\tlabel: i18next.t('flash.target'),\n\t},\n\t{\n\t\tfield: 'device',\n\t\tlabel: i18next.t('flash.location'),\n\t},\n\t{\n\t\tfield: 'message',\n\t\tlabel: i18next.t('flash.error'),\n\t\trender: (message: string, { code }: FlashError) => {\n\t\t\treturn message ?? code;\n\t\t},\n\t},\n];\n\nfunction getEffectiveSpeed(results: {\n\tsourceMetadata: {\n\t\tsize: number;\n\t\tblockmappedSize?: number;\n\t};\n\taverageFlashingSpeed: number;\n}) {\n\tconst flashedSize =\n\t\tresults.sourceMetadata.blockmappedSize ?? results.sourceMetadata.size;\n\tconst timeSpent = flashedSize / results.averageFlashingSpeed;\n\treturn results.sourceMetadata.size / timeSpent;\n}\n\nexport function FlashResults({\n\tgoToMain,\n\timage = '',\n\terrors,\n\tresults,\n\tskip,\n\t...props\n}: {\n\tgoToMain: () => void;\n\timage?: string;\n\terrors: FlashError[];\n\tskip: boolean;\n\tresults: {\n\t\tsourceMetadata: {\n\t\t\tsize: number;\n\t\t\tblockmappedSize?: number;\n\t\t};\n\t\taverageFlashingSpeed: number;\n\t\tdevices: { failed: number; successful: number };\n\t};\n} & FlexProps) {\n\tconst [showErrorsInfo, setShowErrorsInfo] = React.useState(false);\n\n\tconst allFailed = !skip && results?.devices?.successful === 0;\n\tconst someFailed = results?.devices?.failed !== 0 || errors?.length !== 0;\n\tconst effectiveSpeed = bytesToMegabytes(getEffectiveSpeed(results)).toFixed(\n\t\t1,\n\t);\n\treturn (\n\t\t<Flex flexDirection=\"column\" {...props}>\n\t\t\t<Flex alignItems=\"center\" flexDirection=\"column\">\n\t\t\t\t<Flex\n\t\t\t\t\talignItems=\"center\"\n\t\t\t\t\tmt=\"50px\"\n\t\t\t\t\tmb=\"32px\"\n\t\t\t\t\tcolor=\"#7e8085\"\n\t\t\t\t\tflexDirection=\"column\"\n\t\t\t\t>\n\t\t\t\t\t<FlashSvg width=\"40px\" height=\"40px\" className=\"disabled\" />\n\t\t\t\t\t<DoneIcon\n\t\t\t\t\t\tskipped={skip}\n\t\t\t\t\t\tallFailed={allFailed}\n\t\t\t\t\t\tcolor={allFailed || someFailed ? '#c6c8c9' : '#1ac135'}\n\t\t\t\t\t/>\n\t\t\t\t\t<Txt>{middleEllipsis(image, 24)}</Txt>\n\t\t\t\t</Flex>\n\t\t\t\t<Txt fontSize={24} color=\"#fff\" mb=\"17px\">\n\t\t\t\t\t{allFailed\n\t\t\t\t\t\t? i18next.t('flash.flashFailed')\n\t\t\t\t\t\t: i18next.t('flash.flashCompleted')}\n\t\t\t\t</Txt>\n\t\t\t\t{skip ? <Txt color=\"#7e8085\">{i18next.t('flash.skip')}</Txt> : null}\n\t\t\t</Flex>\n\t\t\t<Flex flexDirection=\"column\" color=\"#7e8085\">\n\t\t\t\t{results.devices.successful !== 0 ? (\n\t\t\t\t\t<Flex alignItems=\"center\">\n\t\t\t\t\t\t<CircleSvg width=\"14px\" fill=\"#1ac135\" />\n\t\t\t\t\t\t<Txt ml=\"10px\" color=\"#fff\">\n\t\t\t\t\t\t\t{results.devices.successful}\n\t\t\t\t\t\t</Txt>\n\t\t\t\t\t\t<Txt ml=\"10px\">\n\t\t\t\t\t\t\t{progress.successful(results.devices.successful)}\n\t\t\t\t\t\t</Txt>\n\t\t\t\t\t</Flex>\n\t\t\t\t) : null}\n\t\t\t\t{errors.length !== 0 ? (\n\t\t\t\t\t<Flex alignItems=\"center\">\n\t\t\t\t\t\t<CircleSvg width=\"14px\" fill=\"#ff4444\" />\n\t\t\t\t\t\t<Txt ml=\"10px\" color=\"#fff\">\n\t\t\t\t\t\t\t{errors.length}\n\t\t\t\t\t\t</Txt>\n\t\t\t\t\t\t<Txt ml=\"10px\" tooltip={formattedErrors(errors)}>\n\t\t\t\t\t\t\t{progress.failed(errors.length)}\n\t\t\t\t\t\t</Txt>\n\t\t\t\t\t\t<Link ml=\"10px\" onClick={() => setShowErrorsInfo(true)}>\n\t\t\t\t\t\t\t{i18next.t('flash.moreInfo')}\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</Flex>\n\t\t\t\t) : null}\n\t\t\t\t{!allFailed && (\n\t\t\t\t\t<Txt\n\t\t\t\t\t\tfontSize=\"10px\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tfontWeight: 500,\n\t\t\t\t\t\t\ttextAlign: 'center',\n\t\t\t\t\t\t}}\n\t\t\t\t\t\ttooltip={i18next.t('flash.speedTip')}\n\t\t\t\t\t>\n\t\t\t\t\t\t{i18next.t('flash.speed', { speed: effectiveSpeed })}\n\t\t\t\t\t</Txt>\n\t\t\t\t)}\n\t\t\t</Flex>\n\n\t\t\t{showErrorsInfo && (\n\t\t\t\t<Modal\n\t\t\t\t\ttitleElement={\n\t\t\t\t\t\t<Flex alignItems=\"baseline\" mb={18}>\n\t\t\t\t\t\t\t<Txt fontSize={24} align=\"left\">\n\t\t\t\t\t\t\t\t{i18next.t('failedTarget')}\n\t\t\t\t\t\t\t</Txt>\n\t\t\t\t\t\t</Flex>\n\t\t\t\t\t}\n\t\t\t\t\taction={i18next.t('failedRetry')}\n\t\t\t\t\tcancel={() => setShowErrorsInfo(false)}\n\t\t\t\t\tdone={() => {\n\t\t\t\t\t\tsetShowErrorsInfo(false);\n\t\t\t\t\t\tresetState();\n\t\t\t\t\t\tgetDrives()\n\t\t\t\t\t\t\t.map((drive) => {\n\t\t\t\t\t\t\t\tselection.deselectDrive(drive.device);\n\t\t\t\t\t\t\t\treturn drive.device;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.filter((driveDevice) =>\n\t\t\t\t\t\t\t\terrors.some((error) => error.device === driveDevice),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.forEach((driveDevice) => selection.selectDrive(driveDevice));\n\t\t\t\t\t\tgoToMain();\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<ErrorsTable columns={columns} data={errors} />\n\t\t\t\t</Modal>\n\t\t\t)}\n\t\t</Flex>\n\t);\n}\n"
  },
  {
    "path": "lib/gui/app/components/progress-button/progress-button.tsx",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as React from 'react';\nimport { Flex, Button, ProgressBar, Txt } from 'rendition';\nimport { default as styled } from 'styled-components';\n\nimport { fromFlashState } from '../../modules/progress-status';\nimport { StepButton } from '../../styled-components';\nimport * as i18next from 'i18next';\n\nconst FlashProgressBar = styled(ProgressBar)`\n\t> div {\n\t\twidth: 100%;\n\t\theight: 12px;\n\t\tcolor: white !important;\n\t\ttext-shadow: none !important;\n\t\ttransition-duration: 0s;\n\n\t\t> div {\n\t\t\ttransition-duration: 0s;\n\t\t}\n\t}\n\n\twidth: 100%;\n\theight: 12px;\n\tmargin-bottom: 6px;\n\tborder-radius: 14px;\n\tfont-size: 16px;\n\tline-height: 48px;\n\n\tbackground: #2f3033;\n`;\n\ninterface ProgressButtonProps {\n\ttype: 'decompressing' | 'flashing' | 'verifying';\n\tactive: boolean;\n\tpercentage: number;\n\tposition: number;\n\tdisabled: boolean;\n\tcancel: (type: string) => void;\n\tcallback: () => void;\n\twarning?: boolean;\n}\n\nconst colors = {\n\tdecompressing: '#00aeef',\n\tflashing: '#da60ff',\n\tverifying: '#1ac135',\n} as const;\n\nconst CancelButton = styled(({ type, onClick, ...props }) => {\n\tconst status = type === 'verifying' ? i18next.t('skip') : i18next.t('cancel');\n\treturn (\n\t\t<Button plain onClick={() => onClick(status)} {...props}>\n\t\t\t{status}\n\t\t</Button>\n\t);\n})`\n\tfont-weight: 600;\n\n\t&&& {\n\t\twidth: auto;\n\t\theight: auto;\n\t\tfont-size: 14px;\n\t}\n`;\n\nexport class ProgressButton extends React.PureComponent<ProgressButtonProps> {\n\tpublic render() {\n\t\tconst percentage = this.props.percentage;\n\t\tconst warning = this.props.warning;\n\t\tconst { status, position } = fromFlashState({\n\t\t\ttype: this.props.type,\n\t\t\tpercentage,\n\t\t\tposition: this.props.position,\n\t\t});\n\t\tconst type = this.props.type || 'default';\n\t\tif (this.props.active) {\n\t\t\treturn (\n\t\t\t\t<>\n\t\t\t\t\t<Flex\n\t\t\t\t\t\talignItems=\"baseline\"\n\t\t\t\t\t\tjustifyContent=\"space-between\"\n\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tmarginTop: 42,\n\t\t\t\t\t\t\tmarginBottom: '6px',\n\t\t\t\t\t\t\tfontSize: 16,\n\t\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Flex>\n\t\t\t\t\t\t\t<Txt color=\"#fff\">{status}&nbsp;</Txt>\n\t\t\t\t\t\t\t<Txt color={colors[type]}>{position}</Txt>\n\t\t\t\t\t\t</Flex>\n\t\t\t\t\t\t{type && (\n\t\t\t\t\t\t\t<CancelButton\n\t\t\t\t\t\t\t\ttype={type}\n\t\t\t\t\t\t\t\tonClick={this.props.cancel}\n\t\t\t\t\t\t\t\tcolor=\"#00aeef\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Flex>\n\t\t\t\t\t<FlashProgressBar background={colors[type]} value={percentage} />\n\t\t\t\t</>\n\t\t\t);\n\t\t}\n\t\treturn (\n\t\t\t<StepButton\n\t\t\t\tprimary={!warning}\n\t\t\t\twarning={warning}\n\t\t\t\tonClick={this.props.callback}\n\t\t\t\tdisabled={this.props.disabled}\n\t\t\t\tstyle={{\n\t\t\t\t\tmarginTop: 30,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{i18next.t('flash.flashNow')}\n\t\t\t</StepButton>\n\t\t);\n\t}\n}\n"
  },
  {
    "path": "lib/gui/app/components/reduced-flashing-infos/reduced-flashing-infos.tsx",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as React from 'react';\nimport { Flex, Txt } from 'rendition';\n\nimport DriveSvg from '../../../assets/drive.svg';\nimport ImageSvg from '../../../assets/image.svg';\nimport { SVGIcon } from '../svg-icon/svg-icon';\nimport { middleEllipsis } from '../../utils/middle-ellipsis';\n\ninterface ReducedFlashingInfosProps {\n\timageLogo?: string;\n\timageName?: string;\n\timageSize: string;\n\tdriveTitle: string;\n\tdriveLabel: string;\n\tstyle?: React.CSSProperties;\n}\n\nexport class ReducedFlashingInfos extends React.Component<ReducedFlashingInfosProps> {\n\tconstructor(props: ReducedFlashingInfosProps) {\n\t\tsuper(props);\n\t\tthis.state = {};\n\t}\n\n\tpublic render() {\n\t\tconst { imageName = '' } = this.props;\n\t\treturn (\n\t\t\t<Flex\n\t\t\t\tflexDirection=\"column\"\n\t\t\t\tstyle={this.props.style ? this.props.style : undefined}\n\t\t\t>\n\t\t\t\t<Flex mb={16}>\n\t\t\t\t\t<SVGIcon\n\t\t\t\t\t\tdisabled\n\t\t\t\t\t\twidth=\"21px\"\n\t\t\t\t\t\theight=\"21px\"\n\t\t\t\t\t\tcontents={this.props.imageLogo}\n\t\t\t\t\t\tfallback={ImageSvg}\n\t\t\t\t\t\tstyle={{ marginRight: '9px' }}\n\t\t\t\t\t/>\n\t\t\t\t\t<Txt\n\t\t\t\t\t\tstyle={{ marginRight: '9px' }}\n\t\t\t\t\t\ttooltip={{ text: imageName, placement: 'right' }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{middleEllipsis(imageName, 16)}\n\t\t\t\t\t</Txt>\n\t\t\t\t\t<Txt color=\"#7e8085\">{this.props.imageSize}</Txt>\n\t\t\t\t</Flex>\n\n\t\t\t\t<Flex>\n\t\t\t\t\t<DriveSvg width=\"21px\" height=\"21px\" style={{ marginRight: '9px' }} />\n\t\t\t\t\t<Txt tooltip={{ text: this.props.driveLabel, placement: 'right' }}>\n\t\t\t\t\t\t{middleEllipsis(this.props.driveTitle, 16)}\n\t\t\t\t\t</Txt>\n\t\t\t\t</Flex>\n\t\t\t</Flex>\n\t\t);\n\t}\n}\n"
  },
  {
    "path": "lib/gui/app/components/safe-webview/safe-webview.tsx",
    "content": "/*\n * Copyright 2017 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as electron from 'electron';\nimport * as remote from '@electron/remote';\nimport * as _ from 'lodash';\nimport * as React from 'react';\n\nimport * as packageJSON from '../../../../../package.json';\nimport * as settings from '../../models/settings';\n\n/**\n * @summary Electron session identifier\n */\nconst ELECTRON_SESSION = 'persist:success-banner';\n\n/**\n * @summary Etcher version search-parameter key\n */\nconst ETCHER_VERSION_PARAM = 'etcher-version';\n\n/**\n * @summary API version search-parameter key\n */\nconst API_VERSION_PARAM = 'api-version';\n\n/**\n * @summary Opt-out analytics search-parameter key\n */\nconst OPT_OUT_ANALYTICS_PARAM = 'optOutAnalytics';\n\n/**\n * @summary Webview API version\n *\n * @description\n * Changing this number represents a departure from an older API and as such\n * should only be changed when truly necessary as it introduces breaking changes.\n * This version number is exposed to the banner such that it can determine what\n * features are safe to utilize.\n *\n * See `git blame -L n` where n is the line below for the history of version changes.\n */\nconst API_VERSION = '2';\n\ninterface SafeWebviewProps {\n\t// The website source URL\n\tsrc: string;\n\t// Webview lifecycle event\n\tonWebviewShow?: (isWebviewShowing: boolean) => void;\n\tstyle?: React.CSSProperties;\n}\n\ninterface SafeWebviewState {\n\tshouldShow: boolean;\n}\n\n/**\n * @summary Webviews that hide/show depending on the HTTP status returned\n */\nexport class SafeWebview extends React.PureComponent<\n\tSafeWebviewProps,\n\tSafeWebviewState\n> {\n\tprivate entryHref: string;\n\tprivate session: electron.Session;\n\tprivate webviewRef: React.RefObject<electron.WebviewTag>;\n\n\tconstructor(props: SafeWebviewProps) {\n\t\tsuper(props);\n\t\tthis.webviewRef = React.createRef();\n\t\tthis.state = {\n\t\t\tshouldShow: true,\n\t\t};\n\t\tconst url = new window.URL(this.props.src);\n\t\t// We set the version GET parameters here.\n\t\turl.searchParams.set(ETCHER_VERSION_PARAM, packageJSON.version);\n\t\turl.searchParams.set(API_VERSION_PARAM, API_VERSION);\n\t\turl.searchParams.set(\n\t\t\tOPT_OUT_ANALYTICS_PARAM,\n\t\t\t(!settings.getSync('errorReporting')).toString(),\n\t\t);\n\t\tthis.entryHref = url.href;\n\t\t// Events steal 'this'\n\t\tthis.handleDomReady = _.bind(this.handleDomReady, this);\n\t\tthis.didFailLoad = _.bind(this.didFailLoad, this);\n\t\tthis.didGetResponseDetails = _.bind(this.didGetResponseDetails, this);\n\t\t// Make a persistent electron session for the webview\n\t\tthis.session = remote.session.fromPartition(ELECTRON_SESSION, {\n\t\t\t// Disable the cache for the session such that new content shows up when refreshing\n\t\t\tcache: false,\n\t\t});\n\t}\n\n\tprivate static logWebViewMessage(event: electron.ConsoleMessageEvent) {\n\t\tconsole.log('Message from SafeWebview:', event.message);\n\t}\n\n\tpublic render() {\n\t\tconst {\n\t\t\tstyle = {\n\t\t\t\tflex: this.state.shouldShow ? undefined : '0 1',\n\t\t\t\twidth: this.state.shouldShow ? undefined : '0',\n\t\t\t\theight: this.state.shouldShow ? undefined : '0',\n\t\t\t},\n\t\t} = this.props;\n\t\treturn (\n\t\t\t<webview\n\t\t\t\tref={this.webviewRef}\n\t\t\t\tpartition={ELECTRON_SESSION}\n\t\t\t\tstyle={style}\n\t\t\t\t// @ts-ignore\n\t\t\t\tallowpopups=\"true\"\n\t\t\t/>\n\t\t);\n\t}\n\n\t// Add the Webview events\n\tpublic componentDidMount() {\n\t\t// Events React is unaware of have to be handled manually\n\t\tif (this.webviewRef.current !== null) {\n\t\t\tthis.webviewRef.current.addEventListener(\n\t\t\t\t'did-fail-load',\n\t\t\t\tthis.didFailLoad,\n\t\t\t);\n\t\t\tthis.webviewRef.current.addEventListener(\n\t\t\t\t'dom-ready',\n\t\t\t\tthis.handleDomReady,\n\t\t\t);\n\t\t\tthis.webviewRef.current.addEventListener(\n\t\t\t\t'console-message',\n\t\t\t\tSafeWebview.logWebViewMessage,\n\t\t\t);\n\t\t\tthis.session.webRequest.onCompleted(this.didGetResponseDetails);\n\t\t\t// It's important that this comes after the partition setting, otherwise it will\n\t\t\t// use another session and we can't change it without destroying the element again\n\t\t\tthis.webviewRef.current.src = this.entryHref;\n\t\t}\n\t}\n\n\t// Remove the Webview events\n\tpublic componentWillUnmount() {\n\t\t// Events that React is unaware of have to be handled manually\n\t\tif (this.webviewRef.current !== null) {\n\t\t\tthis.webviewRef.current.removeEventListener(\n\t\t\t\t'did-fail-load',\n\t\t\t\tthis.didFailLoad,\n\t\t\t);\n\t\t\tthis.webviewRef.current.removeEventListener(\n\t\t\t\t'dom-ready',\n\t\t\t\tthis.handleDomReady,\n\t\t\t);\n\t\t\tthis.webviewRef.current.removeEventListener(\n\t\t\t\t'console-message',\n\t\t\t\tSafeWebview.logWebViewMessage,\n\t\t\t);\n\t\t}\n\t\tthis.session.webRequest.onCompleted(null);\n\t}\n\n\thandleDomReady() {\n\t\tconst webview = this.webviewRef.current;\n\t\tif (webview == null) {\n\t\t\treturn;\n\t\t}\n\t\tconst id = webview.getWebContentsId();\n\t\telectron.ipcRenderer.send('webview-dom-ready', id);\n\t}\n\n\t// Set the element state to hidden\n\tpublic didFailLoad() {\n\t\tthis.setState({\n\t\t\tshouldShow: false,\n\t\t});\n\t\tif (this.props.onWebviewShow) {\n\t\t\tthis.props.onWebviewShow(false);\n\t\t}\n\t}\n\n\t// Set the element state depending on the HTTP response code\n\tpublic didGetResponseDetails(event: electron.OnCompletedListenerDetails) {\n\t\t// This seems to pick up all requests related to the webview,\n\t\t// only care about this event if it's a request for the main frame\n\t\tif (event.resourceType === 'mainFrame') {\n\t\t\tconst HTTP_OK = 200;\n\t\t\tthis.setState({\n\t\t\t\tshouldShow: event.statusCode === HTTP_OK,\n\t\t\t});\n\t\t\tif (this.props.onWebviewShow) {\n\t\t\t\tthis.props.onWebviewShow(event.statusCode === HTTP_OK);\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "lib/gui/app/components/settings/settings.tsx",
    "content": "/*\n * Copyright 2019 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport GithubSvg from '@fortawesome/fontawesome-free/svgs/brands/github.svg';\nimport * as _ from 'lodash';\nimport * as React from 'react';\nimport { Box, Checkbox, Flex, Txt } from 'rendition';\n\nimport { version, packageType } from '../../../../../package.json';\nimport * as settings from '../../models/settings';\nimport { open as openExternal } from '../../os/open-external/services/open-external';\nimport { Modal } from '../../styled-components';\nimport * as i18next from 'i18next';\nimport { etcherProInfo } from '../../utils/etcher-pro-specific';\n\ninterface Setting {\n\tname: string;\n\tlabel: string | JSX.Element;\n}\n\nasync function getSettingsList(): Promise<Setting[]> {\n\tconst list: Setting[] = [\n\t\t{\n\t\t\tname: 'errorReporting',\n\t\t\tlabel: i18next.t('settings.errorReporting'),\n\t\t},\n\t\t{\n\t\t\tname: 'autoBlockmapping',\n\t\t\tlabel: i18next.t('settings.trimExtPartitions'),\n\t\t},\n\t];\n\tif (['appimage', 'nsis', 'dmg'].includes(packageType)) {\n\t\tlist.push({\n\t\t\tname: 'updatesEnabled',\n\t\t\tlabel: i18next.t('settings.autoUpdate'),\n\t\t});\n\t}\n\treturn list;\n}\n\ninterface SettingsModalProps {\n\ttoggleModal: (value: boolean) => void;\n}\n\nconst EPInfo = etcherProInfo();\n\nconst InfoBox = (props: any) => (\n\t<Box fontSize={14}>\n\t\t<Txt>{props.label}</Txt>\n\t\t<Txt code copy={props.value}>\n\t\t\t{props.value}{' '}\n\t\t</Txt>\n\t</Box>\n);\n\nexport function SettingsModal({ toggleModal }: SettingsModalProps) {\n\tconst [settingsList, setCurrentSettingsList] = React.useState<Setting[]>([]);\n\tReact.useEffect(() => {\n\t\t(async () => {\n\t\t\tif (settingsList.length === 0) {\n\t\t\t\tsetCurrentSettingsList(await getSettingsList());\n\t\t\t}\n\t\t})();\n\t});\n\tconst [currentSettings, setCurrentSettings] = React.useState<\n\t\t_.Dictionary<boolean>\n\t>({});\n\tReact.useEffect(() => {\n\t\t(async () => {\n\t\t\tif (_.isEmpty(currentSettings)) {\n\t\t\t\tsetCurrentSettings(await settings.getAll());\n\t\t\t}\n\t\t})();\n\t});\n\n\tconst toggleSetting = async (setting: string) => {\n\t\tconst value = currentSettings[setting];\n\t\tawait settings.set(setting, !value);\n\t\tsetCurrentSettings({\n\t\t\t...currentSettings,\n\t\t\t[setting]: !value,\n\t\t});\n\t};\n\n\treturn (\n\t\t<Modal\n\t\t\ttitleElement={\n\t\t\t\t<Txt fontSize={24} mb={24}>\n\t\t\t\t\t{i18next.t('settings.settings')}\n\t\t\t\t</Txt>\n\t\t\t}\n\t\t\tdone={() => toggleModal(false)}\n\t\t>\n\t\t\t<Flex flexDirection=\"column\">\n\t\t\t\t{settingsList.map((setting: Setting, i: number) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Flex key={setting.name} mb={14}>\n\t\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\t\ttoggle\n\t\t\t\t\t\t\t\ttabIndex={6 + i}\n\t\t\t\t\t\t\t\tlabel={setting.label}\n\t\t\t\t\t\t\t\tchecked={currentSettings[setting.name]}\n\t\t\t\t\t\t\t\tonChange={() => toggleSetting(setting.name)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Flex>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\t{EPInfo !== undefined && (\n\t\t\t\t\t<Flex flexDirection=\"column\">\n\t\t\t\t\t\t<Txt fontSize={24}>{i18next.t('settings.systemInformation')}</Txt>\n\t\t\t\t\t\t{EPInfo.get_serial() === undefined ? (\n\t\t\t\t\t\t\t<InfoBox label=\"UUID\" value={EPInfo.uuid} />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<InfoBox label=\"Serial\" value={EPInfo.get_serial()} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Flex>\n\t\t\t\t)}\n\t\t\t\t<Flex\n\t\t\t\t\tmt={18}\n\t\t\t\t\talignItems=\"center\"\n\t\t\t\t\tcolor=\"#00aeef\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: 'fit-content',\n\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\tfontSize: 14,\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\topenExternal(\n\t\t\t\t\t\t\t'https://github.com/balena-io/etcher/blob/master/CHANGELOG.md',\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t<GithubSvg\n\t\t\t\t\t\theight=\"1em\"\n\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t\tstyle={{ marginRight: 8 }}\n\t\t\t\t\t/>\n\t\t\t\t\t<Txt style={{ borderBottom: '1px solid #00aeef' }}>{version}</Txt>\n\t\t\t\t</Flex>\n\t\t\t</Flex>\n\t\t</Modal>\n\t);\n}\n"
  },
  {
    "path": "lib/gui/app/components/source-selector/source-selector.tsx",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport CopySvg from '@fortawesome/fontawesome-free/svgs/solid/copy.svg';\nimport FileSvg from '@fortawesome/fontawesome-free/svgs/solid/file.svg';\nimport LinkSvg from '@fortawesome/fontawesome-free/svgs/solid/link.svg';\nimport ExclamationTriangleSvg from '@fortawesome/fontawesome-free/svgs/solid/triangle-exclamation.svg';\nimport ChevronDownSvg from '@fortawesome/fontawesome-free/svgs/solid/chevron-down.svg';\nimport ChevronRightSvg from '@fortawesome/fontawesome-free/svgs/solid/chevron-right.svg';\nimport type { IpcRendererEvent } from 'electron';\nimport { ipcRenderer } from 'electron';\nimport { uniqBy, isNil } from 'lodash';\nimport * as path from 'path';\nimport prettyBytes from 'pretty-bytes';\nimport * as React from 'react';\nimport { requestMetadata } from '../../app';\n\nimport type { ButtonProps } from 'rendition';\nimport {\n\tFlex,\n\tModal as SmallModal,\n\tTxt,\n\tCard as BaseCard,\n\tInput,\n\tSpinner,\n\tLink,\n} from 'rendition';\nimport styled from 'styled-components';\n\nimport * as errors from '../../../../shared/errors';\nimport * as messages from '../../../../shared/messages';\nimport * as supportedFormats from '../../../../shared/supported-formats';\nimport * as selectionState from '../../models/selection-state';\nimport { observe } from '../../models/store';\nimport * as analytics from '../../modules/analytics';\nimport * as exceptionReporter from '../../modules/exception-reporter';\nimport * as osDialog from '../../os/dialog';\n\nimport {\n\tChangeButton,\n\tDetailsText,\n\tModal,\n\tStepButton,\n\tStepNameButton,\n\tScrollableFlex,\n} from '../../styled-components';\nimport { colors } from '../../theme';\nimport { middleEllipsis } from '../../utils/middle-ellipsis';\nimport { SVGIcon } from '../svg-icon/svg-icon';\n\nimport ImageSvg from '../../../assets/image.svg';\nimport SrcSvg from '../../../assets/src.svg';\nimport { DriveSelector } from '../drive-selector/drive-selector';\nimport type { DrivelistDrive } from '../../../../shared/drive-constraints';\nimport { isJson } from '../../../../shared/utils';\nimport type {\n\tSourceMetadata,\n\tAuthentication,\n\tSource,\n} from '../../../../shared/typings/source-selector';\nimport * as i18next from 'i18next';\n\nconst recentUrlImagesKey = 'recentUrlImages';\n\nfunction normalizeRecentUrlImages(urls: any[]): URL[] {\n\tif (!Array.isArray(urls)) {\n\t\turls = [];\n\t}\n\turls = urls\n\t\t.map((url) => {\n\t\t\ttry {\n\t\t\t\treturn new URL(url);\n\t\t\t} catch (error: any) {\n\t\t\t\t// Invalid URL, skip\n\t\t\t}\n\t\t})\n\t\t.filter((url) => url !== undefined);\n\turls = uniqBy(urls, (url) => url.href);\n\treturn urls.slice(urls.length - 5);\n}\n\nfunction getRecentUrlImages(): URL[] {\n\tlet urls = [];\n\ttry {\n\t\turls = JSON.parse(localStorage.getItem(recentUrlImagesKey) || '[]');\n\t} catch {\n\t\t// noop\n\t}\n\treturn normalizeRecentUrlImages(urls);\n}\n\nfunction setRecentUrlImages(urls: URL[]) {\n\tconst normalized = normalizeRecentUrlImages(urls.map((url: URL) => url.href));\n\tlocalStorage.setItem(recentUrlImagesKey, JSON.stringify(normalized));\n}\n\nconst isURL = (imagePath: string) =>\n\timagePath.startsWith('https://') || imagePath.startsWith('http://');\n\nconst Card = styled(BaseCard)`\n\thr {\n\t\tmargin: 5px 0;\n\t}\n`;\n\n// TODO move these styles to rendition\nconst ModalText = styled.p`\n\ta {\n\t\tcolor: rgb(0, 174, 239);\n\n\t\t&:hover {\n\t\t\tcolor: rgb(0, 139, 191);\n\t\t}\n\t}\n`;\n\nfunction getState() {\n\tconst image = selectionState.getImage();\n\treturn {\n\t\thasImage: selectionState.hasImage(),\n\t\timageName: image?.name,\n\t\timageSize: image?.size,\n\t};\n}\n\nfunction isString(value: any): value is string {\n\treturn typeof value === 'string';\n}\n\nconst URLSelector = ({\n\tdone,\n\tcancel,\n}: {\n\tdone: (imageURL: string, auth?: Authentication) => void;\n\tcancel: () => void;\n}) => {\n\tconst [imageURL, setImageURL] = React.useState('');\n\tconst [recentImages, setRecentImages] = React.useState<URL[]>([]);\n\tconst [loading, setLoading] = React.useState(false);\n\tconst [showBasicAuth, setShowBasicAuth] = React.useState(false);\n\tconst [username, setUsername] = React.useState('');\n\tconst [password, setPassword] = React.useState('');\n\tReact.useEffect(() => {\n\t\tconst fetchRecentUrlImages = async () => {\n\t\t\tconst recentUrlImages: URL[] = await getRecentUrlImages();\n\t\t\tsetRecentImages(recentUrlImages);\n\t\t};\n\t\tfetchRecentUrlImages();\n\t}, []);\n\treturn (\n\t\t<Modal\n\t\t\tcancel={cancel}\n\t\t\tprimaryButtonProps={{\n\t\t\t\tdisabled: loading || !imageURL,\n\t\t\t}}\n\t\t\taction={loading ? <Spinner /> : i18next.t('ok')}\n\t\t\tdone={async () => {\n\t\t\t\tsetLoading(true);\n\t\t\t\tconst urlStrings = recentImages.map((url: URL) => url.href);\n\t\t\t\tconst normalizedRecentUrls = normalizeRecentUrlImages([\n\t\t\t\t\t...urlStrings,\n\t\t\t\t\timageURL,\n\t\t\t\t]);\n\t\t\t\tsetRecentUrlImages(normalizedRecentUrls);\n\t\t\t\tconst auth = username ? { username, password } : undefined;\n\t\t\t\tawait done(imageURL, auth);\n\t\t\t}}\n\t\t>\n\t\t\t<Flex flexDirection=\"column\">\n\t\t\t\t<Flex mb={15} style={{ width: '100%' }} flexDirection=\"column\">\n\t\t\t\t\t<Txt mb=\"10px\" fontSize=\"24px\">\n\t\t\t\t\t\t{i18next.t('source.useSourceURL')}\n\t\t\t\t\t</Txt>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tvalue={imageURL}\n\t\t\t\t\t\tplaceholder={i18next.t('source.enterValidURL')}\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tonChange={(evt: React.ChangeEvent<HTMLInputElement>) =>\n\t\t\t\t\t\t\tsetImageURL(evt.target.value)\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t\t<Link\n\t\t\t\t\t\tmt={15}\n\t\t\t\t\t\tmb={15}\n\t\t\t\t\t\tfontSize=\"14px\"\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tif (showBasicAuth) {\n\t\t\t\t\t\t\t\tsetUsername('');\n\t\t\t\t\t\t\t\tsetPassword('');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsetShowBasicAuth(!showBasicAuth);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Flex alignItems=\"center\">\n\t\t\t\t\t\t\t{showBasicAuth && (\n\t\t\t\t\t\t\t\t<ChevronDownSvg height=\"1em\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!showBasicAuth && (\n\t\t\t\t\t\t\t\t<ChevronRightSvg height=\"1em\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<Txt ml={8}>{i18next.t('source.auth')}</Txt>\n\t\t\t\t\t\t</Flex>\n\t\t\t\t\t</Link>\n\t\t\t\t\t{showBasicAuth && (\n\t\t\t\t\t\t<React.Fragment>\n\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\tmb={15}\n\t\t\t\t\t\t\t\tvalue={username}\n\t\t\t\t\t\t\t\tplaceholder={i18next.t('source.username')}\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\tonChange={(evt: React.ChangeEvent<HTMLInputElement>) =>\n\t\t\t\t\t\t\t\t\tsetUsername(evt.target.value)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\tvalue={password}\n\t\t\t\t\t\t\t\tplaceholder={i18next.t('source.password')}\n\t\t\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\t\t\tonChange={(evt: React.ChangeEvent<HTMLInputElement>) =>\n\t\t\t\t\t\t\t\t\tsetPassword(evt.target.value)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</React.Fragment>\n\t\t\t\t\t)}\n\t\t\t\t</Flex>\n\t\t\t\t{recentImages.length > 0 && (\n\t\t\t\t\t<Flex flexDirection=\"column\" height=\"78.6%\">\n\t\t\t\t\t\t<Txt fontSize={18}>Recent</Txt>\n\t\t\t\t\t\t<ScrollableFlex flexDirection=\"column\">\n\t\t\t\t\t\t\t<Card\n\t\t\t\t\t\t\t\tp=\"10px 15px\"\n\t\t\t\t\t\t\t\trows={recentImages\n\t\t\t\t\t\t\t\t\t.map((recent) => (\n\t\t\t\t\t\t\t\t\t\t<Txt\n\t\t\t\t\t\t\t\t\t\t\tkey={recent.href}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetImageURL(recent.href);\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\toverflowWrap: 'break-word',\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{recent.pathname.split('/').pop()} - {recent.href}\n\t\t\t\t\t\t\t\t\t\t</Txt>\n\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t\t.reverse()}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</ScrollableFlex>\n\t\t\t\t\t</Flex>\n\t\t\t\t)}\n\t\t\t</Flex>\n\t\t</Modal>\n\t);\n};\n\ninterface Flow {\n\ticon?: JSX.Element;\n\tonClick: (evt: React.MouseEvent) => void;\n\tlabel: string;\n}\n\nconst FlowSelector = styled(\n\t({ flow, ...props }: { flow: Flow } & ButtonProps) => (\n\t\t<StepButton\n\t\t\tplain={!props.primary}\n\t\t\tprimary={props.primary}\n\t\t\tonClick={(evt: React.MouseEvent<Element, MouseEvent>) =>\n\t\t\t\tflow.onClick(evt)\n\t\t\t}\n\t\t\ticon={flow.icon}\n\t\t\t{...props}\n\t\t>\n\t\t\t{flow.label}\n\t\t</StepButton>\n\t),\n)`\n\tborder-radius: 24px;\n\tcolor: rgba(255, 255, 255, 0.7);\n\n\t:enabled:focus,\n\t:enabled:focus svg {\n\t\tcolor: ${colors.primary.foreground} !important;\n\t}\n\n\t:enabled:hover {\n\t\tbackground-color: ${colors.primary.background};\n\t\tcolor: ${colors.primary.foreground};\n\t\tfont-weight: 600;\n\n\t\tsvg {\n\t\t\tcolor: ${colors.primary.foreground} !important;\n\t\t}\n\t}\n`;\n\ninterface SourceSelectorProps {\n\tflashing: boolean;\n\thideAnalyticsAlert: () => void;\n}\n\ninterface SourceSelectorState {\n\thasImage: boolean;\n\timageName?: string;\n\timageSize?: number;\n\twarning: { message: string; title: string | null } | null;\n\tshowImageDetails: boolean;\n\tshowURLSelector: boolean;\n\tshowDriveSelector: boolean;\n\tdefaultFlowActive: boolean;\n\timageSelectorOpen: boolean;\n\timageLoading: boolean;\n}\n\nexport class SourceSelector extends React.Component<\n\tSourceSelectorProps,\n\tSourceSelectorState\n> {\n\tprivate unsubscribe: (() => void) | undefined;\n\n\tconstructor(props: SourceSelectorProps) {\n\t\tsuper(props);\n\t\tthis.state = {\n\t\t\t...getState(),\n\t\t\twarning: null,\n\t\t\tshowImageDetails: false,\n\t\t\tshowURLSelector: false,\n\t\t\tshowDriveSelector: false,\n\t\t\tdefaultFlowActive: true,\n\t\t\timageSelectorOpen: false,\n\t\t\timageLoading: false,\n\t\t};\n\n\t\t// Bind `this` since it's used in an event's callback\n\t\tthis.onSelectImage = this.onSelectImage.bind(this);\n\t}\n\n\tpublic componentDidMount() {\n\t\tthis.unsubscribe = observe(() => {\n\t\t\tthis.setState(getState());\n\t\t});\n\t\tipcRenderer.on('select-image', this.onSelectImage);\n\t\tipcRenderer.send('source-selector-ready');\n\t}\n\n\tpublic componentWillUnmount() {\n\t\tthis.unsubscribe?.();\n\t\tipcRenderer.removeListener('select-image', this.onSelectImage);\n\t}\n\n\tpublic componentDidUpdate(\n\t\t_prevProps: Readonly<SourceSelectorProps>,\n\t\tprevState: Readonly<SourceSelectorState>,\n\t) {\n\t\tif (\n\t\t\t(!prevState.showDriveSelector && this.state.showDriveSelector) ||\n\t\t\t(!prevState.showURLSelector && this.state.showURLSelector) ||\n\t\t\t(!prevState.showImageDetails && this.state.showImageDetails) ||\n\t\t\t(!prevState.imageSelectorOpen && this.state.imageSelectorOpen)\n\t\t) {\n\t\t\tthis.props.hideAnalyticsAlert();\n\t\t}\n\t}\n\n\tprivate async onSelectImage(_event: IpcRendererEvent, imagePath: string) {\n\t\tthis.setState({ imageLoading: true });\n\t\tawait this.selectSource(\n\t\t\timagePath,\n\t\t\tisURL(this.normalizeImagePath(imagePath)) ? 'Http' : 'File',\n\t\t).promise;\n\t\tthis.setState({ imageLoading: false });\n\t}\n\n\tpublic normalizeImagePath(imgPath: string) {\n\t\tconst decodedPath = decodeURIComponent(imgPath);\n\t\tif (isJson(decodedPath)) {\n\t\t\treturn JSON.parse(decodedPath).url ?? decodedPath;\n\t\t}\n\t\treturn decodedPath;\n\t}\n\n\tprivate reselectSource() {\n\t\tselectionState.deselectImage();\n\t\tthis.props.hideAnalyticsAlert();\n\t}\n\n\tprivate selectSource(\n\t\tselected: string | DrivelistDrive,\n\t\tSourceType: Source,\n\t\tauth?: Authentication,\n\t): { promise: Promise<void>; cancel: () => void } {\n\t\treturn {\n\t\t\tcancel: () => {\n\t\t\t\t// noop\n\t\t\t},\n\t\t\tpromise: (async () => {\n\t\t\t\tconst sourcePath = isString(selected) ? selected : selected.device;\n\t\t\t\tlet metadata: SourceMetadata | undefined;\n\t\t\t\tif (isString(selected)) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tSourceType === 'Http' &&\n\t\t\t\t\t\t!isURL(this.normalizeImagePath(selected))\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.handleError(\n\t\t\t\t\t\t\ti18next.t('source.unsupportedProtocol'),\n\t\t\t\t\t\t\tselected,\n\t\t\t\t\t\t\tmessages.error.unsupportedProtocol(),\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (supportedFormats.looksLikeWindowsImage(selected)) {\n\t\t\t\t\t\tthis.setState({\n\t\t\t\t\t\t\twarning: {\n\t\t\t\t\t\t\t\tmessage: messages.warning.looksLikeWindowsImage(),\n\t\t\t\t\t\t\t\ttitle: i18next.t('source.windowsImage'),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// this will send an event down the ipcMain asking for metadata\n\t\t\t\t\t\t// we'll get the response through an event\n\n\t\t\t\t\t\t// FIXME: This is a poor man wait while loading to prevent a potential race condition without completely blocking the interface\n\t\t\t\t\t\t// This should be addressed when refactoring the GUI\n\t\t\t\t\t\tlet retriesLeft = 10;\n\t\t\t\t\t\twhile (requestMetadata === undefined && retriesLeft > 0) {\n\t\t\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 1050)); // api is trying to connect every 1000, this is offset to make sure we fall between retries\n\t\t\t\t\t\t\tretriesLeft--;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmetadata = await requestMetadata({ selected, SourceType, auth });\n\n\t\t\t\t\t\tif (!metadata?.hasMBR && this.state.warning === null) {\n\t\t\t\t\t\t\tthis.setState({\n\t\t\t\t\t\t\t\twarning: {\n\t\t\t\t\t\t\t\t\tmessage: messages.warning.missingPartitionTable(),\n\t\t\t\t\t\t\t\t\ttitle: i18next.t('source.partitionTable'),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (error: any) {\n\t\t\t\t\t\tthis.handleError(\n\t\t\t\t\t\t\ti18next.t('source.errorOpen'),\n\t\t\t\t\t\t\tsourcePath,\n\t\t\t\t\t\t\tmessages.error.openSource(sourcePath, error.message),\n\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (selected.partitionTableType === null) {\n\t\t\t\t\t\tthis.setState({\n\t\t\t\t\t\t\twarning: {\n\t\t\t\t\t\t\t\tmessage: messages.warning.driveMissingPartitionTable(),\n\t\t\t\t\t\t\t\ttitle: i18next.t('source.partitionTable'),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tmetadata = {\n\t\t\t\t\t\tpath: selected.device,\n\t\t\t\t\t\tdisplayName: selected.displayName,\n\t\t\t\t\t\tdescription: selected.displayName,\n\t\t\t\t\t\tsize: selected.size as SourceMetadata['size'],\n\t\t\t\t\t\tSourceType: 'BlockDevice',\n\t\t\t\t\t\tdrive: selected,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (metadata !== undefined) {\n\t\t\t\t\tmetadata.auth = auth;\n\t\t\t\t\tmetadata.SourceType = SourceType;\n\t\t\t\t\tselectionState.selectSource(metadata);\n\t\t\t\t}\n\t\t\t})(),\n\t\t};\n\t}\n\n\tprivate handleError(\n\t\ttitle: string,\n\t\tsourcePath: string,\n\t\tdescription: string,\n\t\terror?: Error,\n\t) {\n\t\tconst imageError = errors.createUserError({\n\t\t\ttitle,\n\t\t\tdescription,\n\t\t});\n\t\tosDialog.showError(imageError);\n\t\tif (error) {\n\t\t\tanalytics.logException(error);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate async openImageSelector() {\n\t\tthis.setState({ imageSelectorOpen: true });\n\n\t\ttry {\n\t\t\tconst imagePath = await osDialog.selectImage();\n\t\t\t// Avoid analytics and selection state changes\n\t\t\t// if no file was resolved from the dialog.\n\t\t\tif (!imagePath) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.selectSource(imagePath, 'File').promise;\n\t\t} catch (error: any) {\n\t\t\texceptionReporter.report(error);\n\t\t} finally {\n\t\t\tthis.setState({ imageSelectorOpen: false });\n\t\t}\n\t}\n\n\tprivate async onDrop(event: React.DragEvent<HTMLDivElement>) {\n\t\tconst file = event.dataTransfer.files.item(0);\n\t\tif (file != null) {\n\t\t\tawait this.selectSource(file.path, 'File').promise;\n\t\t}\n\t}\n\n\tprivate openURLSelector() {\n\t\tthis.setState({\n\t\t\tshowURLSelector: true,\n\t\t});\n\t}\n\n\tprivate openDriveSelector() {\n\t\tthis.setState({\n\t\t\tshowDriveSelector: true,\n\t\t});\n\t}\n\n\tprivate onDragOver(event: React.DragEvent<HTMLDivElement>) {\n\t\t// Needed to get onDrop events on div elements\n\t\tevent.preventDefault();\n\t}\n\n\tprivate onDragEnter(event: React.DragEvent<HTMLDivElement>) {\n\t\t// Needed to get onDrop events on div elements\n\t\tevent.preventDefault();\n\t}\n\n\tprivate showSelectedImageDetails() {\n\t\tthis.setState({\n\t\t\tshowImageDetails: true,\n\t\t});\n\t}\n\n\tprivate setDefaultFlowActive(defaultFlowActive: boolean) {\n\t\tthis.setState({ defaultFlowActive });\n\t}\n\n\tprivate closeModal() {\n\t\tthis.setState({\n\t\t\tshowDriveSelector: false,\n\t\t});\n\t}\n\n\t// TODO add a visual change when dragging a file over the selector\n\tpublic render() {\n\t\tconst { flashing } = this.props;\n\t\tconst {\n\t\t\tshowImageDetails,\n\t\t\tshowURLSelector,\n\t\t\tshowDriveSelector,\n\t\t\timageLoading,\n\t\t} = this.state;\n\t\tconst selectionImage = selectionState.getImage();\n\t\tlet image =\n\t\t\tselectionImage !== undefined ? selectionImage : ({} as SourceMetadata);\n\n\t\timage = image.drive ?? image;\n\n\t\tlet cancelURLSelection = () => {\n\t\t\t// noop\n\t\t};\n\t\timage.name = image.description || image.name;\n\t\tconst imagePath = image.path || image.displayName || '';\n\t\tconst imageBasename = path.basename(imagePath);\n\t\tconst imageName = image.name || '';\n\t\tconst imageSize = image.size;\n\t\tconst imageLogo = image.logo || '';\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<Flex\n\t\t\t\t\tflexDirection=\"column\"\n\t\t\t\t\talignItems=\"center\"\n\t\t\t\t\tonDrop={(evt: React.DragEvent<HTMLDivElement>) => this.onDrop(evt)}\n\t\t\t\t\tonDragEnter={(evt: React.DragEvent<HTMLDivElement>) =>\n\t\t\t\t\t\tthis.onDragEnter(evt)\n\t\t\t\t\t}\n\t\t\t\t\tonDragOver={(evt: React.DragEvent<HTMLDivElement>) =>\n\t\t\t\t\t\tthis.onDragOver(evt)\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t<SVGIcon\n\t\t\t\t\t\tcontents={imageLogo}\n\t\t\t\t\t\tfallback={ImageSvg}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tmarginBottom: 30,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\n\t\t\t\t\t{selectionImage !== undefined || imageLoading ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<StepNameButton\n\t\t\t\t\t\t\t\tplain\n\t\t\t\t\t\t\t\tonClick={() => this.showSelectedImageDetails()}\n\t\t\t\t\t\t\t\ttooltip={imageName || imageBasename}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Spinner show={imageLoading}>\n\t\t\t\t\t\t\t\t\t{middleEllipsis(imageName || imageBasename, 20)}\n\t\t\t\t\t\t\t\t</Spinner>\n\t\t\t\t\t\t\t</StepNameButton>\n\t\t\t\t\t\t\t{!flashing && !imageLoading && (\n\t\t\t\t\t\t\t\t<ChangeButton\n\t\t\t\t\t\t\t\t\tplain\n\t\t\t\t\t\t\t\t\tmb={14}\n\t\t\t\t\t\t\t\t\tonClick={() => this.reselectSource()}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{i18next.t('cancel')}\n\t\t\t\t\t\t\t\t</ChangeButton>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!isNil(imageSize) && !imageLoading && (\n\t\t\t\t\t\t\t\t<DetailsText>{prettyBytes(imageSize)}</DetailsText>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<FlowSelector\n\t\t\t\t\t\t\t\tdisabled={this.state.imageSelectorOpen}\n\t\t\t\t\t\t\t\tprimary={this.state.defaultFlowActive}\n\t\t\t\t\t\t\t\tkey=\"Flash from file\"\n\t\t\t\t\t\t\t\tflow={{\n\t\t\t\t\t\t\t\t\tonClick: () => this.openImageSelector(),\n\t\t\t\t\t\t\t\t\tlabel: i18next.t('source.fromFile'),\n\t\t\t\t\t\t\t\t\ticon: <FileSvg height=\"1em\" fill=\"currentColor\" />,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonMouseEnter={() => this.setDefaultFlowActive(false)}\n\t\t\t\t\t\t\t\tonMouseLeave={() => this.setDefaultFlowActive(true)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<FlowSelector\n\t\t\t\t\t\t\t\tkey=\"Flash from URL\"\n\t\t\t\t\t\t\t\tflow={{\n\t\t\t\t\t\t\t\t\tonClick: () => this.openURLSelector(),\n\t\t\t\t\t\t\t\t\tlabel: i18next.t('source.fromURL'),\n\t\t\t\t\t\t\t\t\ticon: <LinkSvg height=\"1em\" fill=\"currentColor\" />,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonMouseEnter={() => this.setDefaultFlowActive(false)}\n\t\t\t\t\t\t\t\tonMouseLeave={() => this.setDefaultFlowActive(true)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<FlowSelector\n\t\t\t\t\t\t\t\tkey=\"Clone drive\"\n\t\t\t\t\t\t\t\tflow={{\n\t\t\t\t\t\t\t\t\tonClick: () => this.openDriveSelector(),\n\t\t\t\t\t\t\t\t\tlabel: i18next.t('source.clone'),\n\t\t\t\t\t\t\t\t\ticon: <CopySvg height=\"1em\" fill=\"currentColor\" />,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonMouseEnter={() => this.setDefaultFlowActive(false)}\n\t\t\t\t\t\t\t\tonMouseLeave={() => this.setDefaultFlowActive(true)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</Flex>\n\n\t\t\t\t{this.state.warning != null && (\n\t\t\t\t\t<SmallModal\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tboxShadow: '0 3px 7px rgba(0, 0, 0, 0.3)',\n\t\t\t\t\t\t}}\n\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t<ExclamationTriangleSvg fill=\"#fca321\" height=\"1em\" />{' '}\n\t\t\t\t\t\t\t\t<span>{this.state.warning.title}</span>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t}\n\t\t\t\t\t\taction={i18next.t('continue')}\n\t\t\t\t\t\tcancel={() => {\n\t\t\t\t\t\t\tthis.setState({ warning: null });\n\t\t\t\t\t\t\tthis.reselectSource();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tdone={() => {\n\t\t\t\t\t\t\tthis.setState({ warning: null });\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tprimaryButtonProps={{ warning: true, primary: false }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ModalText\n\t\t\t\t\t\t\tdangerouslySetInnerHTML={{ __html: this.state.warning.message }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</SmallModal>\n\t\t\t\t)}\n\n\t\t\t\t{showImageDetails && (\n\t\t\t\t\t<SmallModal\n\t\t\t\t\t\ttitle={i18next.t('source.image')}\n\t\t\t\t\t\tdone={() => {\n\t\t\t\t\t\t\tthis.setState({ showImageDetails: false });\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Txt.p>\n\t\t\t\t\t\t\t<Txt.span bold>{i18next.t('source.name')}</Txt.span>\n\t\t\t\t\t\t\t<Txt.span>{imageName || imageBasename}</Txt.span>\n\t\t\t\t\t\t</Txt.p>\n\t\t\t\t\t\t<Txt.p>\n\t\t\t\t\t\t\t<Txt.span bold>{i18next.t('source.path')}</Txt.span>\n\t\t\t\t\t\t\t<Txt.span>{imagePath}</Txt.span>\n\t\t\t\t\t\t</Txt.p>\n\t\t\t\t\t</SmallModal>\n\t\t\t\t)}\n\n\t\t\t\t{showURLSelector && (\n\t\t\t\t\t<URLSelector\n\t\t\t\t\t\tcancel={() => {\n\t\t\t\t\t\t\tcancelURLSelection();\n\t\t\t\t\t\t\tthis.setState({\n\t\t\t\t\t\t\t\tshowURLSelector: false,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tdone={async (imageURL: string, auth?: Authentication) => {\n\t\t\t\t\t\t\t// Avoid analytics and selection state changes\n\t\t\t\t\t\t\t// if no file was resolved from the dialog.\n\t\t\t\t\t\t\tif (imageURL) {\n\t\t\t\t\t\t\t\tlet promise;\n\t\t\t\t\t\t\t\t({ promise, cancel: cancelURLSelection } = this.selectSource(\n\t\t\t\t\t\t\t\t\timageURL,\n\t\t\t\t\t\t\t\t\t'Http',\n\t\t\t\t\t\t\t\t\tauth,\n\t\t\t\t\t\t\t\t));\n\t\t\t\t\t\t\t\tawait promise;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.setState({\n\t\t\t\t\t\t\t\tshowURLSelector: false,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{showDriveSelector && (\n\t\t\t\t\t<DriveSelector\n\t\t\t\t\t\twrite={false}\n\t\t\t\t\t\tmultipleSelection={false}\n\t\t\t\t\t\ttitleLabel={i18next.t('source.selectSource')}\n\t\t\t\t\t\temptyListLabel={i18next.t('source.plugSource')}\n\t\t\t\t\t\temptyListIcon={<SrcSvg width=\"40px\" />}\n\t\t\t\t\t\tcancel={(originalList) => {\n\t\t\t\t\t\t\tif (originalList.length) {\n\t\t\t\t\t\t\t\tconst originalSource = originalList[0];\n\t\t\t\t\t\t\t\tif (selectionImage?.drive?.device !== originalSource.device) {\n\t\t\t\t\t\t\t\t\tthis.selectSource(originalSource, 'BlockDevice');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tselectionState.deselectImage();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.closeModal();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tdone={() => this.closeModal()}\n\t\t\t\t\t\tonSelect={(drive) => {\n\t\t\t\t\t\t\tif (drive) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tselectionState.getImage()?.drive?.device === drive?.device\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\treturn selectionState.deselectImage();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis.selectSource(drive, 'BlockDevice');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</>\n\t\t);\n\t}\n}\n"
  },
  {
    "path": "lib/gui/app/components/svg-icon/svg-icon.tsx",
    "content": "/*\n * Copyright 2018 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as React from 'react';\n\nconst domParser = new window.DOMParser();\n\nconst DEFAULT_SIZE = '40px';\n\n/**\n * @summary Try to parse SVG contents and return it data encoded\n *\n */\nfunction tryParseSVGContents(contents?: string): string | undefined {\n\tif (contents === undefined) {\n\t\treturn;\n\t}\n\tconst doc = domParser.parseFromString(contents, 'image/svg+xml');\n\tconst parserError = doc.querySelector('parsererror');\n\tconst svg = doc.querySelector('svg');\n\tif (!parserError && svg) {\n\t\treturn `data:image/svg+xml,${encodeURIComponent(svg.outerHTML)}`;\n\t}\n}\n\ninterface SVGIconProps {\n\t// Optional string representing the SVG contents to be tried\n\tcontents?: string;\n\t// Fallback SVG element to show if `contents` is invalid/undefined\n\tfallback: React.FunctionComponent<React.SVGProps<HTMLOrSVGElement>>;\n\t// SVG image width unit\n\twidth?: string;\n\t// SVG image height unit\n\theight?: string;\n\t// Should the element visually appear grayed out and disabled?\n\tdisabled?: boolean;\n\tstyle?: React.CSSProperties;\n}\n\n/**\n * @summary SVG element that takes file contents\n */\nexport class SVGIcon extends React.PureComponent<SVGIconProps> {\n\tpublic render() {\n\t\tconst svgData = tryParseSVGContents(this.props.contents);\n\t\tconst { width, height, style = {} } = this.props;\n\t\tstyle.width = width || DEFAULT_SIZE;\n\t\tstyle.height = height || DEFAULT_SIZE;\n\t\tif (svgData !== undefined) {\n\t\t\treturn (\n\t\t\t\t<img\n\t\t\t\t\tclassName={this.props.disabled ? 'disabled' : ''}\n\t\t\t\t\tstyle={style}\n\t\t\t\t\tsrc={svgData}\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\t\tconst { fallback: FallbackSVG } = this.props;\n\t\treturn <FallbackSVG style={style} />;\n\t}\n}\n"
  },
  {
    "path": "lib/gui/app/components/target-selector/target-selector-button.tsx",
    "content": "/*\n * Copyright 2019 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport ExclamationTriangleSvg from '@fortawesome/fontawesome-free/svgs/solid/triangle-exclamation.svg';\nimport * as React from 'react';\nimport type { FlexProps } from 'rendition';\nimport { Flex, Txt } from 'rendition';\n\nimport type { DriveStatus } from '../../../../shared/drive-constraints';\nimport { getDriveImageCompatibilityStatuses } from '../../../../shared/drive-constraints';\nimport { compatibility, warning } from '../../../../shared/messages';\nimport prettyBytes from 'pretty-bytes';\nimport { getImage, getSelectedDrives } from '../../models/selection-state';\nimport {\n\tChangeButton,\n\tDetailsText,\n\tStepButton,\n\tStepNameButton,\n} from '../../styled-components';\nimport { middleEllipsis } from '../../utils/middle-ellipsis';\nimport * as i18next from 'i18next';\n\ninterface TargetSelectorProps {\n\ttargets: any[];\n\tdisabled: boolean;\n\topenDriveSelector: () => void;\n\treselectDrive: () => void;\n\tflashing: boolean;\n\tshow: boolean;\n\ttooltip: string;\n}\n\nfunction getDriveWarning(status: DriveStatus) {\n\tswitch (status.message) {\n\t\tcase compatibility.containsImage():\n\t\t\treturn warning.sourceDrive();\n\t\tcase compatibility.largeDrive():\n\t\t\treturn warning.largeDriveSize();\n\t\tcase compatibility.system():\n\t\t\treturn warning.systemDrive();\n\t\tdefault:\n\t\t\treturn '';\n\t}\n}\n\nconst DriveCompatibilityWarning = ({\n\twarnings,\n\t...props\n}: {\n\twarnings: string[];\n} & FlexProps) => {\n\tconst systemDrive = warnings.find(\n\t\t(message) => message === warning.systemDrive(),\n\t);\n\treturn (\n\t\t<Flex tooltip={warnings.join(', ')} {...props}>\n\t\t\t<ExclamationTriangleSvg\n\t\t\t\tfill={systemDrive ? '#fca321' : '#8f9297'}\n\t\t\t\theight=\"1em\"\n\t\t\t/>\n\t\t</Flex>\n\t);\n};\n\nexport function TargetSelectorButton(props: TargetSelectorProps) {\n\tconst targets = getSelectedDrives();\n\n\tif (targets.length === 1) {\n\t\tconst target = targets[0];\n\t\tconst warnings = getDriveImageCompatibilityStatuses(\n\t\t\ttarget,\n\t\t\tgetImage(),\n\t\t\ttrue,\n\t\t).map(getDriveWarning);\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<StepNameButton plain tooltip={props.tooltip}>\n\t\t\t\t\t{warnings.length > 0 && (\n\t\t\t\t\t\t<DriveCompatibilityWarning warnings={warnings} mr={2} />\n\t\t\t\t\t)}\n\t\t\t\t\t{middleEllipsis(target.description, 20)}\n\t\t\t\t</StepNameButton>\n\t\t\t\t{!props.flashing && (\n\t\t\t\t\t<ChangeButton plain mb={14} onClick={props.reselectDrive}>\n\t\t\t\t\t\t{i18next.t('target.change')}\n\t\t\t\t\t</ChangeButton>\n\t\t\t\t)}\n\t\t\t\t{target.size != null && (\n\t\t\t\t\t<DetailsText>{prettyBytes(target.size)}</DetailsText>\n\t\t\t\t)}\n\t\t\t</>\n\t\t);\n\t}\n\n\tif (targets.length > 1) {\n\t\tconst targetsTemplate = [];\n\t\tfor (const target of targets) {\n\t\t\tconst warnings = getDriveImageCompatibilityStatuses(\n\t\t\t\ttarget,\n\t\t\t\tgetImage(),\n\t\t\t\ttrue,\n\t\t\t).map(getDriveWarning);\n\t\t\ttargetsTemplate.push(\n\t\t\t\t<DetailsText\n\t\t\t\t\tkey={target.device}\n\t\t\t\t\ttooltip={`${target.description} ${target.displayName} ${\n\t\t\t\t\t\ttarget.size != null ? prettyBytes(target.size) : ''\n\t\t\t\t\t}`}\n\t\t\t\t\tpx={21}\n\t\t\t\t>\n\t\t\t\t\t{warnings.length > 0 ? (\n\t\t\t\t\t\t<DriveCompatibilityWarning warnings={warnings} mr={2} />\n\t\t\t\t\t) : null}\n\t\t\t\t\t<Txt mr={2}>{middleEllipsis(target.description, 14)}</Txt>\n\t\t\t\t\t{target.size != null && <Txt>{prettyBytes(target.size)}</Txt>}\n\t\t\t\t</DetailsText>,\n\t\t\t);\n\t\t}\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<StepNameButton plain tooltip={props.tooltip}>\n\t\t\t\t\t{targets.length} {i18next.t('target.targets')}\n\t\t\t\t</StepNameButton>\n\t\t\t\t{!props.flashing && (\n\t\t\t\t\t<ChangeButton plain onClick={props.reselectDrive} mb={14}>\n\t\t\t\t\t\t{i18next.t('target.change')}\n\t\t\t\t\t</ChangeButton>\n\t\t\t\t)}\n\t\t\t\t{targetsTemplate}\n\t\t\t</>\n\t\t);\n\t}\n\n\treturn (\n\t\t<StepButton\n\t\t\tprimary\n\t\t\ttabIndex={targets.length > 0 ? -1 : 2}\n\t\t\tdisabled={props.disabled}\n\t\t\tonClick={props.openDriveSelector}\n\t\t>\n\t\t\t{i18next.t('target.selectTarget')}\n\t\t</StepButton>\n\t);\n}\n"
  },
  {
    "path": "lib/gui/app/components/target-selector/target-selector.tsx",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as React from 'react';\nimport { Flex, Txt } from 'rendition';\n\nimport type { DriveSelectorProps } from '../drive-selector/drive-selector';\nimport { DriveSelector } from '../drive-selector/drive-selector';\nimport {\n\tgetImage,\n\tgetSelectedDrives,\n\tdeselectDrive,\n\tselectDrive,\n\tdeselectAllDrives,\n} from '../../models/selection-state';\nimport { observe } from '../../models/store';\nimport { TargetSelectorButton } from './target-selector-button';\n\nimport TgtSvg from '../../../assets/tgt.svg';\nimport DriveSvg from '../../../assets/drive.svg';\nimport { warning } from '../../../../shared/messages';\nimport type { DrivelistDrive } from '../../../../shared/drive-constraints';\nimport * as i18next from 'i18next';\n\nexport const getDriveListLabel = () => {\n\treturn getSelectedDrives()\n\t\t.map((drive: any) => {\n\t\t\treturn `${drive.description} (${drive.displayName})`;\n\t\t})\n\t\t.join('\\n');\n};\n\nconst getDriveSelectionStateSlice = () => ({\n\tdriveListLabel: getDriveListLabel(),\n\ttargets: getSelectedDrives(),\n\timage: getImage(),\n});\n\nexport const TargetSelectorModal = (\n\tprops: Omit<\n\t\tDriveSelectorProps,\n\t\t'titleLabel' | 'emptyListLabel' | 'multipleSelection' | 'emptyListIcon'\n\t>,\n) => (\n\t<DriveSelector\n\t\tmultipleSelection={true}\n\t\ttitleLabel={i18next.t('target.selectTarget')}\n\t\temptyListLabel={i18next.t('target.plugTarget')}\n\t\temptyListIcon={<TgtSvg width=\"40px\" />}\n\t\tshowWarnings={true}\n\t\tselectedList={getSelectedDrives()}\n\t\tupdateSelectedList={getSelectedDrives}\n\t\t{...props}\n\t/>\n);\n\nexport const selectAllTargets = (modalTargets: DrivelistDrive[]) => {\n\tconst selectedDrivesFromState = getSelectedDrives();\n\tconst deselected = selectedDrivesFromState.filter(\n\t\t(drive) =>\n\t\t\t!modalTargets.find((modalTarget) => modalTarget.device === drive.device),\n\t);\n\t// deselect drives\n\tdeselected.forEach((drive) => {\n\t\tdeselectDrive(drive.device);\n\t});\n\t// select drives\n\tmodalTargets.forEach((drive) => {\n\t\tselectDrive(drive.device);\n\t});\n};\n\ninterface TargetSelectorProps {\n\tdisabled: boolean;\n\thasDrive: boolean;\n\tflashing: boolean;\n\thideAnalyticsAlert: () => void;\n}\n\nexport const TargetSelector = ({\n\tdisabled,\n\thasDrive,\n\tflashing,\n\thideAnalyticsAlert,\n}: TargetSelectorProps) => {\n\t// TODO: inject these from redux-connector\n\tconst [{ driveListLabel, targets }, setStateSlice] = React.useState(\n\t\tgetDriveSelectionStateSlice(),\n\t);\n\tconst [showTargetSelectorModal, setShowTargetSelectorModal] =\n\t\tReact.useState(false);\n\n\tReact.useEffect(() => {\n\t\treturn observe(() => {\n\t\t\tsetStateSlice(getDriveSelectionStateSlice());\n\t\t});\n\t}, []);\n\n\tconst hasSystemDrives = targets.some((target) => target.isSystem);\n\treturn (\n\t\t<Flex flexDirection=\"column\" alignItems=\"center\">\n\t\t\t<DriveSvg\n\t\t\t\tclassName={disabled ? 'disabled' : ''}\n\t\t\t\twidth=\"40px\"\n\t\t\t\tstyle={{\n\t\t\t\t\tmarginBottom: 30,\n\t\t\t\t}}\n\t\t\t/>\n\n\t\t\t<TargetSelectorButton\n\t\t\t\tdisabled={disabled}\n\t\t\t\tshow={!hasDrive}\n\t\t\t\ttooltip={driveListLabel}\n\t\t\t\topenDriveSelector={() => {\n\t\t\t\t\tsetShowTargetSelectorModal(true);\n\t\t\t\t\thideAnalyticsAlert();\n\t\t\t\t}}\n\t\t\t\treselectDrive={() => {\n\t\t\t\t\tsetShowTargetSelectorModal(true);\n\t\t\t\t}}\n\t\t\t\tflashing={flashing}\n\t\t\t\ttargets={targets}\n\t\t\t/>\n\n\t\t\t{hasSystemDrives ? (\n\t\t\t\t<Txt\n\t\t\t\t\tcolor=\"#fca321\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\tbottom: '25px',\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\tWarning: {warning.systemDrive()}\n\t\t\t\t</Txt>\n\t\t\t) : null}\n\n\t\t\t{showTargetSelectorModal && (\n\t\t\t\t<TargetSelectorModal\n\t\t\t\t\twrite={true}\n\t\t\t\t\tcancel={(originalList) => {\n\t\t\t\t\t\tif (originalList.length) {\n\t\t\t\t\t\t\tselectAllTargets(originalList);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdeselectAllDrives();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetShowTargetSelectorModal(false);\n\t\t\t\t\t}}\n\t\t\t\t\tdone={(modalTargets) => {\n\t\t\t\t\t\tif (modalTargets.length === 0) {\n\t\t\t\t\t\t\tdeselectAllDrives();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetShowTargetSelectorModal(false);\n\t\t\t\t\t}}\n\t\t\t\t\tonSelect={(drive) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tgetSelectedDrives().find(\n\t\t\t\t\t\t\t\t(selectedDrive) => selectedDrive.device === drive.device,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn deselectDrive(drive.device);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tselectDrive(drive.device);\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</Flex>\n\t);\n};\n"
  },
  {
    "path": "lib/gui/app/css/main.css",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n@font-face {\n\tfont-family: 'SourceSansPro';\n\tsrc: url('./fonts/SourceSansPro-Regular.ttf') format('truetype');\n\tfont-weight: 500;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: 'SourceSansPro';\n\tsrc: url('./fonts/SourceSansPro-SemiBold.ttf') format('truetype');\n\tfont-weight: 600;\n\tfont-style: normal;\n}\n\nhtml,\nbody {\n\tmargin: 0;\n\toverflow: hidden;\n\n\t/* Prevent white flash when running application */\n\tbackground-color: #4d5057;\n\n\t/* Prevent WebView bounce effect in OS X */\n\theight: 100%;\n\twidth: 100%;\n}\n\n/* Prevent text selection */\nbody {\n\t-webkit-user-select: none;\n\t-webkit-overflow-scrolling: touch;\n}\n\n/* Prevent blue outline */\na:focus,\ninput:focus,\nbutton:focus,\n[tabindex]:focus,\ninput[type='checkbox'] + div {\n\toutline: none !important;\n\tbox-shadow: none !important;\n}\n\n.disabled {\n\topacity: 0.4;\n}\n\n#rendition-tooltip-root > div {\n\tfont-family: 'SourceSansPro', sans-serif;\n}\n"
  },
  {
    "path": "lib/gui/app/i18n/README.md",
    "content": "# i18n\n\n## How it was done\n\nUsing the open-source lib [i18next](https://www.i18next.com/).\n\n## How to add your own language\n\n1. Go to `lib/gui/app/i18n` and add a file named `xx.ts` (use the codes mentioned\n   in [the link](https://www.science.co.il/language/Locale-codes.php), and we support styles as `fr`, `de`, `es-ES`\n   and `pt-BR`)\n   .\n2. Copy the content from an existing translation and start to translate.\n3. Once done, go to `lib/gui/app/i18n.ts` and add a line of `import xx_translation from './i18n/xx'` after the\n   already-added imports and add `xx: xx_translation` in the `resources` section of `i18next.init()` function.\n4. Now go to `lib/shared/catalina-sudo/` and copy the `sudo-askpass.osascript-en.js`, change it to\n   be `sudo-askpass.osascript-xx.js` and edit\n   the `'balenaEtcher needs privileged access in order to flash disks.\\n\\nType your password to allow this.'` line and\n   those `Ok`s and `Cancel`s to your own language.\n5. If, your language has several variations when they are used in several countries/regions, such as `zh-CN` and `zh-TW`\n   , or `pt-BR` and `pt-PT`, edit\n   the `langParser()` in the `lib/gui/app/i18n.ts` file to meet your need.\n6. Make a commit, and then a pull request on GitHub."
  },
  {
    "path": "lib/gui/app/i18n/en.ts",
    "content": "const translation = {\n\ttranslation: {\n\t\tcontinue: 'Continue',\n\t\tok: 'OK',\n\t\tcancel: 'Cancel',\n\t\tskip: 'Skip',\n\t\tsure: \"Yes, I'm sure\",\n\t\twarning: 'WARNING! ',\n\t\tattention: 'Attention',\n\t\tfailed: 'Failed',\n\t\tcompleted: 'Completed',\n\t\tyesContinue: 'Yes, continue',\n\t\treallyExit: 'Are you sure you want to close Etcher?',\n\t\tyesExit: 'Yes, quit',\n\t\tprogress: {\n\t\t\tstarting: 'Starting...',\n\t\t\tdecompressing: 'Decompressing...',\n\t\t\tflashing: 'Flashing...',\n\t\t\tfinishing: 'Finishing...',\n\t\t\tverifying: 'Validating...',\n\t\t\tfailing: 'Failed',\n\t\t},\n\t\tmessage: {\n\t\t\tsizeNotRecommended: 'Not recommended',\n\t\t\ttooSmall: 'Too small',\n\t\t\tlocked: 'Locked',\n\t\t\tsystem: 'System drive',\n\t\t\tcontainsImage: 'Source drive',\n\t\t\tlargeDrive: 'Large drive',\n\t\t\tsourceLarger: 'The selected source is {{byte}} larger than this drive.',\n\t\t\tflashSucceed_one: 'Successful target',\n\t\t\tflashSucceed_other: 'Successful targets',\n\t\t\tflashFail_one: 'Failed target',\n\t\t\tflashFail_other: 'Failed targets',\n\t\t\ttoDrive: 'to {{description}} ({{name}})',\n\t\t\ttoTarget_one: 'to {{num}} target',\n\t\t\ttoTarget_other: 'to {{num}} targets',\n\t\t\tandFailTarget_one: 'and failed to be flashed to {{num}} target',\n\t\t\tandFailTarget_other: 'and failed to be flashed to {{num}} targets',\n\t\t\tsucceedTo: '{{name}} was successfully flashed {{target}}',\n\t\t\texitWhileFlashing:\n\t\t\t\t'You are currently flashing a drive. Closing Etcher may leave your drive in an unusable state.',\n\t\t\tlooksLikeWindowsImage:\n\t\t\t\t'It looks like you are trying to burn a Windows image.\\n\\nUnlike other images, Windows images require special processing to be made bootable. We suggest you use a tool specially designed for this purpose, such as <a href=\"https://rufus.akeo.ie\">Rufus</a> (Windows), <a href=\"https://github.com/slacka/WoeUSB\">WoeUSB</a> (Linux), or Boot Camp Assistant (macOS).',\n\t\t\timage: 'image',\n\t\t\tdrive: 'drive',\n\t\t\tmissingPartitionTable:\n\t\t\t\t'It looks like this is not a bootable {{type}}.\\n\\nThe {{type}} does not appear to contain a partition table, and might not be recognized or bootable by your device.',\n\t\t\tlargeDriveSize:\n\t\t\t\t\"This is a large drive! Make sure it doesn't contain files that you want to keep.\",\n\t\t\tsystemDrive:\n\t\t\t\t'Selecting your system drive is dangerous and will erase your drive!',\n\t\t\tsourceDrive: 'Contains the image you chose to flash',\n\t\t\tnoSpace:\n\t\t\t\t'Not enough space on the drive. Please insert larger one and try again.',\n\t\t\tgenericFlashError:\n\t\t\t\t'Something went wrong. If it is a compressed image, please check that the archive is not corrupted.\\n{{error}}',\n\t\t\tvalidation:\n\t\t\t\t'The write has been completed successfully but Etcher detected potential corruption issues when reading the image back from the drive. \\n\\nPlease consider writing the image to a different drive.',\n\t\t\topenError:\n\t\t\t\t'Something went wrong while opening {{source}}.\\n\\nError: {{error}}',\n\t\t\tflashError: 'Something went wrong while writing {{image}} {{targets}}.',\n\t\t\tunplug:\n\t\t\t\t\"Looks like Etcher lost access to the drive. Did it get unplugged accidentally?\\n\\nSometimes this error is caused by faulty readers that don't provide stable access to the drive.\",\n\t\t\tcannotWrite:\n\t\t\t\t'Looks like Etcher is not able to write to this location of the drive. This error is usually caused by a faulty drive, reader, or port. \\n\\nPlease try again with another drive, reader, or port.',\n\t\t\tchildWriterDied:\n\t\t\t\t'The writer process ended unexpectedly. Please try again, and contact the Etcher team if the problem persists.',\n\t\t\tbadProtocol: 'Only http:// and https:// URLs are supported.',\n\t\t},\n\t\ttarget: {\n\t\t\tselectTarget: 'Select target',\n\t\t\tplugTarget: 'Plug a target drive',\n\t\t\ttargets: 'Targets',\n\t\t\tchange: 'Change',\n\t\t},\n\t\tsource: {\n\t\t\tuseSourceURL: 'Use Image URL',\n\t\t\tauth: 'Authentication',\n\t\t\tusername: 'Enter username',\n\t\t\tpassword: 'Enter password',\n\t\t\tunsupportedProtocol: 'Unsupported protocol',\n\t\t\twindowsImage: 'Possible Windows image detected',\n\t\t\tpartitionTable: 'Missing partition table',\n\t\t\terrorOpen: 'Error opening source',\n\t\t\tfromFile: 'Flash from file',\n\t\t\tfromURL: 'Flash from URL',\n\t\t\tclone: 'Clone drive',\n\t\t\timage: 'Image',\n\t\t\tname: 'Name: ',\n\t\t\tpath: 'Path: ',\n\t\t\tselectSource: 'Select source',\n\t\t\tplugSource: 'Plug a source drive',\n\t\t\tosImages: 'OS Images',\n\t\t\tallFiles: 'All',\n\t\t\tenterValidURL: 'Enter a valid URL',\n\t\t},\n\t\tdrives: {\n\t\t\tname: 'Name',\n\t\t\tsize: 'Size',\n\t\t\tlocation: 'Location',\n\t\t\tfind: '{{length}} found',\n\t\t\tselect: 'Select {{select}}',\n\t\t\tshowHidden: 'Show {{num}} hidden',\n\t\t\tsystemDriveDanger:\n\t\t\t\t'Selecting your system drive is dangerous and will erase your drive!',\n\t\t\topenInBrowser: '`Etcher will open {{link}} in your browser`',\n\t\t\tchangeTarget: 'Change target',\n\t\t\tlargeDriveWarning: 'You are about to erase an unusually large drive',\n\t\t\tlargeDriveWarningMsg:\n\t\t\t\t'Are you sure the selected drive is not a storage drive?',\n\t\t\tsystemDriveWarning: \"You are about to erase your computer's drives\",\n\t\t\tsystemDriveWarningMsg:\n\t\t\t\t'Are you sure you want to flash your system drive?',\n\t\t},\n\t\tflash: {\n\t\t\tanother: 'Flash another',\n\t\t\ttarget: 'Target',\n\t\t\tlocation: 'Location',\n\t\t\terror: 'Error',\n\t\t\tflash: 'Flash',\n\t\t\tflashNow: 'Flash!',\n\t\t\tskip: 'Validation has been skipped',\n\t\t\tmoreInfo: 'more info',\n\t\t\tspeedTip:\n\t\t\t\t'The speed is calculated by dividing the image size by the flashing time.\\nDisk images with ext partitions flash faster as we are able to skip unused parts.',\n\t\t\tspeed: 'Effective speed: {{speed}} MB/s',\n\t\t\tspeedShort: '{{speed}} MB/s',\n\t\t\teta: 'ETA: {{eta}}',\n\t\t\tfailedTarget: 'Failed targets',\n\t\t\tfailedRetry: 'Retry failed targets',\n\t\t\tflashFailed: 'Flash Failed.',\n\t\t\tflashCompleted: 'Flash Completed!',\n\t\t},\n\t\tsettings: {\n\t\t\terrorReporting: 'Anonymously report errors to balena.io',\n\t\t\tautoUpdate: 'Auto-updates enabled',\n\t\t\tsettings: 'Settings',\n\t\t\tsystemInformation: 'System Information',\n\t\t\ttrimExtPartitions:\n\t\t\t\t'Trim unallocated space on raw images (in ext-type partitions)',\n\t\t},\n\t\tmenu: {\n\t\t\tedit: 'Edit',\n\t\t\tview: 'View',\n\t\t\tdevTool: 'Toggle Developer Tools',\n\t\t\twindow: 'Window',\n\t\t\thelp: 'Help',\n\t\t\tpro: 'Etcher Pro',\n\t\t\twebsite: 'Etcher Website',\n\t\t\tissue: 'Report an issue',\n\t\t\tabout: 'About Etcher',\n\t\t\thide: 'Hide Etcher',\n\t\t\thideOthers: 'Hide Others',\n\t\t\tunhide: 'Unhide All',\n\t\t\tquit: 'Quit Etcher',\n\t\t},\n\t},\n};\n\nexport default translation;\n"
  },
  {
    "path": "lib/gui/app/i18n/zh-CN.ts",
    "content": "const translation = {\n\ttranslation: {\n\t\tok: '好',\n\t\tcancel: '取消',\n\t\tcontinue: '继续',\n\t\tskip: '跳过',\n\t\tsure: '我确定',\n\t\twarning: '请注意！',\n\t\tattention: '请注意',\n\t\tfailed: '失败',\n\t\tcompleted: '完毕',\n\t\tyesExit: '是的，可以退出',\n\t\treallyExit: '真的要现在退出 Etcher 吗？',\n\t\tyesContinue: '是的，继续',\n\t\tprogress: {\n\t\t\tstarting: '正在启动……',\n\t\t\tdecompressing: '正在解压……',\n\t\t\tflashing: '正在烧录……',\n\t\t\tfinishing: '正在结束……',\n\t\t\tverifying: '正在验证……',\n\t\t\tfailing: '失败……',\n\t\t},\n\t\tmessage: {\n\t\t\tsizeNotRecommended: '大小不推荐',\n\t\t\ttooSmall: '空间太小',\n\t\t\tlocked: '被锁定',\n\t\t\tsystem: '系统盘',\n\t\t\tcontainsImage: '存放源镜像',\n\t\t\tlargeDrive: '很大的磁盘',\n\t\t\tsourceLarger: '所选的镜像比目标盘大了 {{byte}} 比特。',\n\t\t\tflashSucceed_one: '烧录成功',\n\t\t\tflashSucceed_other: '烧录成功',\n\t\t\tflashFail_one: '烧录失败',\n\t\t\tflashFail_other: '烧录失败',\n\t\t\ttoDrive: '到 {{description}} ({{name}})',\n\t\t\ttoTarget_one: '到 {{num}} 个目标',\n\t\t\ttoTarget_other: '到 {{num}} 个目标',\n\t\t\tandFailTarget_one: '并烧录失败了 {{num}} 个目标',\n\t\t\tandFailTarget_other: '并烧录失败了 {{num}} 个目标',\n\t\t\tsucceedTo: '{{name}} 被成功烧录 {{target}}',\n\t\t\texitWhileFlashing:\n\t\t\t\t'您当前正在刷机。 关闭 Etcher 可能会导致您的磁盘无法使用。',\n\t\t\tlooksLikeWindowsImage:\n\t\t\t\t'看起来您正在尝试刻录 Windows 镜像。\\n\\n与其他镜像不同，Windows 镜像需要特殊处理才能使其可启动。 我们建议您使用专门为此目的设计的工具，例如 <a href=\"https://rufus.akeo.ie\">Rufus</a> (Windows)、<a href=\"https://github. com/slacka/WoeUSB\">WoeUSB</a> (Linux) 或 Boot Camp 助理 (macOS)。',\n\t\t\timage: '镜像',\n\t\t\tdrive: '磁盘',\n\t\t\tmissingPartitionTable:\n\t\t\t\t'看起来这不是一个可启动的{{type}}。\\n\\n这个{{type}}似乎不包含分区表，因此您的设备可能无法识别或无法正确启动。',\n\t\t\tlargeDriveSize: '这是个很大的磁盘！请检查并确认它不包含对您很重要的信息',\n\t\t\tsystemDrive: '选择系统盘很危险，因为这将会删除你的系统',\n\t\t\tsourceDrive: '源镜像位于这个分区中',\n\t\t\tnoSpace: '磁盘空间不足。 请插入另一个较大的磁盘并重试。',\n\t\t\tgenericFlashError:\n\t\t\t\t'出了点问题。如果源镜像曾被压缩过，请检查它是否已损坏。\\n{{error}}',\n\t\t\tvalidation:\n\t\t\t\t'写入已成功完成，但 Etcher 在从磁盘读取镜像时检测到潜在的损坏问题。 \\n\\n请考虑将镜像写入其他磁盘。',\n\t\t\topenError: '打开 {{source}} 时出错。\\n\\n错误信息： {{error}}',\n\t\t\tflashError: '烧录 {{image}} {{targets}} 失败。',\n\t\t\tunplug:\n\t\t\t\t'看起来 Etcher 失去了对磁盘的连接。 它是不是被意外拔掉了？\\n\\n有时这个错误是因为读卡器出了故障。',\n\t\t\tcannotWrite:\n\t\t\t\t'看起来 Etcher 无法写入磁盘的这个位置。 此错误通常是由故障的磁盘、读取器或端口引起的。 \\n\\n请使用其他磁盘、读卡器或端口重试。',\n\t\t\tchildWriterDied:\n\t\t\t\t'写入进程意外崩溃。请再试一次，如果问题仍然存在，请联系 Etcher 团队。',\n\t\t\tbadProtocol: '仅支持 http:// 和 https:// 开头的网址。',\n\t\t},\n\t\ttarget: {\n\t\t\tselectTarget: '选择目标磁盘',\n\t\t\tplugTarget: '请插入目标磁盘',\n\t\t\ttargets: '个目标',\n\t\t\tchange: '更改',\n\t\t},\n\t\tmenu: {\n\t\t\tedit: '编辑',\n\t\t\tview: '视图',\n\t\t\tdevTool: '打开开发者工具',\n\t\t\twindow: '窗口',\n\t\t\thelp: '帮助',\n\t\t\tpro: 'Etcher 专业版',\n\t\t\twebsite: 'Etcher 的官网',\n\t\t\tissue: '提交一个 issue',\n\t\t\tabout: '关于 Etcher',\n\t\t\thide: '隐藏 Etcher',\n\t\t\thideOthers: '隐藏其它窗口',\n\t\t\tunhide: '取消隐藏',\n\t\t\tquit: '退出 Etcher',\n\t\t},\n\t\tsource: {\n\t\t\tuseSourceURL: '使用镜像网络地址',\n\t\t\tauth: '验证',\n\t\t\tusername: '输入用户名',\n\t\t\tpassword: '输入密码',\n\t\t\tunsupportedProtocol: '不支持的协议',\n\t\t\twindowsImage: '这可能是 Windows 系统镜像',\n\t\t\tpartitionTable: '找不到分区表',\n\t\t\terrorOpen: '打开源镜像时出错',\n\t\t\tfromFile: '从文件烧录',\n\t\t\tfromURL: '从在线地址烧录',\n\t\t\tclone: '克隆磁盘',\n\t\t\timage: '镜像信息',\n\t\t\tname: '名称：',\n\t\t\tpath: '路径：',\n\t\t\tselectSource: '选择源',\n\t\t\tplugSource: '请插入源磁盘',\n\t\t\tosImages: '系统镜像格式',\n\t\t\tallFiles: '任何文件格式',\n\t\t\tenterValidURL: '请输入一个正确的地址',\n\t\t},\n\t\tdrives: {\n\t\t\tname: '名称',\n\t\t\tsize: '大小',\n\t\t\tlocation: '位置',\n\t\t\tfind: '找到 {{length}} 个',\n\t\t\tselect: '选定 {{select}}',\n\t\t\tshowHidden: '显示 {{num}} 个隐藏的磁盘',\n\t\t\tsystemDriveDanger: '选择系统盘很危险，因为这将会删除你的系统！',\n\t\t\topenInBrowser: 'Etcher 会在浏览器中打开 {{link}}',\n\t\t\tchangeTarget: '改变目标',\n\t\t\tlargeDriveWarning: '您即将擦除一个非常大的磁盘',\n\t\t\tlargeDriveWarningMsg: '您确定所选磁盘不是存储磁盘吗？',\n\t\t\tsystemDriveWarning: '您将要擦除系统盘',\n\t\t\tsystemDriveWarningMsg: '您确定要烧录到系统盘吗？',\n\t\t},\n\t\tflash: {\n\t\t\tanother: '烧录另一目标',\n\t\t\ttarget: '目标',\n\t\t\tlocation: '位置',\n\t\t\terror: '错误',\n\t\t\tflash: '烧录',\n\t\t\tflashNow: '现在烧录！',\n\t\t\tskip: '跳过了验证',\n\t\t\tmoreInfo: '更多信息',\n\t\t\tspeedTip:\n\t\t\t\t'通过将镜像大小除以烧录时间来计算速度。\\n由于我们能够跳过未使用的部分，因此具有EXT分区的磁盘镜像烧录速度更快。',\n\t\t\tspeed: '速度：{{speed}} MB/秒',\n\t\t\tspeedShort: '{{speed}} MB/秒',\n\t\t\teta: '预计还需要：{{eta}}',\n\t\t\tfailedTarget: '失败的烧录目标',\n\t\t\tfailedRetry: '重试烧录失败目标',\n\t\t\tflashFailed: '烧录失败。',\n\t\t\tflashCompleted: '烧录成功！',\n\t\t},\n\t\tsettings: {\n\t\t\terrorReporting: '匿名地向 balena.io 报告运行错误和使用统计',\n\t\t\tautoUpdate: '自动更新',\n\t\t\tsettings: '软件设置',\n\t\t\tsystemInformation: '系统信息',\n\t\t},\n\t},\n};\n\nexport default translation;\n"
  },
  {
    "path": "lib/gui/app/i18n/zh-TW.ts",
    "content": "const translation = {\n\ttranslation: {\n\t\tcontinue: '繼續',\n\t\tok: '好',\n\t\tcancel: '取消',\n\t\tskip: '跳過',\n\t\tsure: '我確定',\n\t\twarning: '請注意！',\n\t\tattention: '請注意',\n\t\tfailed: '失敗',\n\t\tcompleted: '完成',\n\t\tyesContinue: '是的，繼續',\n\t\treallyExit: '真的要現在結束 Etcher 嗎？',\n\t\tyesExit: '是的，可以結束',\n\t\tprogress: {\n\t\t\tstarting: '正在啟動……',\n\t\t\tdecompressing: '正在解壓縮……',\n\t\t\tflashing: '正在燒錄……',\n\t\t\tfinishing: '正在結束……',\n\t\t\tverifying: '正在驗證……',\n\t\t\tfailing: '失敗……',\n\t\t},\n\t\tmessage: {\n\t\t\tsizeNotRecommended: '大小不建議',\n\t\t\ttooSmall: '空間太小',\n\t\t\tlocked: '被鎖定',\n\t\t\tsystem: '系統',\n\t\t\tcontainsImage: '存放來源映像檔',\n\t\t\tlargeDrive: '很大的磁碟',\n\t\t\tsourceLarger: '所選的映像檔比目標磁碟大了 {{byte}} 位元組。',\n\t\t\tflashSucceed_one: '燒錄成功',\n\t\t\tflashSucceed_other: '燒錄成功',\n\t\t\tflashFail_one: '燒錄失敗',\n\t\t\tflashFail_other: '燒錄失敗',\n\t\t\ttoDrive: '到 {{description}} ({{name}})',\n\t\t\ttoTarget_one: '到 {{num}} 個目標',\n\t\t\ttoTarget_other: '到 {{num}} 個目標',\n\t\t\tandFailTarget_one: '並燒錄失敗了 {{num}} 個目標',\n\t\t\tandFailTarget_other: '並燒錄失敗了 {{num}} 個目標',\n\t\t\tsucceedTo: '{{name}} 被成功燒錄 {{target}}',\n\t\t\texitWhileFlashing:\n\t\t\t\t'您目前正在刷寫。關閉 Etcher 可能會導致您的磁碟無法使用。',\n\t\t\tlooksLikeWindowsImage:\n\t\t\t\t'看起來您正在嘗試燒錄 Windows 映像檔。\\n\\n與其他映像檔不同，Windows 映像檔需要特殊處理才能使其可啟動。我們建議您使用專門為此目的設計的工具，例如 <a href=\"https://rufus.akeo.ie\">Rufus</a> (Windows)、<a href=\"https://github. com/slacka/WoeUSB\">WoeUSB</a> (Linux) 或 Boot Camp 助理 (macOS)。',\n\t\t\timage: '映像檔',\n\t\t\tdrive: '磁碟',\n\t\t\tmissingPartitionTable:\n\t\t\t\t'看起來這不是一個可啟動的{{type}}。\\n\\n這個{{type}}似乎不包含分割表，因此您的設備可能無法識別或無法正確啟動。',\n\t\t\tlargeDriveSize:\n\t\t\t\t'這是個很大容量的磁碟！請檢查並確認它不包含對您來說存放很重要的資料',\n\t\t\tsystemDrive: '選擇系統分割區很危險，因為這將會刪除你的系統',\n\t\t\tsourceDrive: '來源映像檔位於這個分割區中',\n\t\t\tnoSpace: '磁碟空間不足。請插入另一個較大的磁碟並重試。',\n\t\t\tgenericFlashError:\n\t\t\t\t'出了點問題。如果來源映像檔曾被壓縮過，請檢查它是否已損壞。\\n{{error}}',\n\t\t\tvalidation:\n\t\t\t\t'寫入已成功完成，但 Etcher 在從磁碟讀取映像檔時檢測到潛在的損壞問題。\\n\\n請考慮將映像檔寫入其他磁碟。',\n\t\t\topenError: '打開 {{source}} 時發生錯誤。\\n\\n錯誤訊息： {{error}}',\n\t\t\tflashError: '燒錄 {{image}} {{targets}} 失敗。',\n\t\t\tunplug:\n\t\t\t\t'看起來 Etcher 失去了對磁碟的連接。是不是被意外拔掉了？\\n\\n有時這個錯誤是因為讀卡器出了故障。',\n\t\t\tcannotWrite:\n\t\t\t\t'看起來 Etcher 無法寫入磁碟的這個位置。此錯誤通常是由故障的磁碟、讀取器或連接埠引起的。\\n\\n請使用其他磁碟、讀卡器或連接埠重試。',\n\t\t\tchildWriterDied:\n\t\t\t\t'寫入處理程序意外崩潰。請再試一次，如果問題仍然存在，請聯絡 Etcher 團隊。',\n\t\t\tbadProtocol: '僅支援 http:// 和 https:// 開頭的網址。',\n\t\t},\n\t\ttarget: {\n\t\t\tselectTarget: '選擇目標磁碟',\n\t\t\tplugTarget: '請插入目標磁碟',\n\t\t\ttargets: '個目標',\n\t\t\tchange: '更改',\n\t\t},\n\t\tsource: {\n\t\t\tuseSourceURL: '使用映像檔網址',\n\t\t\tauth: '驗證',\n\t\t\tusername: '輸入使用者名稱',\n\t\t\tpassword: '輸入密碼',\n\t\t\tunsupportedProtocol: '不支持的通訊協定',\n\t\t\twindowsImage: '這可能是 Windows 系統映像檔',\n\t\t\tpartitionTable: '找不到分割表',\n\t\t\terrorOpen: '打開來源映像檔時出錯',\n\t\t\tfromFile: '從檔案燒錄',\n\t\t\tfromURL: '從網址燒錄',\n\t\t\tclone: '再製磁碟',\n\t\t\timage: '映像檔訊息',\n\t\t\tname: '名稱：',\n\t\t\tpath: '路徑：',\n\t\t\tselectSource: '選擇來源',\n\t\t\tplugSource: '請插入來源磁碟',\n\t\t\tosImages: '系統映像檔格式',\n\t\t\tallFiles: '任何檔案格式',\n\t\t\tenterValidURL: '請輸入正確的網址',\n\t\t},\n\t\tdrives: {\n\t\t\tname: '名稱',\n\t\t\tsize: '大小',\n\t\t\tlocation: '位置',\n\t\t\tfind: '找到 {{length}} 個',\n\t\t\tselect: '選取 {{select}}',\n\t\t\tshowHidden: '顯示 {{num}} 個隱藏的磁碟',\n\t\t\tsystemDriveDanger: '選擇系統分割區很危險，因為這將會刪除你的系統！',\n\t\t\topenInBrowser: 'Etcher 會在瀏覽器中打開 {{link}}',\n\t\t\tchangeTarget: '更改目標',\n\t\t\tlargeDriveWarning: '您即將格式化一個非常大的磁碟',\n\t\t\tlargeDriveWarningMsg: '您確定所選磁碟不是儲存資料的磁碟嗎？',\n\t\t\tsystemDriveWarning: '您將要格式化系統分割區',\n\t\t\tsystemDriveWarningMsg: '您確定要燒錄到系統分割區嗎？',\n\t\t},\n\t\tflash: {\n\t\t\tanother: '燒錄另一目標',\n\t\t\ttarget: '目標',\n\t\t\tlocation: '位置',\n\t\t\terror: '錯誤',\n\t\t\tflash: '燒錄',\n\t\t\tflashNow: '現在燒錄！',\n\t\t\tskip: '跳過了驗證',\n\t\t\tmoreInfo: '更多資訊',\n\t\t\tspeedTip:\n\t\t\t\t'透過將映像檔大小除以燒錄時間來計算速度。\\n由於我們能夠跳過未使用的部分，因此具有 ext 分割區的磁碟映像檔燒錄速度更快。',\n\t\t\tspeed: '速度：{{speed}} MB/秒',\n\t\t\tspeedShort: '{{speed}} MB/秒',\n\t\t\teta: '預計還需要：{{eta}}',\n\t\t\tfailedTarget: '目標燒錄失敗',\n\t\t\tfailedRetry: '重試燒錄失敗的目標',\n\t\t\tflashFailed: '燒錄失敗。',\n\t\t\tflashCompleted: '燒錄成功！',\n\t\t},\n\t\tsettings: {\n\t\t\terrorReporting: '匿名向 balena.io 回報程式錯誤和使用統計資料',\n\t\t\tautoUpdate: '自動更新',\n\t\t\tsettings: '軟體設定',\n\t\t\tsystemInformation: '系統資訊',\n\t\t\ttrimExtPartitions: '修改原始映像檔上未分配的空間（在 ext 類型分割區中）',\n\t\t},\n\t\tmenu: {\n\t\t\tedit: '編輯',\n\t\t\tview: '預覽',\n\t\t\tdevTool: '打開開發者工具',\n\t\t\twindow: '視窗',\n\t\t\thelp: '協助',\n\t\t\tpro: 'Etcher 專業版',\n\t\t\twebsite: 'Etcher 的官網',\n\t\t\tissue: '提交 issue',\n\t\t\tabout: '關於 Etcher',\n\t\t\thide: '隱藏 Etcher',\n\t\t\thideOthers: '隱藏其它視窗',\n\t\t\tunhide: '取消隱藏',\n\t\t\tquit: '結束 Etcher',\n\t\t},\n\t},\n};\n\nexport default translation;\n"
  },
  {
    "path": "lib/gui/app/i18n.ts",
    "content": "import * as i18next from 'i18next';\nimport { initReactI18next } from 'react-i18next';\nimport zh_CN_translation from './i18n/zh-CN';\nimport zh_TW_translation from './i18n/zh-TW';\nimport en_translation from './i18n/en';\n\nexport function langParser() {\n\tif (process.env.LANG !== undefined) {\n\t\t// Bypass mocha, where lang-detect don't works\n\t\treturn 'en';\n\t}\n\n\tconst lang = Intl.DateTimeFormat().resolvedOptions().locale;\n\n\tswitch (lang.substr(0, 2)) {\n\t\tcase 'zh':\n\t\t\tif (lang === 'zh-CN' || lang === 'zh-SG') {\n\t\t\t\treturn 'zh-CN';\n\t\t\t} // Simplified Chinese\n\t\t\telse {\n\t\t\t\treturn 'zh-TW';\n\t\t\t} // Traditional Chinese\n\t\tdefault:\n\t\t\treturn lang.substr(0, 2);\n\t}\n}\n\ni18next.use(initReactI18next).init({\n\tlng: langParser(),\n\tfallbackLng: 'en',\n\tnonExplicitSupportedLngs: true,\n\tinterpolation: {\n\t\tescapeValue: false,\n\t},\n\tresources: {\n\t\t'zh-CN': zh_CN_translation,\n\t\t'zh-TW': zh_TW_translation,\n\t\ten: en_translation,\n\t},\n});\n\nexport const supportedLocales = ['en', 'zh'];\n\nexport default i18next;\n"
  },
  {
    "path": "lib/gui/app/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>balenaEtcher</title>\n  </head>\n  <body>\n    <main id=\"main\"></main>\n  </body>\n</html>\n"
  },
  {
    "path": "lib/gui/app/models/available-drives.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { DrivelistDrive } from '../../../shared/drive-constraints';\nimport { Actions, store } from './store';\n\nexport function hasAvailableDrives() {\n\treturn getDrives().length > 0;\n}\n\nexport function setDrives(drives: any[]) {\n\tstore.dispatch({\n\t\ttype: Actions.SET_AVAILABLE_TARGETS,\n\t\tdata: drives,\n\t});\n}\n\nexport function getDrives(): DrivelistDrive[] {\n\treturn store.getState().toJS().availableDrives;\n}\n"
  },
  {
    "path": "lib/gui/app/models/flash-state.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as electron from 'electron';\nimport type * as sdk from 'etcher-sdk';\nimport * as _ from 'lodash';\nimport type { DrivelistDrive } from '../../../shared/drive-constraints';\nimport { bytesToMegabytes } from '../../../shared/units';\nimport { Actions, store } from './store';\n\n/**\n * @summary Reset flash state\n */\nexport function resetState() {\n\tstore.dispatch({\n\t\ttype: Actions.RESET_FLASH_STATE,\n\t\tdata: {},\n\t});\n}\n\n/**\n * @summary Check if currently flashing\n */\nexport function isFlashing(): boolean {\n\treturn store.getState().toJS().isFlashing;\n}\n\n/**\n * @summary Set the flashing flag\n *\n * @description\n * The flag is used to signify that we're going to\n * start a flash process.\n */\nexport function setFlashingFlag() {\n\t// see https://github.com/balenablocks/balena-electron-env/blob/4fce9c461f294d4a768db8f247eea6f75d7b08b0/README.md#remote-methods\n\telectron.ipcRenderer.send('disable-screensaver');\n\tstore.dispatch({\n\t\ttype: Actions.SET_FLASHING_FLAG,\n\t\tdata: {},\n\t});\n}\n\n/**\n * @summary Unset the flashing flag\n *\n * @description\n * The flag is used to signify that the write process ended.\n */\nexport function unsetFlashingFlag(results: {\n\tcancelled?: boolean;\n\tsourceChecksum?: string;\n\terrorCode?: string | number;\n}) {\n\tstore.dispatch({\n\t\ttype: Actions.UNSET_FLASHING_FLAG,\n\t\tdata: results,\n\t});\n\t// see https://github.com/balenablocks/balena-electron-env/blob/4fce9c461f294d4a768db8f247eea6f75d7b08b0/README.md#remote-methods\n\n\telectron.ipcRenderer.send('enable-screensaver');\n}\n\nexport function setDevicePaths(devicePaths: string[]) {\n\tstore.dispatch({\n\t\ttype: Actions.SET_DEVICE_PATHS,\n\t\tdata: devicePaths,\n\t});\n}\n\nexport function addFailedDeviceError({\n\tdevice,\n\terror,\n}: {\n\tdevice: DrivelistDrive;\n\terror: Error;\n}) {\n\tconst failedDeviceErrorsMap = new Map(\n\t\tstore.getState().toJS().failedDeviceErrors,\n\t);\n\tif (failedDeviceErrorsMap.has(device.device)) {\n\t\t// Only store the first error\n\t\treturn;\n\t}\n\tfailedDeviceErrorsMap.set(device.device, {\n\t\tdescription: device.description,\n\t\tdevice: device.device,\n\t\tdevicePath: device.devicePath,\n\t\t...error,\n\t});\n\tstore.dispatch({\n\t\ttype: Actions.SET_FAILED_DEVICE_ERRORS,\n\t\tdata: Array.from(failedDeviceErrorsMap),\n\t});\n}\n\n/**\n * @summary Set the flashing state\n */\nexport function setProgressState(\n\tstate: sdk.multiWrite.MultiDestinationProgress,\n) {\n\t// Preserve only one decimal place\n\tconst PRECISION = 1;\n\tconst data = {\n\t\t...state,\n\t\tpercentage:\n\t\t\tstate.percentage !== undefined && _.isFinite(state.percentage)\n\t\t\t\t? Math.floor(state.percentage)\n\t\t\t\t: undefined,\n\n\t\tspeed: _.attempt(() => {\n\t\t\tif (_.isFinite(state.speed)) {\n\t\t\t\treturn _.round(bytesToMegabytes(state.speed), PRECISION);\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}),\n\t};\n\n\tstore.dispatch({\n\t\ttype: Actions.SET_FLASH_STATE,\n\t\tdata,\n\t});\n}\n\nexport function getFlashResults() {\n\treturn store.getState().toJS().flashResults;\n}\n\nexport function getFlashState() {\n\treturn store.getState().get('flashState').toJS();\n}\n\nexport function wasLastFlashCancelled() {\n\treturn _.get(getFlashResults(), ['cancelled'], false);\n}\n\nexport function getLastFlashSourceChecksum(): string {\n\treturn getFlashResults().sourceChecksum;\n}\n\nexport function getLastFlashErrorCode() {\n\treturn getFlashResults().errorCode;\n}\n\nexport function getFlashUuid() {\n\treturn store.getState().toJS().flashUuid;\n}\n"
  },
  {
    "path": "lib/gui/app/models/leds.ts",
    "content": "/*\n * Copyright 2020 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as _ from 'lodash';\nimport type { AnimationFunction, Color } from 'sys-class-rgb-led';\nimport { Animator, RGBLed } from 'sys-class-rgb-led';\n\nimport type { DrivelistDrive } from '../../../shared/drive-constraints';\nimport { isSourceDrive } from '../../../shared/drive-constraints';\nimport { getDrives } from './available-drives';\nimport { getSelectedDrives } from './selection-state';\nimport * as settings from './settings';\nimport { observe, store } from './store';\n\nconst leds: Map<string, RGBLed> = new Map();\nconst animator = new Animator([], 10);\n\nfunction createAnimationFunction(\n\tintensityFunction: (t: number) => number,\n\tcolor: Color,\n): AnimationFunction {\n\treturn (t: number): Color => {\n\t\tconst intensity = intensityFunction(t);\n\t\treturn color.map((v: number) => v * intensity) as Color;\n\t};\n}\n\nfunction blink(t: number) {\n\treturn Math.floor(t) % 2;\n}\n\nfunction one() {\n\treturn 1;\n}\n\ntype LEDColors = {\n\tgreen: Color;\n\tpurple: Color;\n\tred: Color;\n\tblue: Color;\n\twhite: Color;\n\tblack: Color;\n};\n\ntype LEDAnimationFunctions = {\n\tblinkGreen: AnimationFunction;\n\tblinkPurple: AnimationFunction;\n\tstaticRed: AnimationFunction;\n\tstaticGreen: AnimationFunction;\n\tstaticBlue: AnimationFunction;\n\tstaticWhite: AnimationFunction;\n\tstaticBlack: AnimationFunction;\n};\n\nlet ledColors: LEDColors;\nlet ledAnimationFunctions: LEDAnimationFunctions;\n\ninterface LedsState {\n\tstep: 'main' | 'flashing' | 'verifying' | 'finish';\n\tsourceDrive: string | undefined;\n\tavailableDrives: string[];\n\tselectedDrives: string[];\n\tfailedDrives: string[];\n}\n\nfunction setLeds(animation: AnimationFunction, drivesPaths: Set<string>) {\n\tconst rgbLeds: RGBLed[] = [];\n\tfor (const path of drivesPaths) {\n\t\tconst led = leds.get(path);\n\t\tif (led) {\n\t\t\trgbLeds.push(led);\n\t\t}\n\t}\n\treturn { animation, rgbLeds };\n}\n\n// Source slot (1st slot): behaves as a target unless it is chosen as source\n//  No drive: black\n//  Drive plugged: blue - on\n//\n// Other slots (2 - 16):\n//\n// +----------------+---------------+-----------------------------+----------------------------+---------------------------------+\n// |                | main screen   | flashing                    | validating                 | results screen                  |\n// +----------------+---------------+-----------------------------+----------------------------+---------------------------------+\n// | no drive       | black         | black                       | black                      | black                           |\n// +----------------+---------------+-----------------------------+----------------------------+---------------------------------+\n// | drive plugged  | black         | black                       | black                      | black                           |\n// +----------------+---------------+-----------------------------+----------------------------+---------------------------------+\n// | drive selected | white         | blink purple, red if failed | blink green, red if failed | green if success, red if failed |\n// +----------------+---------------+-----------------------------+----------------------------+---------------------------------+\nexport function updateLeds({\n\tstep,\n\tsourceDrive,\n\tavailableDrives,\n\tselectedDrives,\n\tfailedDrives,\n}: LedsState) {\n\tconst unplugged = new Set(leds.keys());\n\tconst plugged = new Set(availableDrives);\n\tconst selectedOk = new Set(selectedDrives);\n\tconst selectedFailed = new Set(failedDrives);\n\n\t// Remove selected devices from plugged set\n\tfor (const d of selectedOk) {\n\t\tplugged.delete(d);\n\t\tunplugged.delete(d);\n\t}\n\n\t// Remove plugged devices from unplugged set\n\tfor (const d of plugged) {\n\t\tunplugged.delete(d);\n\t}\n\n\t// Remove failed devices from selected set\n\tfor (const d of selectedFailed) {\n\t\tselectedOk.delete(d);\n\t}\n\n\tconst mapping: Array<{\n\t\tanimation: AnimationFunction;\n\t\trgbLeds: RGBLed[];\n\t}> = [];\n\t// Handle source slot\n\tif (sourceDrive !== undefined) {\n\t\tif (plugged.has(sourceDrive)) {\n\t\t\tplugged.delete(sourceDrive);\n\t\t\tmapping.push(\n\t\t\t\tsetLeds(ledAnimationFunctions.staticBlue, new Set([sourceDrive])),\n\t\t\t);\n\t\t}\n\t}\n\tif (step === 'main') {\n\t\tmapping.push(\n\t\t\tsetLeds(\n\t\t\t\tledAnimationFunctions.staticBlack,\n\t\t\t\tnew Set([...unplugged, ...plugged]),\n\t\t\t),\n\t\t\tsetLeds(\n\t\t\t\tledAnimationFunctions.staticWhite,\n\t\t\t\tnew Set([...selectedOk, ...selectedFailed]),\n\t\t\t),\n\t\t);\n\t} else if (step === 'flashing') {\n\t\tmapping.push(\n\t\t\tsetLeds(\n\t\t\t\tledAnimationFunctions.staticBlack,\n\t\t\t\tnew Set([...unplugged, ...plugged]),\n\t\t\t),\n\t\t\tsetLeds(ledAnimationFunctions.blinkPurple, selectedOk),\n\t\t\tsetLeds(ledAnimationFunctions.staticRed, selectedFailed),\n\t\t);\n\t} else if (step === 'verifying') {\n\t\tmapping.push(\n\t\t\tsetLeds(\n\t\t\t\tledAnimationFunctions.staticBlack,\n\t\t\t\tnew Set([...unplugged, ...plugged]),\n\t\t\t),\n\t\t\tsetLeds(ledAnimationFunctions.blinkGreen, selectedOk),\n\t\t\tsetLeds(ledAnimationFunctions.staticRed, selectedFailed),\n\t\t);\n\t} else if (step === 'finish') {\n\t\tmapping.push(\n\t\t\tsetLeds(\n\t\t\t\tledAnimationFunctions.staticBlack,\n\t\t\t\tnew Set([...unplugged, ...plugged]),\n\t\t\t),\n\t\t\tsetLeds(ledAnimationFunctions.staticGreen, selectedOk),\n\t\t\tsetLeds(ledAnimationFunctions.staticRed, selectedFailed),\n\t\t);\n\t}\n\tanimator.mapping = mapping;\n}\n\nlet ledsState: LedsState | undefined;\n\nfunction stateObserver() {\n\tconst s = store.getState().toJS();\n\tlet step: 'main' | 'flashing' | 'verifying' | 'finish';\n\tif (s.isFlashing) {\n\t\tstep = s.flashState.type;\n\t} else {\n\t\tstep = s.lastAverageFlashingSpeed == null ? 'main' : 'finish';\n\t}\n\tconst availableDrives = getDrives().filter(\n\t\t(d: DrivelistDrive) => d.devicePath,\n\t);\n\tconst sourceDrivePath = availableDrives.filter((d: DrivelistDrive) =>\n\t\tisSourceDrive(d, s.selection.image),\n\t)[0]?.devicePath;\n\tconst availableDrivesPaths = availableDrives.map(\n\t\t(d: DrivelistDrive) => d.devicePath,\n\t);\n\tlet selectedDrivesPaths: string[];\n\tif (step === 'main') {\n\t\tselectedDrivesPaths = getSelectedDrives()\n\t\t\t.filter((drive) => drive.devicePath !== null)\n\t\t\t.map((drive) => drive.devicePath) as string[];\n\t} else {\n\t\tselectedDrivesPaths = s.devicePaths;\n\t}\n\tconst failedDevicePaths = s.failedDeviceErrors.map(\n\t\t([, { devicePath }]: [string, { devicePath: string }]) => devicePath,\n\t);\n\tconst newLedsState = {\n\t\tstep,\n\t\tsourceDrive: sourceDrivePath,\n\t\tavailableDrives: availableDrivesPaths,\n\t\tselectedDrives: selectedDrivesPaths,\n\t\tfailedDrives: failedDevicePaths,\n\t} as LedsState;\n\tif (!_.isEqual(newLedsState, ledsState)) {\n\t\tupdateLeds(newLedsState);\n\t\tledsState = newLedsState;\n\t}\n}\n\nexport async function init(): Promise<void> {\n\t// ledsMapping is something like:\n\t// {\n\t// \t'platform-xhci-hcd.0.auto-usb-0:1.1.1:1.0-scsi-0:0:0:0': [\n\t// \t\t'led1_r',\n\t// \t\t'led1_g',\n\t// \t\t'led1_b',\n\t// \t],\n\t// \t...\n\t// }\n\tconst ledsMapping: _.Dictionary<[string, string, string]> =\n\t\t(await settings.get('ledsMapping')) || {};\n\tif (!_.isEmpty(ledsMapping)) {\n\t\tfor (const [drivePath, ledsNames] of Object.entries(ledsMapping)) {\n\t\t\tleds.set('/dev/disk/by-path/' + drivePath, new RGBLed(ledsNames));\n\t\t}\n\t\tledColors = (await settings.get('ledColors')) || {};\n\t\tledAnimationFunctions = {\n\t\t\tblinkGreen: createAnimationFunction(blink, ledColors['green']),\n\t\t\tblinkPurple: createAnimationFunction(blink, ledColors['purple']),\n\t\t\tstaticRed: createAnimationFunction(one, ledColors['red']),\n\t\t\tstaticGreen: createAnimationFunction(one, ledColors['green']),\n\t\t\tstaticBlue: createAnimationFunction(one, ledColors['blue']),\n\t\t\tstaticWhite: createAnimationFunction(one, ledColors['white']),\n\t\t\tstaticBlack: createAnimationFunction(one, ledColors['black']),\n\t\t};\n\t\tobserve(_.debounce(stateObserver, 1000, { maxWait: 1000 }));\n\t}\n}\n"
  },
  {
    "path": "lib/gui/app/models/selection-state.ts",
    "content": "import type { DrivelistDrive } from '../../../shared/drive-constraints';\n/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SourceMetadata } from '../../../shared/typings/source-selector';\n\nimport * as availableDrives from './available-drives';\nimport { Actions, store } from './store';\n\n/**\n * @summary Select a drive by its device path\n */\nexport function selectDrive(driveDevice: string) {\n\tstore.dispatch({\n\t\ttype: Actions.SELECT_TARGET,\n\t\tdata: driveDevice,\n\t});\n}\n\n/**\n * @summary Toggle drive selection\n */\nexport function toggleDrive(driveDevice: string) {\n\tif (isDriveSelected(driveDevice)) {\n\t\tdeselectDrive(driveDevice);\n\t} else {\n\t\tselectDrive(driveDevice);\n\t}\n}\n\nexport function selectSource(source: SourceMetadata) {\n\tstore.dispatch({\n\t\ttype: Actions.SELECT_SOURCE,\n\t\tdata: source,\n\t});\n}\n\n/**\n * @summary Get all selected drives' devices\n */\nexport function getSelectedDevices(): string[] {\n\treturn store.getState().getIn(['selection', 'devices']).toJS();\n}\n\n/**\n * @summary Get all selected drive objects\n */\nexport function getSelectedDrives(): DrivelistDrive[] {\n\tconst selectedDevices = getSelectedDevices();\n\treturn availableDrives\n\t\t.getDrives()\n\t\t.filter((drive) => selectedDevices.includes(drive.device));\n}\n\n/**\n * @summary Get the selected image\n */\nexport function getImage(): SourceMetadata | undefined {\n\treturn store.getState().toJS().selection.image;\n}\n\n/**\n * @summary Check if there is a selected drive\n */\nexport function hasDrive(): boolean {\n\treturn Boolean(getSelectedDevices().length);\n}\n\n/**\n * @summary Check if there is a selected image\n */\nexport function hasImage(): boolean {\n\treturn getImage() !== undefined;\n}\n\n/**\n * @summary Remove drive from selection\n */\nexport function deselectDrive(driveDevice: string) {\n\tstore.dispatch({\n\t\ttype: Actions.DESELECT_TARGET,\n\t\tdata: driveDevice,\n\t});\n}\n\nexport function deselectImage() {\n\tstore.dispatch({\n\t\ttype: Actions.DESELECT_SOURCE,\n\t\tdata: {},\n\t});\n}\n\nexport function deselectAllDrives() {\n\tgetSelectedDevices().forEach(deselectDrive);\n}\n\n/**\n * @summary Clear selections\n */\nexport function clear() {\n\tdeselectImage();\n\tdeselectAllDrives();\n}\n\n/**\n * @summary Check whether a given device is selected.\n */\nexport function isDriveSelected(driveDevice: string) {\n\tif (!driveDevice) {\n\t\treturn false;\n\t}\n\n\tconst selectedDriveDevices = getSelectedDevices();\n\treturn selectedDriveDevices.includes(driveDevice);\n}\n"
  },
  {
    "path": "lib/gui/app/models/settings.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as _debug from 'debug';\nimport * as electron from 'electron';\nimport * as _ from 'lodash';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\n\nimport * as packageJSON from '../../../../package.json';\n\nconst debug = _debug('etcher:models:settings');\n\nconst JSON_INDENT = 2;\n\nexport const DEFAULT_WIDTH = 800;\nexport const DEFAULT_HEIGHT = 480;\n\n/**\n * @summary Userdata directory path\n * @description\n * Defaults to the following:\n * - `%APPDATA%/etcher` on Windows\n * - `$XDG_CONFIG_HOME/etcher` or `~/.config/etcher` on Linux\n * - `~/Library/Application Support/etcher` on macOS\n * See https://electronjs.org/docs/api/app#appgetpathname\n *\n * NOTE: We use the remote property when this module\n * is loaded in the Electron's renderer process\n */\nfunction getConfigPath() {\n\tconst app = electron.app || require('@electron/remote').app;\n\treturn join(app.getPath('userData'), 'config.json');\n}\n\nasync function readConfigFile(filename: string): Promise<_.Dictionary<any>> {\n\tlet contents = '{}';\n\ttry {\n\t\tcontents = await fs.readFile(filename, { encoding: 'utf8' });\n\t} catch (error: any) {\n\t\t// noop\n\t}\n\ttry {\n\t\treturn JSON.parse(contents);\n\t} catch (parseError) {\n\t\tconsole.error(parseError);\n\t\treturn {};\n\t}\n}\n\n// exported for tests\nexport async function readAll() {\n\treturn await readConfigFile(getConfigPath());\n}\n\n// exported for tests\nexport async function writeConfigFile(\n\tfilename: string,\n\tdata: _.Dictionary<any>,\n): Promise<void> {\n\tawait fs.writeFile(filename, JSON.stringify(data, null, JSON_INDENT));\n}\n\nconst DEFAULT_SETTINGS: _.Dictionary<any> = {\n\terrorReporting: true,\n\tupdatesEnabled: ['appimage', 'nsis', 'dmg'].includes(packageJSON.packageType),\n\tdesktopNotifications: true,\n\tautoBlockmapping: true,\n\tdecompressFirst: true,\n};\n\nconst settings = _.cloneDeep(DEFAULT_SETTINGS);\n\nasync function load(): Promise<void> {\n\tdebug('load');\n\tconst loadedSettings = await readAll();\n\t_.assign(settings, loadedSettings);\n}\n\nconst loaded = load();\n\nexport async function set(\n\tkey: string,\n\tvalue: any,\n\twriteConfigFileFn = writeConfigFile,\n): Promise<void> {\n\tdebug('set', key, value);\n\tawait loaded;\n\tconst previousValue = settings[key];\n\tsettings[key] = value;\n\ttry {\n\t\tawait writeConfigFileFn(getConfigPath(), settings);\n\t} catch (error: any) {\n\t\t// Revert to previous value if persisting settings failed\n\t\tsettings[key] = previousValue;\n\t\tthrow error;\n\t}\n}\n\nexport async function get(key: string): Promise<any> {\n\tawait loaded;\n\treturn getSync(key);\n}\n\nexport function getSync(key: string): any {\n\treturn _.cloneDeep(settings[key]);\n}\n\nexport async function getAll() {\n\tdebug('getAll');\n\tawait loaded;\n\treturn _.cloneDeep(settings);\n}\n"
  },
  {
    "path": "lib/gui/app/models/store.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as Immutable from 'immutable';\nimport * as _ from 'lodash';\nimport { basename } from 'path';\nimport * as redux from 'redux';\nimport { v4 as uuidV4 } from 'uuid';\n\nimport * as constraints from '../../../shared/drive-constraints';\nimport * as errors from '../../../shared/errors';\nimport * as utils from '../../../shared/utils';\nimport * as settings from './settings';\n\n/**\n * @summary Verify and throw if any state fields are nil\n */\nfunction verifyNoNilFields(\n\tobject: _.Dictionary<any>,\n\tfields: string[],\n\tname: string,\n) {\n\tconst nilFields = _.filter(fields, (field) => {\n\t\treturn _.isNil(_.get(object, field));\n\t});\n\tif (nilFields.length) {\n\t\tthrow new Error(`Missing ${name} fields: ${nilFields.join(', ')}`);\n\t}\n}\n\n/**\n * @summary FLASH_STATE fields that can't be nil\n */\nconst flashStateNoNilFields = ['speed'];\n\n/**\n * @summary SELECT_IMAGE fields that can't be nil\n */\nconst selectImageNoNilFields = ['path', 'extension'];\n\n/**\n * @summary Application default state\n */\nexport const DEFAULT_STATE = Immutable.fromJS({\n\tapplicationSessionUuid: '',\n\tflashingWorkflowUuid: '',\n\tavailableDrives: [],\n\tselection: {\n\t\tdevices: Immutable.OrderedSet(),\n\t},\n\tisFlashing: false,\n\tdevicePaths: [],\n\tfailedDeviceErrors: [],\n\tflashResults: {},\n\tflashState: {\n\t\tactive: 0,\n\t\tfailed: 0,\n\t\tpercentage: 0,\n\t\tspeed: null,\n\t\taverageSpeed: null,\n\t},\n\tlastAverageFlashingSpeed: null,\n});\n\n/**\n * @summary Application supported action messages\n */\nexport enum Actions {\n\tSET_DEVICE_PATHS,\n\tSET_FAILED_DEVICE_ERRORS,\n\tSET_AVAILABLE_TARGETS,\n\tSET_FLASH_STATE,\n\tRESET_FLASH_STATE,\n\tSET_FLASHING_FLAG,\n\tUNSET_FLASHING_FLAG,\n\tSELECT_TARGET,\n\tSELECT_SOURCE,\n\tDESELECT_TARGET,\n\tDESELECT_SOURCE,\n\tSET_APPLICATION_SESSION_UUID,\n\tSET_FLASHING_WORKFLOW_UUID,\n}\n\ninterface Action {\n\ttype: Actions;\n\tdata: any;\n}\n\n/**\n * @summary Get available drives from the state\n *\n * @param {Object} state - state object\n * @returns {Object} new state\n */\nfunction getAvailableDrives(state: typeof DEFAULT_STATE) {\n\treturn state.get('availableDrives').toJS();\n}\n\n/**\n * @summary The redux store reducer\n */\nfunction storeReducer(\n\tstate = DEFAULT_STATE,\n\taction: Action,\n): typeof DEFAULT_STATE {\n\tswitch (action.type) {\n\t\tcase Actions.SET_AVAILABLE_TARGETS: {\n\t\t\t// Type: action.data : Array<DriveObject>\n\n\t\t\tif (!action.data) {\n\t\t\t\tthrow errors.createError({\n\t\t\t\t\ttitle: 'Missing drives',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet drives = action.data;\n\n\t\t\tif (!_.isArray(drives) || !_.every(drives, _.isObject)) {\n\t\t\t\tthrow errors.createError({\n\t\t\t\t\ttitle: `Invalid drives: ${drives}`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Drives order is a list of devicePaths\n\t\t\tconst drivesOrder = settings.getSync('drivesOrder') ?? [];\n\n\t\t\tdrives = _.sortBy(drives, [\n\t\t\t\t// System drives last\n\t\t\t\t(d) => !!d.isSystem,\n\t\t\t\t// Devices with no devicePath first (usbboot)\n\t\t\t\t(d) => !!d.devicePath,\n\t\t\t\t// Sort as defined in the drivesOrder setting if there is one (only for Linux with udev)\n\t\t\t\t(d) => drivesOrder.indexOf(basename(d.devicePath || '')),\n\t\t\t\t// Then sort by devicePath (only available on Linux with udev) or device\n\t\t\t\t(d) => d.devicePath || d.device,\n\t\t\t]);\n\n\t\t\tconst newState = state.set('availableDrives', Immutable.fromJS(drives));\n\t\t\tconst selectedDevices = newState.getIn(['selection', 'devices']).toJS();\n\n\t\t\t// Remove selected drives that are stale, i.e. missing from availableDrives\n\t\t\tconst nonStaleNewState = _.reduce(\n\t\t\t\tselectedDevices,\n\t\t\t\t(accState, device) => {\n\t\t\t\t\t// Check whether the drive still exists in availableDrives\n\t\t\t\t\tif (\n\t\t\t\t\t\tdevice &&\n\t\t\t\t\t\t!_.find(drives, {\n\t\t\t\t\t\t\tdevice,\n\t\t\t\t\t\t})\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Deselect this drive gone from availableDrives\n\t\t\t\t\t\treturn storeReducer(accState, {\n\t\t\t\t\t\t\ttype: Actions.DESELECT_TARGET,\n\t\t\t\t\t\t\tdata: device,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\treturn accState;\n\t\t\t\t},\n\t\t\t\tnewState,\n\t\t\t);\n\n\t\t\tconst shouldAutoselectAll = Boolean(\n\t\t\t\tsettings.getSync('autoSelectAllDrives'),\n\t\t\t);\n\t\t\tconst AUTOSELECT_DRIVE_COUNT = 1;\n\t\t\tconst nonStaleSelectedDevices = nonStaleNewState\n\t\t\t\t.getIn(['selection', 'devices'])\n\t\t\t\t.toJS();\n\t\t\tconst hasSelectedDevices =\n\t\t\t\tnonStaleSelectedDevices.length >= AUTOSELECT_DRIVE_COUNT;\n\t\t\tconst shouldAutoselectOne =\n\t\t\t\tdrives.length === AUTOSELECT_DRIVE_COUNT && !hasSelectedDevices;\n\n\t\t\tif (shouldAutoselectOne || shouldAutoselectAll) {\n\t\t\t\t// Even if there's no image selected, we need to call several\n\t\t\t\t// drive/image related checks, and `{}` works fine with them\n\t\t\t\tconst image = state\n\t\t\t\t\t.getIn(['selection', 'image'], Immutable.fromJS({}))\n\t\t\t\t\t.toJS();\n\n\t\t\t\treturn _.reduce(\n\t\t\t\t\tdrives,\n\t\t\t\t\t(accState, drive) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tconstraints.isDriveValid(drive, image) &&\n\t\t\t\t\t\t\t!drive.isReadOnly &&\n\t\t\t\t\t\t\tconstraints.isDriveSizeRecommended(drive, image) &&\n\t\t\t\t\t\t\t// We don't want to auto-select large drives except if autoSelectAllDrives is true\n\t\t\t\t\t\t\t(!constraints.isDriveSizeLarge(drive) || shouldAutoselectAll) &&\n\t\t\t\t\t\t\t// We don't want to auto-select system drives\n\t\t\t\t\t\t\t!constraints.isSystemDrive(drive)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// Auto-select this drive\n\t\t\t\t\t\t\treturn storeReducer(accState, {\n\t\t\t\t\t\t\t\ttype: Actions.SELECT_TARGET,\n\t\t\t\t\t\t\t\tdata: drive.device,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Deselect this drive in case it still is selected\n\t\t\t\t\t\treturn storeReducer(accState, {\n\t\t\t\t\t\t\ttype: Actions.DESELECT_TARGET,\n\t\t\t\t\t\t\tdata: drive.device,\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tnonStaleNewState,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn nonStaleNewState;\n\t\t}\n\n\t\tcase Actions.SET_FLASH_STATE: {\n\t\t\t// Type: action.data : FlashStateObject\n\n\t\t\tif (!state.get('isFlashing')) {\n\t\t\t\tthrow errors.createError({\n\t\t\t\t\ttitle: \"Can't set the flashing state when not flashing\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tverifyNoNilFields(action.data, flashStateNoNilFields, 'flash');\n\n\t\t\tif (!_.every(_.pick(action.data, ['active', 'failed']), _.isFinite)) {\n\t\t\t\tthrow errors.createError({\n\t\t\t\t\ttitle: 'State quantity field(s) not finite number',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t!_.isUndefined(action.data.percentage) &&\n\t\t\t\t!utils.isValidPercentage(action.data.percentage)\n\t\t\t) {\n\t\t\t\tthrow errors.createError({\n\t\t\t\t\ttitle: `Invalid state percentage: ${action.data.percentage}`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (!_.isUndefined(action.data.eta) && !_.isNumber(action.data.eta)) {\n\t\t\t\tthrow errors.createError({\n\t\t\t\t\ttitle: `Invalid state eta: ${action.data.eta}`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet ret = state.set('flashState', Immutable.fromJS(action.data));\n\t\t\tif (action.data.type === 'flashing') {\n\t\t\t\tret = ret.set('lastAverageFlashingSpeed', action.data.averageSpeed);\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\n\t\tcase Actions.RESET_FLASH_STATE: {\n\t\t\treturn state\n\t\t\t\t.set('isFlashing', false)\n\t\t\t\t.set('flashState', DEFAULT_STATE.get('flashState'))\n\t\t\t\t.set('flashResults', DEFAULT_STATE.get('flashResults'))\n\t\t\t\t.set('devicePaths', DEFAULT_STATE.get('devicePaths'))\n\t\t\t\t.set('failedDeviceErrors', DEFAULT_STATE.get('failedDeviceErrors'))\n\t\t\t\t.set(\n\t\t\t\t\t'lastAverageFlashingSpeed',\n\t\t\t\t\tDEFAULT_STATE.get('lastAverageFlashingSpeed'),\n\t\t\t\t)\n\t\t\t\t.delete('flashUuid');\n\t\t}\n\n\t\tcase Actions.SET_FLASHING_FLAG: {\n\t\t\treturn state\n\t\t\t\t.set('isFlashing', true)\n\t\t\t\t.set('flashUuid', uuidV4())\n\t\t\t\t.set('flashResults', DEFAULT_STATE.get('flashResults'));\n\t\t}\n\n\t\tcase Actions.UNSET_FLASHING_FLAG: {\n\t\t\t// Type: action.data : FlashResultsObject\n\n\t\t\tif (!action.data) {\n\t\t\t\tthrow errors.createError({\n\t\t\t\t\ttitle: 'Missing results',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t_.defaults(action.data, {\n\t\t\t\tcancelled: false,\n\t\t\t\tskip: false,\n\t\t\t});\n\n\t\t\tif (!_.isBoolean(action.data.cancelled)) {\n\t\t\t\tthrow errors.createError({\n\t\t\t\t\ttitle: `Invalid results cancelled: ${action.data.cancelled}`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (action.data.cancelled && action.data.sourceChecksum) {\n\t\t\t\tthrow errors.createError({\n\t\t\t\t\ttitle:\n\t\t\t\t\t\t\"The sourceChecksum value can't exist if the flashing was cancelled\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\taction.data.sourceChecksum &&\n\t\t\t\t!_.isString(action.data.sourceChecksum)\n\t\t\t) {\n\t\t\t\tthrow errors.createError({\n\t\t\t\t\ttitle: `Invalid results sourceChecksum: ${action.data.sourceChecksum}`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\taction.data.errorCode &&\n\t\t\t\t!_.isString(action.data.errorCode) &&\n\t\t\t\t!_.isNumber(action.data.errorCode)\n\t\t\t) {\n\t\t\t\tthrow errors.createError({\n\t\t\t\t\ttitle: `Invalid results errorCode: ${action.data.errorCode}`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (action.data.results) {\n\t\t\t\taction.data.results.averageFlashingSpeed = state.get(\n\t\t\t\t\t'lastAverageFlashingSpeed',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (action.data.skip) {\n\t\t\t\treturn state\n\t\t\t\t\t.set('isFlashing', false)\n\t\t\t\t\t.set('flashResults', Immutable.fromJS(action.data));\n\t\t\t}\n\n\t\t\treturn state\n\t\t\t\t.set('isFlashing', false)\n\t\t\t\t.set('flashResults', Immutable.fromJS(action.data))\n\t\t\t\t.set('flashState', DEFAULT_STATE.get('flashState'));\n\t\t}\n\n\t\tcase Actions.SELECT_TARGET: {\n\t\t\t// Type: action.data : String\n\n\t\t\tconst device = action.data;\n\n\t\t\tif (!device) {\n\t\t\t\tthrow errors.createError({\n\t\t\t\t\ttitle: 'Missing drive',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (!_.isString(device)) {\n\t\t\t\tthrow errors.createError({\n\t\t\t\t\ttitle: `Invalid drive: ${device}`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst selectedDrive = _.find(getAvailableDrives(state), { device });\n\n\t\t\tif (!selectedDrive) {\n\t\t\t\tthrow errors.createError({\n\t\t\t\t\ttitle: `The drive is not available: ${device}`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (selectedDrive.isReadOnly) {\n\t\t\t\tthrow errors.createError({\n\t\t\t\t\ttitle: 'The drive is write-protected',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst image = state.getIn(['selection', 'image']);\n\t\t\tif (\n\t\t\t\timage &&\n\t\t\t\t!constraints.isDriveLargeEnough(selectedDrive, image.toJS())\n\t\t\t) {\n\t\t\t\tthrow errors.createError({\n\t\t\t\t\ttitle: 'The drive is not large enough',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst selectedDevices = state.getIn(['selection', 'devices']);\n\n\t\t\treturn state.setIn(['selection', 'devices'], selectedDevices.add(device));\n\t\t}\n\n\t\t// TODO(jhermsmeier): Consolidate these assertions\n\t\t// with image-stream / supported-formats, and have *one*\n\t\t// place where all the image extension / format handling\n\t\t// takes place, to avoid having to check 2+ locations with different logic\n\t\tcase Actions.SELECT_SOURCE: {\n\t\t\t// Type: action.data : ImageObject\n\n\t\t\tif (!action.data.drive) {\n\t\t\t\tverifyNoNilFields(action.data, selectImageNoNilFields, 'image');\n\t\t\t}\n\n\t\t\tif (!_.isString(action.data.path)) {\n\t\t\t\tthrow errors.createError({\n\t\t\t\t\ttitle: `Invalid image path: ${action.data.path}`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst MINIMUM_IMAGE_SIZE = 0;\n\n\t\t\tif (action.data.size !== undefined) {\n\t\t\t\tif (\n\t\t\t\t\taction.data.size < MINIMUM_IMAGE_SIZE ||\n\t\t\t\t\t!_.isInteger(action.data.size)\n\t\t\t\t) {\n\t\t\t\t\tthrow errors.createError({\n\t\t\t\t\t\ttitle: `Invalid image size: ${action.data.size}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!_.isUndefined(action.data.compressedSize)) {\n\t\t\t\tif (\n\t\t\t\t\taction.data.compressedSize < MINIMUM_IMAGE_SIZE ||\n\t\t\t\t\t!_.isInteger(action.data.compressedSize)\n\t\t\t\t) {\n\t\t\t\t\tthrow errors.createError({\n\t\t\t\t\t\ttitle: `Invalid image compressed size: ${action.data.compressedSize}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (action.data.url && !_.isString(action.data.url)) {\n\t\t\t\tthrow errors.createError({\n\t\t\t\t\ttitle: `Invalid image url: ${action.data.url}`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (action.data.name && !_.isString(action.data.name)) {\n\t\t\t\tthrow errors.createError({\n\t\t\t\t\ttitle: `Invalid image name: ${action.data.name}`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (action.data.logo && !_.isString(action.data.logo)) {\n\t\t\t\tthrow errors.createError({\n\t\t\t\t\ttitle: `Invalid image logo: ${action.data.logo}`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst selectedDevices = state.getIn(['selection', 'devices']);\n\n\t\t\t// Remove image-incompatible drives from selection with `constraints.isDriveValid`\n\t\t\treturn _.reduce(\n\t\t\t\tselectedDevices.toJS(),\n\t\t\t\t(accState, device) => {\n\t\t\t\t\tconst drive = _.find(getAvailableDrives(state), { device });\n\t\t\t\t\tif (\n\t\t\t\t\t\t!constraints.isDriveValid(drive, action.data) ||\n\t\t\t\t\t\t!constraints.isDriveSizeRecommended(drive, action.data)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn storeReducer(accState, {\n\t\t\t\t\t\t\ttype: Actions.DESELECT_TARGET,\n\t\t\t\t\t\t\tdata: device,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\treturn accState;\n\t\t\t\t},\n\t\t\t\tstate,\n\t\t\t).setIn(['selection', 'image'], Immutable.fromJS(action.data));\n\t\t}\n\n\t\tcase Actions.DESELECT_TARGET: {\n\t\t\t// Type: action.data : String\n\n\t\t\tif (!action.data) {\n\t\t\t\tthrow errors.createError({\n\t\t\t\t\ttitle: 'Missing drive',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (!_.isString(action.data)) {\n\t\t\t\tthrow errors.createError({\n\t\t\t\t\ttitle: `Invalid drive: ${action.data}`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst selectedDevices = state.getIn(['selection', 'devices']);\n\n\t\t\t// Remove drive from set in state\n\t\t\treturn state.setIn(\n\t\t\t\t['selection', 'devices'],\n\t\t\t\tselectedDevices.delete(action.data),\n\t\t\t);\n\t\t}\n\n\t\tcase Actions.DESELECT_SOURCE: {\n\t\t\treturn state.deleteIn(['selection', 'image']);\n\t\t}\n\n\t\tcase Actions.SET_APPLICATION_SESSION_UUID: {\n\t\t\treturn state.set('applicationSessionUuid', action.data);\n\t\t}\n\n\t\tcase Actions.SET_FLASHING_WORKFLOW_UUID: {\n\t\t\treturn state.set('flashingWorkflowUuid', action.data);\n\t\t}\n\n\t\tcase Actions.SET_DEVICE_PATHS: {\n\t\t\treturn state.set('devicePaths', action.data);\n\t\t}\n\n\t\tcase Actions.SET_FAILED_DEVICE_ERRORS: {\n\t\t\treturn state.set('failedDeviceErrors', action.data);\n\t\t}\n\n\t\tdefault: {\n\t\t\treturn state;\n\t\t}\n\t}\n}\n\nexport const store = redux.createStore(storeReducer, DEFAULT_STATE);\n\n/**\n * @summary Observe the store for changes\n * @param {Function} onChange - change handler\n * @returns {Function} unsubscribe\n */\nexport function observe(onChange: (state: typeof DEFAULT_STATE) => void) {\n\tlet currentState: typeof DEFAULT_STATE | null = null;\n\n\t/**\n\t * @summary Internal change detection handler\n\t */\n\tconst changeHandler = () => {\n\t\tconst nextState = store.getState();\n\t\tif (!_.isEqual(nextState, currentState)) {\n\t\t\tcurrentState = nextState;\n\t\t\tonChange(currentState);\n\t\t}\n\t};\n\n\tchangeHandler();\n\n\treturn store.subscribe(changeHandler);\n}\n"
  },
  {
    "path": "lib/gui/app/modules/analytics.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { findLastIndex, once } from 'lodash';\nimport * as SentryRenderer from '@sentry/electron/renderer';\nimport * as settings from '../models/settings';\n\ntype AnalyticsPayload = _.Dictionary<any>;\n\nconst clearUserPath = (filename: string): string => {\n\tconst generatedFile = filename.split('generated').reverse()[0];\n\treturn generatedFile !== filename ? `generated${generatedFile}` : filename;\n};\n\nexport const anonymizeSentryData = (\n\tevent: SentryRenderer.Event,\n): SentryRenderer.Event => {\n\tevent.exception?.values?.forEach((exception) => {\n\t\texception.stacktrace?.frames?.forEach((frame) => {\n\t\t\tif (frame.filename) {\n\t\t\t\tframe.filename = clearUserPath(frame.filename);\n\t\t\t}\n\t\t});\n\t});\n\n\tevent.breadcrumbs?.forEach((breadcrumb) => {\n\t\tif (breadcrumb.data?.url) {\n\t\t\tbreadcrumb.data.url = clearUserPath(breadcrumb.data.url);\n\t\t}\n\t});\n\n\tif (event.request?.url) {\n\t\tevent.request.url = clearUserPath(event.request.url);\n\t}\n\n\treturn event;\n};\n\nconst extractPathRegex = /(.*)(^|\\s)(file:\\/\\/)?(\\w:)?([\\\\/].+)/;\nconst etcherSegmentMarkers = ['app.asar', 'Resources'];\n\nexport const anonymizePath = (input: string) => {\n\t// First, extract a part of the value that matches a path pattern.\n\tconst match = extractPathRegex.exec(input);\n\tif (match === null) {\n\t\treturn input;\n\t}\n\tconst mainPart = match[5];\n\tconst space = match[2];\n\tconst beginning = match[1];\n\tconst uriPrefix = match[3] || '';\n\n\t// We have to deal with both Windows and POSIX here.\n\t// The path starts with its separator (we work with absolute paths).\n\tconst sep = mainPart[0];\n\tconst segments = mainPart.split(sep);\n\n\t// Moving from the end, find the first marker and cut the path from there.\n\tconst startCutIndex = findLastIndex(segments, (segment) =>\n\t\tetcherSegmentMarkers.includes(segment),\n\t);\n\treturn (\n\t\tbeginning +\n\t\tspace +\n\t\turiPrefix +\n\t\t'[PERSONAL PATH]' +\n\t\tsep +\n\t\tsegments.splice(startCutIndex).join(sep)\n\t);\n};\n\nconst safeAnonymizePath = (input: string) => {\n\ttry {\n\t\treturn anonymizePath(input);\n\t} catch (e) {\n\t\treturn '[ANONYMIZE PATH FAILED]';\n\t}\n};\n\nconst sensitiveEtcherProperties = [\n\t'error.description',\n\t'error.message',\n\t'error.stack',\n\t'image',\n\t'image.path',\n\t'path',\n];\n\nexport const anonymizeAnalyticsPayload = (\n\tdata: AnalyticsPayload,\n): AnalyticsPayload => {\n\tfor (const prop of sensitiveEtcherProperties) {\n\t\tconst value = data[prop];\n\t\tif (value != null) {\n\t\t\tdata[prop] = safeAnonymizePath(value.toString());\n\t\t}\n\t}\n\treturn data;\n};\n\n/**\n * @summary Init analytics configurations\n */\nexport const initAnalytics = once(() => {\n\tconst dsn =\n\t\tsettings.getSync('analyticsSentryToken') || process.env.SENTRY_TOKEN;\n\tSentryRenderer.init({\n\t\tdsn,\n\t\tbeforeSend: anonymizeSentryData,\n\t\tdebug: process.env.ETCHER_SENTRY_DEBUG === 'true',\n\t});\n});\n\n/**\n * @summary Log an exception\n *\n * @description\n * This function logs an exception to error reporting services.\n */\nexport function logException(error: any) {\n\tconst shouldReportErrors = settings.getSync('errorReporting');\n\tconsole.error(error);\n\tif (shouldReportErrors) {\n\t\tinitAnalytics();\n\t\tSentryRenderer.captureException(error);\n\t}\n}\n"
  },
  {
    "path": "lib/gui/app/modules/api.ts",
    "content": "/** This function will :\n * \t- start the ipc server (api)\n *  - spawn the child process (privileged or not)\n *  - wait for the child process to connect to the api\n *  - return a promise that will resolve with the emit function for the api\n *\n * //TODO:\n *  - this should be refactored to reverse the control flow:\n *    - the child process should be the server\n *    - this should be the client\n *  - replace the current node-ipc api with a websocket api\n *  - centralise the api for both the writer and the scanner instead of having two instances running\n */\n\nimport WebSocket from 'ws'; // (no types for wrapper, this is expected)\nimport { spawn, exec } from 'child_process';\nimport * as os from 'os';\nimport * as packageJSON from '../../../../package.json';\nimport * as permissions from '../../../shared/permissions';\nimport * as errors from '../../../shared/errors';\n\nconst THREADS_PER_CPU = 16;\nconst connectionRetryDelay = 1000;\nconst connectionRetryAttempts = 10;\n\nasync function writerArgv(): Promise<string[]> {\n\tlet entryPoint = await window.etcher.getEtcherUtilPath();\n\t// AppImages run over FUSE, so the files inside the mount point\n\t// can only be accessed by the user that mounted the AppImage.\n\t// This means we can't re-spawn Etcher as root from the same\n\t// mount-point, and as a workaround, we re-mount the original\n\t// AppImage as root.\n\tif (os.platform() === 'linux' && process.env.APPIMAGE && process.env.APPDIR) {\n\t\tentryPoint = entryPoint.replace(process.env.APPDIR, '');\n\t\treturn [\n\t\t\tprocess.env.APPIMAGE,\n\t\t\t'-e',\n\t\t\t`require(\\`\\${process.env.APPDIR}${entryPoint}\\`)`,\n\t\t];\n\t} else {\n\t\treturn [entryPoint];\n\t}\n}\n\nasync function spawnChild(\n\twithPrivileges: boolean,\n\tetcherServerId: string,\n\tetcherServerAddress: string,\n\tetcherServerPort: string,\n) {\n\tconst argv = await writerArgv();\n\tconst env: any = {\n\t\tETCHER_SERVER_ADDRESS: etcherServerAddress,\n\t\tETCHER_SERVER_ID: etcherServerId,\n\t\tETCHER_SERVER_PORT: etcherServerPort,\n\t\tUV_THREADPOOL_SIZE: (os.cpus().length * THREADS_PER_CPU).toString(),\n\t\t// This environment variable prevents the AppImages\n\t\t// desktop integration script from presenting the\n\t\t// \"installation\" dialog\n\t\tSKIP: '1',\n\t\t...(process.platform === 'win32' ? {} : process.env),\n\t};\n\n\tif (withPrivileges) {\n\t\tconsole.log('... with privileges ...');\n\t\treturn permissions.elevateCommand(argv, {\n\t\t\tapplicationName: packageJSON.displayName,\n\t\t\tenv,\n\t\t});\n\t} else {\n\t\tif (process.platform === 'win32') {\n\t\t\t// we need to ensure we reset the env as a previous elevation process might have kept them in a wrong state\n\t\t\tconst envCommand = [];\n\t\t\tfor (const key in env) {\n\t\t\t\tif (Object.prototype.hasOwnProperty.call(env, key)) {\n\t\t\t\t\tenvCommand.push(`set ${key}=${env[key]}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait exec(envCommand.join(' && '));\n\t\t}\n\t\tconst spawned = await spawn(argv[0], argv.slice(1), {\n\t\t\tenv,\n\t\t});\n\t\treturn { cancelled: false, spawned };\n\t}\n}\n\ntype ChildApi = {\n\temit: (type: string, payload: any) => void;\n\tregisterHandler: (event: string, handler: any) => void;\n\tfailed: boolean;\n};\n\nasync function connectToChildProcess(\n\tetcherServerAddress: string,\n\tetcherServerPort: string,\n\tetcherServerId: string,\n): Promise<ChildApi | { failed: boolean }> {\n\treturn new Promise((resolve, reject) => {\n\t\t// TODO: default to IPC connections https://github.com/websockets/ws/blob/master/doc/ws.md#ipc-connections\n\t\t// TODO: use the path as cheap authentication\n\n\t\tconsole.log(etcherServerId);\n\n\t\tconst url = `ws://${etcherServerAddress}:${etcherServerPort}`;\n\n\t\tconst ws = new WebSocket(url);\n\n\t\tlet heartbeat: any;\n\n\t\tconst startHeartbeat = (emit: any) => {\n\t\t\tconsole.log('start heartbeat');\n\t\t\theartbeat = setInterval(() => {\n\t\t\t\temit('heartbeat', {});\n\t\t\t}, 1000);\n\t\t};\n\n\t\tconst stopHeartbeat = () => {\n\t\t\tconsole.log('stop heartbeat');\n\t\t\tclearInterval(heartbeat);\n\t\t};\n\n\t\tws.on('error', (error: any) => {\n\t\t\tif (error.code === 'ECONNREFUSED') {\n\t\t\t\tresolve({\n\t\t\t\t\tfailed: true,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tstopHeartbeat();\n\t\t\t\treject({\n\t\t\t\t\tfailed: true,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tws.on('open', () => {\n\t\t\tconst emit = (type: string, payload: any) => {\n\t\t\t\tws.send(JSON.stringify({ type, payload }));\n\t\t\t};\n\n\t\t\temit('ready', {});\n\n\t\t\t// parse and route messages\n\t\t\tconst messagesHandler: any = {\n\t\t\t\tlog: (message: any) => {\n\t\t\t\t\tconsole.log(`CHILD LOG: ${message}`);\n\t\t\t\t},\n\n\t\t\t\terror: (error: any) => {\n\t\t\t\t\tconst errorObject = errors.fromJSON(error);\n\t\t\t\t\tconsole.error('CHILD ERROR', errorObject);\n\t\t\t\t\tstopHeartbeat();\n\t\t\t\t},\n\n\t\t\t\t// once api is ready (means child process is connected) we pass the emit function to the caller\n\t\t\t\tready: () => {\n\t\t\t\t\tconsole.log('CHILD READY');\n\n\t\t\t\t\tstartHeartbeat(emit);\n\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tfailed: false,\n\t\t\t\t\t\temit,\n\t\t\t\t\t\tregisterHandler,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tws.on('message', (jsonData: any) => {\n\t\t\t\tconst data = JSON.parse(jsonData);\n\t\t\t\tconst message = messagesHandler[data.type];\n\t\t\t\tif (message) {\n\t\t\t\t\tmessage(data.payload);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`Unknown message type: ${data.type}`);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// api to register more handlers with callbacks\n\t\t\tconst registerHandler = (event: string, handler: any) => {\n\t\t\t\tmessagesHandler[event] = handler;\n\t\t\t};\n\t\t});\n\t});\n}\n\nasync function spawnChildAndConnect({\n\twithPrivileges,\n}: {\n\twithPrivileges: boolean;\n}): Promise<ChildApi> {\n\tconst etcherServerAddress = process.env.ETCHER_SERVER_ADDRESS ?? '127.0.0.1'; // localhost\n\tconst etcherServerPort =\n\t\tprocess.env.ETCHER_SERVER_PORT ?? withPrivileges ? '3435' : '3434';\n\tconst etcherServerId =\n\t\tprocess.env.ETCHER_SERVER_ID ??\n\t\t`etcher-${Math.random().toString(36).substring(7)}`;\n\n\tconsole.log(\n\t\t`Starting ${\n\t\t\twithPrivileges ? 'priviledged' : 'unpriviledged'\n\t\t} flasher sidecar on port ${etcherServerPort}`,\n\t);\n\n\t// spawn the child process, which will act as the ws server\n\t// ETCHER_NO_SPAWN_UTIL can be set to launch a GUI only version of etcher, in that case you'll probably want to set other ENV to match your setup\n\tif (!process.env.ETCHER_NO_SPAWN_UTIL) {\n\t\ttry {\n\t\t\tconst result = await spawnChild(\n\t\t\t\twithPrivileges,\n\t\t\t\tetcherServerId,\n\t\t\t\tetcherServerAddress,\n\t\t\t\tetcherServerPort,\n\t\t\t);\n\t\t\tif (result.cancelled) {\n\t\t\t\tthrow new Error('Starting flasher sidecar process was cancelled');\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('Error starting flasher sidecar process', error);\n\t\t\tthrow new Error('Error starting flasher sidecar process');\n\t\t}\n\t}\n\n\t// try to connect to the ws server, retrying if necessary, until the connection is established\n\ttry {\n\t\tlet retry = 0;\n\t\twhile (retry < connectionRetryAttempts) {\n\t\t\tconst { emit, registerHandler, failed } = await connectToChildProcess(\n\t\t\t\tetcherServerAddress,\n\t\t\t\tetcherServerPort,\n\t\t\t\tetcherServerId,\n\t\t\t);\n\t\t\tif (failed) {\n\t\t\t\tretry++;\n\t\t\t\tconsole.log(\n\t\t\t\t\t`Connection to sidecar flasher process attempt ${retry} / ${connectionRetryAttempts} failed; retrying in ${connectionRetryDelay}ms...`,\n\t\t\t\t);\n\t\t\t\tawait new Promise((resolve) =>\n\t\t\t\t\tsetTimeout(resolve, connectionRetryDelay),\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\treturn { failed, emit, registerHandler };\n\t\t}\n\t\t// TODO: raised an error to the user if we reach this point\n\t\tthrow new Error('Connection to sidecar flasher process timed out');\n\t} catch (error) {\n\t\tconsole.error('Error connecting to sidecar flasher process process', error);\n\t\tthrow new Error('Connection to sidecar flasher process failed');\n\t}\n}\n\nexport { spawnChildAndConnect };\n"
  },
  {
    "path": "lib/gui/app/modules/exception-reporter.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { logException } from '../modules/analytics';\nimport { showError } from '../os/dialog';\n\n/**\n * @summary Report an exception\n */\nexport function report(exception?: Error) {\n\tif (exception === undefined) {\n\t\treturn;\n\t}\n\tshowError(exception);\n\tlogException(exception);\n}\n"
  },
  {
    "path": "lib/gui/app/modules/image-writer.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Drive as DrivelistDrive } from 'drivelist';\nimport type * as sdk from 'etcher-sdk';\nimport type { Dictionary } from 'lodash';\nimport * as errors from '../../../shared/errors';\nimport type { SourceMetadata } from '../../../shared/typings/source-selector';\nimport * as flashState from '../models/flash-state';\nimport * as settings from '../models/settings';\nimport * as windowProgress from '../os/window-progress';\nimport { spawnChildAndConnect } from './api';\n\nlet cancelEmitter: (type: string) => void | undefined;\ninterface FlashResults {\n\tskip?: boolean;\n\tcancelled?: boolean;\n\tresults?: {\n\t\tbytesWritten: number;\n\t\tdevices: {\n\t\t\tfailed: number;\n\t\t\tsuccessful: number;\n\t\t};\n\t\terrors: Error[];\n\t};\n}\n\nasync function performWrite(\n\timage: SourceMetadata,\n\tdrives: DrivelistDrive[],\n\tonProgress: sdk.multiWrite.OnProgressFunction,\n): Promise<{ cancelled?: boolean }> {\n\tconst { autoBlockmapping, decompressFirst } = await settings.getAll();\n\n\t// Spawn the child process with privileges and wait for the connection to be made\n\tconst { emit, registerHandler } = await spawnChildAndConnect({\n\t\twithPrivileges: true,\n\t});\n\n\treturn await new Promise((resolve, reject) => {\n\t\t// if the connection failed, reject the promise\n\n\t\tconst flashResults: FlashResults = {};\n\n\t\tconst onFail = ({ device, error }: { device: any; error: any }) => {\n\t\t\tconsole.log('fail event');\n\t\t\tconsole.log(device);\n\t\t\tconsole.log(error);\n\t\t\tif (device.devicePath) {\n\t\t\t\tflashState.addFailedDeviceError({ device, error });\n\t\t\t}\n\t\t\tfinish();\n\t\t};\n\n\t\tconst onDone = (payload: any) => {\n\t\t\tconsole.log('CHILD: flash done', payload);\n\t\t\tpayload.results.errors = payload.results.errors.map(\n\t\t\t\t(data: Dictionary<any> & { message: string }) => {\n\t\t\t\t\treturn errors.fromJSON(data);\n\t\t\t\t},\n\t\t\t);\n\t\t\tflashResults.results = payload.results;\n\t\t\tfinish();\n\t\t};\n\n\t\tconst onAbort = () => {\n\t\t\tconsole.log('CHILD: flash aborted');\n\t\t\tflashResults.cancelled = true;\n\t\t\tfinish();\n\t\t};\n\n\t\tconst onSkip = () => {\n\t\t\tconsole.log('CHILD: validation skipped');\n\t\t\tflashResults.skip = true;\n\t\t\tfinish();\n\t\t};\n\n\t\tconst finish = () => {\n\t\t\tconsole.log('Flash results', flashResults);\n\n\t\t\t// The flash wasn't cancelled and we didn't get a 'done' event\n\t\t\t// Catch unexpected situation\n\t\t\tif (\n\t\t\t\t!flashResults.cancelled &&\n\t\t\t\t!flashResults.skip &&\n\t\t\t\tflashResults.results === undefined\n\t\t\t) {\n\t\t\t\tconsole.log(flashResults);\n\t\t\t\treject(\n\t\t\t\t\terrors.createUserError({\n\t\t\t\t\t\ttitle: 'The writer process ended unexpectedly',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'Please try again, and contact the Etcher team if the problem persists',\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tresolve(flashResults);\n\t\t};\n\n\t\tregisterHandler('state', onProgress);\n\t\tregisterHandler('fail', onFail);\n\t\tregisterHandler('done', onDone);\n\t\tregisterHandler('abort', onAbort);\n\t\tregisterHandler('skip', onSkip);\n\n\t\tcancelEmitter = (cancelStatus: string) => emit('cancel', cancelStatus);\n\n\t\t// Now that we know we're connected we can instruct the child process to start the write\n\t\tconst parameters = {\n\t\t\timage,\n\t\t\tdestinations: drives,\n\t\t\tSourceType: image.SourceType,\n\t\t\tautoBlockmapping,\n\t\t\tdecompressFirst,\n\t\t};\n\t\tconsole.log('params', parameters);\n\t\temit('write', parameters);\n\t});\n\n\t// The process continue in the event handler\n}\n\n/**\n * @summary Flash an image to drives\n */\nexport async function flash(\n\timage: SourceMetadata,\n\tdrives: DrivelistDrive[],\n\t// This function is a parameter so it can be mocked in tests\n\twrite = performWrite,\n): Promise<void> {\n\tif (flashState.isFlashing()) {\n\t\tthrow new Error('There is already a flash in progress');\n\t}\n\n\tawait flashState.setFlashingFlag();\n\n\tflashState.setDevicePaths(\n\t\tdrives.map((d) => d.devicePath).filter((p) => p != null) as string[],\n\t);\n\n\t// start api and call the flasher\n\ttry {\n\t\tconst result = await write(image, drives, flashState.setProgressState);\n\t\tconsole.log('got results', result);\n\t\tawait flashState.unsetFlashingFlag(result);\n\t\tconsole.log('removed flashing flag');\n\t} catch (error: any) {\n\t\tawait flashState.unsetFlashingFlag({\n\t\t\tcancelled: false,\n\t\t\terrorCode: error.code,\n\t\t});\n\n\t\twindowProgress.clear();\n\n\t\tthrow error;\n\t}\n\n\twindowProgress.clear();\n}\n\n/**\n * @summary Cancel write operation\n * //TODO: find a better solution to handle cancellation\n */\nexport async function cancel(type: string) {\n\tconst status = type.toLowerCase();\n\n\tif (cancelEmitter) {\n\t\tcancelEmitter(status);\n\t}\n}\n"
  },
  {
    "path": "lib/gui/app/modules/progress-status.ts",
    "content": "/*\n * Copyright 2017 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\")\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport prettyBytes from 'pretty-bytes';\nimport * as i18next from 'i18next';\n\nexport interface FlashState {\n\tactive: number;\n\tfailed: number;\n\tpercentage?: number;\n\tspeed: number;\n\tposition: number;\n\ttype?: 'decompressing' | 'flashing' | 'verifying';\n}\n\nexport function fromFlashState({\n\ttype,\n\tpercentage,\n\tposition,\n}: Pick<FlashState, 'type' | 'percentage' | 'position'>): {\n\tstatus: string;\n\tposition?: string;\n} {\n\tif (type === undefined) {\n\t\treturn { status: i18next.t('progress.starting') };\n\t} else if (type === 'decompressing') {\n\t\tif (percentage == null) {\n\t\t\treturn { status: i18next.t('progress.decompressing') };\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tposition: `${percentage}%`,\n\t\t\t\tstatus: i18next.t('progress.decompressing'),\n\t\t\t};\n\t\t}\n\t} else if (type === 'flashing') {\n\t\tif (percentage != null) {\n\t\t\tif (percentage < 100) {\n\t\t\t\treturn {\n\t\t\t\t\tposition: `${percentage}%`,\n\t\t\t\t\tstatus: i18next.t('progress.flashing'),\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\treturn { status: i18next.t('progress.finishing') };\n\t\t\t}\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tstatus: i18next.t('progress.flashing'),\n\t\t\t\tposition: `${position ? prettyBytes(position) : ''}`,\n\t\t\t};\n\t\t}\n\t} else if (type === 'verifying') {\n\t\tif (percentage == null) {\n\t\t\treturn { status: i18next.t('progress.verifying') };\n\t\t} else if (percentage < 100) {\n\t\t\treturn {\n\t\t\t\tposition: `${percentage}%`,\n\t\t\t\tstatus: i18next.t('progress.verifying'),\n\t\t\t};\n\t\t} else {\n\t\t\treturn { status: i18next.t('progress.finishing') };\n\t\t}\n\t}\n\treturn { status: i18next.t('progress.failing') };\n}\n\nexport function titleFromFlashState(\n\tstate: Pick<FlashState, 'type' | 'percentage' | 'position'>,\n): string {\n\tconst { status, position } = fromFlashState(state);\n\tif (position !== undefined) {\n\t\treturn `${position} ${status}`;\n\t}\n\treturn status;\n}\n"
  },
  {
    "path": "lib/gui/app/os/dialog.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as electron from 'electron';\nimport * as remote from '@electron/remote';\nimport * as _ from 'lodash';\n\nimport * as errors from '../../../shared/errors';\nimport * as settings from '../../../gui/app/models/settings';\nimport { SUPPORTED_EXTENSIONS } from '../../../shared/supported-formats';\nimport * as i18next from 'i18next';\n\nasync function mountSourceDrive() {\n\t// sourceDrivePath is the name of the link in /dev/disk/by-path\n\tconst sourceDrivePath = await settings.get('automountOnFileSelect');\n\tif (sourceDrivePath) {\n\t\ttry {\n\t\t\tawait electron.ipcRenderer.invoke('mount-drive', sourceDrivePath);\n\t\t} catch (error: any) {\n\t\t\t// noop\n\t\t}\n\t}\n}\n\n/**\n * @summary Open an image selection dialog\n *\n * @description\n * Notice that by image, we mean *.img/*.iso/*.zip/etc files.\n */\nexport async function selectImage(): Promise<string | undefined> {\n\tawait mountSourceDrive();\n\tconst options: electron.OpenDialogOptions = {\n\t\t// This variable is set when running in GNU/Linux from\n\t\t// inside an AppImage, and represents the working directory\n\t\t// from where the AppImage was run (which might not be the\n\t\t// place where the AppImage is located). `OWD` stands for\n\t\t// \"Original Working Directory\".\n\t\t//\n\t\t// See: https://github.com/probonopd/AppImageKit/commit/1569d6f8540aa6c2c618dbdb5d6fcbf0003952b7\n\t\tdefaultPath: process.env.OWD,\n\t\tproperties: ['openFile', 'treatPackageAsDirectory'],\n\t\tfilters: [\n\t\t\t{\n\t\t\t\tname: i18next.t('source.osImages'),\n\t\t\t\textensions: SUPPORTED_EXTENSIONS,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: i18next.t('source.allFiles'),\n\t\t\t\textensions: ['*'],\n\t\t\t},\n\t\t],\n\t};\n\tconst currentWindow = remote.getCurrentWindow();\n\tconst [file] = (await remote.dialog.showOpenDialog(currentWindow, options))\n\t\t.filePaths;\n\treturn file;\n}\n\n/**\n * @summary Open a warning dialog\n */\nexport async function showWarning(options: {\n\tconfirmationLabel: string;\n\trejectionLabel: string;\n\ttitle: string;\n\tdescription: string;\n}): Promise<boolean> {\n\t_.defaults(options, {\n\t\tconfirmationLabel: i18next.t('ok'),\n\t\trejectionLabel: i18next.t('cancel'),\n\t});\n\n\tconst BUTTONS = [options.confirmationLabel, options.rejectionLabel];\n\n\tconst BUTTON_CONFIRMATION_INDEX = _.indexOf(\n\t\tBUTTONS,\n\t\toptions.confirmationLabel,\n\t);\n\tconst BUTTON_REJECTION_INDEX = _.indexOf(BUTTONS, options.rejectionLabel);\n\n\tconst { response } = await remote.dialog.showMessageBox(\n\t\tremote.getCurrentWindow(),\n\t\t{\n\t\t\ttype: 'warning',\n\t\t\tbuttons: BUTTONS,\n\t\t\tdefaultId: BUTTON_REJECTION_INDEX,\n\t\t\tcancelId: BUTTON_REJECTION_INDEX,\n\t\t\ttitle: i18next.t('attention'),\n\t\t\tmessage: options.title,\n\t\t\tdetail: options.description,\n\t\t},\n\t);\n\treturn response === BUTTON_CONFIRMATION_INDEX;\n}\n\n/**\n * @summary Show error dialog for an Error instance\n */\nexport function showError(error: Error) {\n\tconst title = errors.getTitle(error);\n\tconst message = errors.getDescription(error);\n\tremote.dialog.showErrorBox(title, message);\n}\n"
  },
  {
    "path": "lib/gui/app/os/notification.ts",
    "content": "/*\n * Copyright 2017 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as remote from '@electron/remote';\n\nimport * as settings from '../models/settings';\n\n/**\n * @summary Send a notification\n */\nexport async function send(title: string, body: string, icon: string) {\n\t// Bail out if desktop notifications are disabled\n\tif (!(await settings.get('desktopNotifications'))) {\n\t\treturn;\n\t}\n\n\t// `app.dock` is only defined in OS X\n\tif (remote.app.dock) {\n\t\tremote.app.dock.bounce();\n\t}\n\n\treturn new window.Notification(title, { body, icon });\n}\n"
  },
  {
    "path": "lib/gui/app/os/open-external/services/open-external.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as electron from 'electron';\nimport * as settings from '../../../models/settings';\n\n/**\n * @summary Open an external resource\n */\nexport async function open(url: string) {\n\t// Don't open links if they're disabled by the env var\n\tif (await settings.get('disableExternalLinks')) {\n\t\treturn;\n\t}\n\n\tif (url) {\n\t\telectron.shell.openExternal(url);\n\t}\n}\n"
  },
  {
    "path": "lib/gui/app/os/window-progress.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as remote from '@electron/remote';\n\nimport { percentageToFloat } from '../../../shared/utils';\nimport type { FlashState } from '../modules/progress-status';\nimport { titleFromFlashState } from '../modules/progress-status';\n\n/**\n * @summary The title of the main window upon program launch\n */\nconst INITIAL_TITLE = document.title;\n\n/**\n * @summary Make the full window status title\n */\nfunction getWindowTitle(state?: FlashState) {\n\tif (state) {\n\t\treturn `${INITIAL_TITLE} – ${titleFromFlashState(state)}`;\n\t}\n\treturn INITIAL_TITLE;\n}\n\n/**\n * @summary A reference to the current renderer Electron window\n *\n * @description\n * We expose this property to `this` for testability purposes.\n */\nexport const currentWindow = remote.getCurrentWindow();\n\n/**\n * @summary Set operating system window progress\n *\n * @description\n * Show progress inline in operating system task bar\n */\nexport function set(state: FlashState) {\n\tif (state.percentage != null) {\n\t\tcurrentWindow.setProgressBar(percentageToFloat(state.percentage));\n\t}\n\tcurrentWindow.setTitle(getWindowTitle(state));\n}\n\n/**\n * @summary Clear the window progress bar\n */\nexport function clear() {\n\t// Passing 0 or null/undefined doesn't work.\n\tcurrentWindow.setProgressBar(-1);\n\tcurrentWindow.setTitle(getWindowTitle(undefined));\n}\n"
  },
  {
    "path": "lib/gui/app/os/windows-network-drives.ts",
    "content": "/*\n * Copyright 2019 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { exec } from 'child_process';\nimport { withTmpFile } from 'etcher-sdk/build/tmp';\nimport { readFile } from 'fs';\nimport { chain, trim } from 'lodash';\nimport { platform } from 'os';\nimport { join } from 'path';\nimport { env } from 'process';\nimport { promisify } from 'util';\n\nconst readFileAsync = promisify(readFile);\n\nconst execAsync = promisify(exec);\n\n/**\n * @summary Returns wmic's output for network drives\n */\nasync function getWmicNetworkDrivesOutput(): Promise<string> {\n\t// When trying to read wmic's stdout directly from node, it is encoded with the current\n\t// console codepage (depending on the computer).\n\t// Decoding this would require getting this codepage somehow and using iconv as node\n\t// doesn't know how to read cp850 directly for example.\n\t// We could also use wmic's \"/output:\" switch but it doesn't work when the filename\n\t// contains a space and the os temp dir may contain spaces (\"D:\\Windows Temp Files\" for example).\n\t// So we just redirect to a file and read it afterwards as we know it will be ucs2 encoded.\n\tconst options = {\n\t\t// Close the file once it's created\n\t\tkeepOpen: false,\n\t\t// Wmic fails with \"Invalid global switch\" when the \"/output:\" switch filename contains a dash (\"-\")\n\t\tprefix: 'tmp',\n\t};\n\treturn withTmpFile(options, async ({ path }) => {\n\t\tconst command = [\n\t\t\tjoin(env.SystemRoot as string, 'System32', 'Wbem', 'wmic'),\n\t\t\t'path',\n\t\t\t'Win32_LogicalDisk',\n\t\t\t'Where',\n\t\t\t'DriveType=\"4\"',\n\t\t\t'get',\n\t\t\t'DeviceID,ProviderName',\n\t\t\t'>',\n\t\t\t`\"${path}\"`,\n\t\t];\n\t\tawait execAsync(command.join(' '), { windowsHide: true });\n\t\treturn readFileAsync(path, 'ucs2');\n\t});\n}\n\n/**\n * @summary returns a Map of drive letter -> network locations on Windows: 'Z:' -> '\\\\\\\\192.168.0.1\\\\Public'\n */\nasync function getWindowsNetworkDrives(\n\tgetWmicOutput: () => Promise<string>,\n): Promise<Map<string, string>> {\n\tconst result = await getWmicOutput();\n\tconst couples: Array<[string, string]> = chain(result)\n\t\t.split('\\n')\n\t\t// Remove header line\n\t\t.slice(1)\n\t\t// Remove extra spaces / tabs / carriage returns\n\t\t.invokeMap(String.prototype.trim)\n\t\t// Filter out empty lines\n\t\t.compact()\n\t\t.map((str: string): [string, string] => {\n\t\t\tconst colonPosition = str.indexOf(':');\n\t\t\tif (colonPosition === -1) {\n\t\t\t\tthrow new Error(`Can't parse wmic output: ${result}`);\n\t\t\t}\n\t\t\treturn [\n\t\t\t\tstr.slice(0, colonPosition + 1),\n\t\t\t\ttrim(str.slice(colonPosition + 1)),\n\t\t\t];\n\t\t})\n\t\t.filter((couple) => couple[1].length > 0)\n\t\t.value();\n\treturn new Map(couples);\n}\n\n/**\n * @summary Replaces network drive letter with network drive location in the provided filePath on Windows\n */\nexport async function replaceWindowsNetworkDriveLetter(\n\tfilePath: string,\n\t// getWmicOutput is a parameter so it can be replaced in tests\n\tgetWmicOutput = getWmicNetworkDrivesOutput,\n): Promise<string> {\n\tlet result = filePath;\n\tif (platform() === 'win32') {\n\t\tconst matches = /^([A-Z]+:)\\\\(.*)$/.exec(filePath);\n\t\tif (matches !== null) {\n\t\t\tconst [, drive, relativePath] = matches;\n\t\t\tconst drives = await getWindowsNetworkDrives(getWmicOutput);\n\t\t\tconst location = drives.get(drive);\n\t\t\tif (location !== undefined) {\n\t\t\t\tresult = `${location}\\\\${relativePath}`;\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\n"
  },
  {
    "path": "lib/gui/app/pages/main/Flash.tsx",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport CircleSvg from '@fortawesome/fontawesome-free/svgs/solid/circle.svg';\nimport * as _ from 'lodash';\nimport * as path from 'path';\nimport * as React from 'react';\nimport { Flex, Modal as SmallModal, Txt } from 'rendition';\n\nimport * as constraints from '../../../../shared/drive-constraints';\nimport * as messages from '../../../../shared/messages';\nimport { ProgressButton } from '../../components/progress-button/progress-button';\nimport * as availableDrives from '../../models/available-drives';\nimport * as flashState from '../../models/flash-state';\nimport * as selection from '../../models/selection-state';\nimport * as analytics from '../../modules/analytics';\nimport * as imageWriter from '../../modules/image-writer';\nimport * as notification from '../../os/notification';\nimport {\n\tselectAllTargets,\n\tTargetSelectorModal,\n} from '../../components/target-selector/target-selector';\n\nimport FlashSvg from '../../../assets/flash.svg';\nimport DriveStatusWarningModal from '../../components/drive-status-warning-modal/drive-status-warning-modal';\nimport * as i18next from 'i18next';\n\nconst COMPLETED_PERCENTAGE = 100;\nconst SPEED_PRECISION = 2;\n\nconst getErrorMessageFromCode = (errorCode: string) => {\n\t// TODO: All these error codes to messages translations\n\t// should go away if the writer emitted user friendly\n\t// messages on the first place.\n\tif (errorCode === 'EVALIDATION') {\n\t\treturn messages.error.validation();\n\t} else if (errorCode === 'EUNPLUGGED') {\n\t\treturn messages.error.driveUnplugged();\n\t} else if (errorCode === 'EIO') {\n\t\treturn messages.error.inputOutput();\n\t} else if (errorCode === 'ENOSPC') {\n\t\treturn messages.error.notEnoughSpaceInDrive();\n\t} else if (errorCode === 'ECHILDDIED') {\n\t\treturn messages.error.childWriterDied();\n\t}\n\treturn '';\n};\n\nfunction notifySuccess(\n\ticonPath: string,\n\tbasename: string,\n\tdrives: any,\n\tdevices: { successful: number; failed: number },\n) {\n\tnotification.send(\n\t\t'Flash complete!',\n\t\tmessages.info.flashComplete(basename, drives, devices),\n\t\ticonPath,\n\t);\n}\n\nfunction notifyFailure(iconPath: string, basename: string, drives: any) {\n\tnotification.send(\n\t\t'Oops! Looks like the flash failed.',\n\t\tmessages.error.flashFailure(basename, drives),\n\t\ticonPath,\n\t);\n}\n\nasync function flashImageToDrive(\n\tisFlashing: boolean,\n\tgoToSuccess: () => void,\n): Promise<string> {\n\tconst devices = selection.getSelectedDevices();\n\tconst image: any = selection.getImage();\n\tconst drives = availableDrives.getDrives().filter((drive: any) => {\n\t\treturn devices.includes(drive.device);\n\t});\n\n\tif (drives.length === 0 || isFlashing) {\n\t\treturn '';\n\t}\n\n\tconst iconPath = path.join('media', 'icon.png');\n\tconst basename = path.basename(image.path);\n\ttry {\n\t\tawait imageWriter.flash(image, drives);\n\t\tif (!flashState.wasLastFlashCancelled()) {\n\t\t\tconst {\n\t\t\t\tresults = { devices: { successful: 0, failed: 0 } },\n\t\t\t\tskip,\n\t\t\t\tcancelled,\n\t\t\t} = flashState.getFlashResults();\n\t\t\tif (!skip && !cancelled) {\n\t\t\t\tif (results?.devices?.successful > 0) {\n\t\t\t\t\tnotifySuccess(iconPath, basename, drives, results.devices);\n\t\t\t\t} else {\n\t\t\t\t\tnotifyFailure(iconPath, basename, drives);\n\t\t\t\t}\n\t\t\t}\n\t\t\tgoToSuccess();\n\t\t}\n\t} catch (error: any) {\n\t\tnotifyFailure(iconPath, basename, drives);\n\t\tlet errorMessage = getErrorMessageFromCode(error.code);\n\t\tif (!errorMessage) {\n\t\t\terror.image = basename;\n\t\t\tanalytics.logException(error);\n\t\t\terrorMessage = messages.error.genericFlashError(error);\n\t\t}\n\t\treturn errorMessage;\n\t} finally {\n\t\tavailableDrives.setDrives([]);\n\t}\n\n\treturn '';\n}\n\nconst formatSeconds = (totalSeconds: number) => {\n\tif (typeof totalSeconds !== 'number' || !Number.isFinite(totalSeconds)) {\n\t\treturn '';\n\t}\n\tconst minutes = Math.floor(totalSeconds / 60);\n\tconst seconds = Math.floor(totalSeconds - minutes * 60);\n\n\treturn `${minutes}m${seconds}s`;\n};\n\ninterface FlashStepProps {\n\tshouldFlashStepBeDisabled: boolean;\n\tgoToSuccess: () => void;\n\tisFlashing: boolean;\n\tstyle?: React.CSSProperties;\n\t// TODO: factorize\n\tstep: 'decompressing' | 'flashing' | 'verifying';\n\tpercentage: number;\n\tposition: number;\n\tfailed: number;\n\tspeed?: number;\n\teta?: number;\n\twidth: string;\n}\n\nexport interface DriveWithWarnings extends constraints.DrivelistDrive {\n\tstatuses: constraints.DriveStatus[];\n}\n\ninterface FlashStepState {\n\twarningMessage: boolean;\n\terrorMessage: string;\n\tshowDriveSelectorModal: boolean;\n\tsystemDrives: boolean;\n\tdrivesWithWarnings: DriveWithWarnings[];\n}\n\nexport class FlashStep extends React.PureComponent<\n\tFlashStepProps,\n\tFlashStepState\n> {\n\tconstructor(props: FlashStepProps) {\n\t\tsuper(props);\n\t\tthis.state = {\n\t\t\twarningMessage: false,\n\t\t\terrorMessage: '',\n\t\t\tshowDriveSelectorModal: false,\n\t\t\tsystemDrives: false,\n\t\t\tdrivesWithWarnings: [],\n\t\t};\n\t}\n\n\tprivate async handleWarningResponse(shouldContinue: boolean) {\n\t\tthis.setState({ warningMessage: false });\n\t\tif (!shouldContinue) {\n\t\t\tthis.setState({ showDriveSelectorModal: true });\n\t\t\treturn;\n\t\t}\n\t\tthis.setState({\n\t\t\terrorMessage: await flashImageToDrive(\n\t\t\t\tthis.props.isFlashing,\n\t\t\t\tthis.props.goToSuccess,\n\t\t\t),\n\t\t});\n\t}\n\n\tprivate handleFlashErrorResponse(shouldRetry: boolean) {\n\t\tthis.setState({ errorMessage: '' });\n\t\tflashState.resetState();\n\t\tif (!shouldRetry) {\n\t\t\tselection.clear();\n\t\t}\n\t}\n\n\tprivate hasListWarnings(drives: any[]) {\n\t\tif (drives.length === 0 || flashState.isFlashing()) {\n\t\t\treturn;\n\t\t}\n\t\treturn drives.filter((drive) => drive.isSystem).length > 0;\n\t}\n\n\tprivate async tryFlash() {\n\t\tconst drives = selection.getSelectedDrives().map((drive) => {\n\t\t\treturn {\n\t\t\t\t...drive,\n\t\t\t\tstatuses: constraints.getDriveImageCompatibilityStatuses(\n\t\t\t\t\tdrive,\n\t\t\t\t\tundefined,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t};\n\t\t});\n\t\tif (drives.length === 0 || this.props.isFlashing) {\n\t\t\treturn;\n\t\t}\n\t\tconst hasDangerStatus = drives.some((drive) => drive.statuses.length > 0);\n\t\tif (hasDangerStatus) {\n\t\t\tconst systemDrives = drives.some((drive) =>\n\t\t\t\tdrive.statuses.includes(constraints.statuses.system),\n\t\t\t);\n\t\t\tthis.setState({\n\t\t\t\tsystemDrives,\n\t\t\t\tdrivesWithWarnings: drives.filter((driveWithWarnings) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\tdriveWithWarnings.isSystem ||\n\t\t\t\t\t\t(!systemDrives &&\n\t\t\t\t\t\t\tdriveWithWarnings.statuses.includes(constraints.statuses.large))\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t\twarningMessage: true,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tthis.setState({\n\t\t\terrorMessage: await flashImageToDrive(\n\t\t\t\tthis.props.isFlashing,\n\t\t\t\tthis.props.goToSuccess,\n\t\t\t),\n\t\t});\n\t}\n\n\tpublic render() {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<Flex\n\t\t\t\t\tflexDirection=\"column\"\n\t\t\t\t\talignItems=\"start\"\n\t\t\t\t\twidth={this.props.width}\n\t\t\t\t\tstyle={this.props.style}\n\t\t\t\t>\n\t\t\t\t\t<FlashSvg\n\t\t\t\t\t\twidth=\"40px\"\n\t\t\t\t\t\tclassName={this.props.shouldFlashStepBeDisabled ? 'disabled' : ''}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tmargin: '0 auto',\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<ProgressButton\n\t\t\t\t\t\ttype={this.props.step}\n\t\t\t\t\t\tactive={this.props.isFlashing}\n\t\t\t\t\t\tpercentage={this.props.percentage}\n\t\t\t\t\t\tposition={this.props.position}\n\t\t\t\t\t\tdisabled={this.props.shouldFlashStepBeDisabled}\n\t\t\t\t\t\tcancel={imageWriter.cancel}\n\t\t\t\t\t\twarning={this.hasListWarnings(selection.getSelectedDrives())}\n\t\t\t\t\t\tcallback={() => this.tryFlash()}\n\t\t\t\t\t/>\n\n\t\t\t\t\t{!_.isNil(this.props.speed) &&\n\t\t\t\t\t\tthis.props.percentage !== COMPLETED_PERCENTAGE && (\n\t\t\t\t\t\t\t<Flex\n\t\t\t\t\t\t\t\tjustifyContent=\"space-between\"\n\t\t\t\t\t\t\t\tfontSize=\"14px\"\n\t\t\t\t\t\t\t\tcolor=\"#7e8085\"\n\t\t\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Txt>\n\t\t\t\t\t\t\t\t\t{i18next.t('flash.speedShort', {\n\t\t\t\t\t\t\t\t\t\tspeed: this.props.speed.toFixed(SPEED_PRECISION),\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</Txt>\n\t\t\t\t\t\t\t\t{!_.isNil(this.props.eta) && (\n\t\t\t\t\t\t\t\t\t<Txt>\n\t\t\t\t\t\t\t\t\t\t{i18next.t('flash.eta', {\n\t\t\t\t\t\t\t\t\t\t\teta: formatSeconds(this.props.eta),\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t</Txt>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Flex>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t{Boolean(this.props.failed) && (\n\t\t\t\t\t\t<Flex color=\"#fff\" alignItems=\"center\" mt={35}>\n\t\t\t\t\t\t\t<CircleSvg height=\"1em\" fill=\"#ff4444\" />\n\t\t\t\t\t\t\t<Txt ml={10}>{this.props.failed}</Txt>\n\t\t\t\t\t\t\t<Txt ml={10}>{messages.progress.failed(this.props.failed)}</Txt>\n\t\t\t\t\t\t</Flex>\n\t\t\t\t\t)}\n\t\t\t\t</Flex>\n\n\t\t\t\t{this.state.warningMessage && (\n\t\t\t\t\t<DriveStatusWarningModal\n\t\t\t\t\t\tdone={() => this.handleWarningResponse(true)}\n\t\t\t\t\t\tcancel={() => this.handleWarningResponse(false)}\n\t\t\t\t\t\tisSystem={this.state.systemDrives}\n\t\t\t\t\t\tdrivesWithWarnings={this.state.drivesWithWarnings}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{this.state.errorMessage && (\n\t\t\t\t\t<SmallModal\n\t\t\t\t\t\twidth={400}\n\t\t\t\t\t\ttitleElement={'Attention'}\n\t\t\t\t\t\tcancel={() => this.handleFlashErrorResponse(false)}\n\t\t\t\t\t\tdone={() => this.handleFlashErrorResponse(true)}\n\t\t\t\t\t\taction={'Retry'}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Txt>\n\t\t\t\t\t\t\t{this.state.errorMessage.split('\\n').map((message, key) => (\n\t\t\t\t\t\t\t\t<p key={key}>{message}</p>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</Txt>\n\t\t\t\t\t</SmallModal>\n\t\t\t\t)}\n\t\t\t\t{this.state.showDriveSelectorModal && (\n\t\t\t\t\t<TargetSelectorModal\n\t\t\t\t\t\twrite={true}\n\t\t\t\t\t\tcancel={() => this.setState({ showDriveSelectorModal: false })}\n\t\t\t\t\t\tdone={(modalTargets) => {\n\t\t\t\t\t\t\tselectAllTargets(modalTargets);\n\t\t\t\t\t\t\tthis.setState({ showDriveSelectorModal: false });\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</>\n\t\t);\n\t}\n}\n"
  },
  {
    "path": "lib/gui/app/pages/main/MainPage.tsx",
    "content": "/*\n * Copyright 2019 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport CogSvg from '@fortawesome/fontawesome-free/svgs/solid/gear.svg';\nimport CloseSvg from '@fortawesome/fontawesome-free/svgs/solid/x.svg';\nimport QuestionCircleSvg from '@fortawesome/fontawesome-free/svgs/solid/circle-question.svg';\n\nimport * as path from 'path';\nimport prettyBytes from 'pretty-bytes';\nimport * as React from 'react';\nimport { Alert, Flex, Link } from 'rendition';\nimport styled from 'styled-components';\n\nimport FinishPage from '../../components/finish/finish';\nimport { ReducedFlashingInfos } from '../../components/reduced-flashing-infos/reduced-flashing-infos';\nimport { SettingsModal } from '../../components/settings/settings';\nimport { SourceSelector } from '../../components/source-selector/source-selector';\nimport type { SourceMetadata } from '../../../../shared/typings/source-selector';\nimport * as flashState from '../../models/flash-state';\nimport * as selectionState from '../../models/selection-state';\nimport * as settings from '../../models/settings';\nimport { observe } from '../../models/store';\nimport { open as openExternal } from '../../os/open-external/services/open-external';\nimport {\n\tIconButton as BaseIcon,\n\tIconButton,\n\tThemedProvider,\n} from '../../styled-components';\n\nimport {\n\tTargetSelector,\n\tgetDriveListLabel,\n} from '../../components/target-selector/target-selector';\nimport { FlashStep } from './Flash';\n\nimport EtcherSvg from '../../../assets/etcher.svg';\nimport { SafeWebview } from '../../components/safe-webview/safe-webview';\nimport { theme } from '../../theme';\n\nconst Icon = styled(BaseIcon)`\n\tmargin-right: 20px;\n`;\n\nfunction getDrivesTitle() {\n\tconst drives = selectionState.getSelectedDrives();\n\n\tif (drives.length === 1) {\n\t\treturn drives[0].description || 'Untitled Device';\n\t}\n\n\tif (drives.length === 0) {\n\t\treturn 'No targets found';\n\t}\n\n\treturn `${drives.length} Targets`;\n}\n\nfunction getImageBasename(image?: SourceMetadata) {\n\tif (image === undefined) {\n\t\treturn '';\n\t}\n\n\tif (image.drive) {\n\t\treturn image.drive.description;\n\t}\n\tconst imageBasename = path.basename(image.path);\n\treturn image.name || imageBasename;\n}\n\nconst StepBorder = styled.div<{\n\tdisabled: boolean;\n\tleft?: boolean;\n\tright?: boolean;\n}>`\n\tposition: relative;\n\theight: 2px;\n\tbackground-color: ${(props) =>\n\t\tprops.disabled\n\t\t\t? props.theme.colors.dark.disabled.foreground\n\t\t\t: props.theme.colors.dark.foreground};\n\twidth: 120px;\n\ttop: 19px;\n\n\tleft: ${(props) => (props.left ? '-67px' : undefined)};\n\tmargin-right: ${(props) => (props.left ? '-120px' : undefined)};\n\tright: ${(props) => (props.right ? '-67px' : undefined)};\n\tmargin-left: ${(props) => (props.right ? '-120px' : undefined)};\n`;\n\nconst ANALYTICS_ALERT_VISIBILITY_KEY = 'analytics_alert_visible';\n\ninterface MainPageStateFromStore {\n\tisFlashing: boolean;\n\thasImage: boolean;\n\thasDrive: boolean;\n\timageLogo?: string;\n\timageSize?: number;\n\timageName?: string;\n\tdriveTitle: string;\n\tdriveLabel: string;\n}\n\ninterface MainPageState {\n\tcurrent: 'main' | 'success';\n\tisWebviewShowing: boolean;\n\thideSettings: boolean;\n\tfeaturedProjectURL?: string;\n\tanalyticsAlertIsVisible: boolean;\n}\n\nexport class MainPage extends React.Component<\n\tobject,\n\tMainPageState & MainPageStateFromStore\n> {\n\tconstructor(props: object) {\n\t\tsuper(props);\n\t\tthis.state = {\n\t\t\tcurrent: 'main',\n\t\t\tisWebviewShowing: false,\n\t\t\thideSettings: true,\n\t\t\tanalyticsAlertIsVisible:\n\t\t\t\tlocalStorage.getItem(ANALYTICS_ALERT_VISIBILITY_KEY) !== 'false',\n\t\t\t...this.stateHelper(),\n\t\t};\n\t}\n\n\tprivate stateHelper(): MainPageStateFromStore {\n\t\tconst image = selectionState.getImage();\n\t\treturn {\n\t\t\tisFlashing: flashState.isFlashing(),\n\t\t\thasImage: selectionState.hasImage(),\n\t\t\thasDrive: selectionState.hasDrive(),\n\t\t\timageLogo: image?.logo,\n\t\t\timageSize: image?.size,\n\t\t\timageName: getImageBasename(selectionState.getImage()),\n\t\t\tdriveTitle: getDrivesTitle(),\n\t\t\tdriveLabel: getDriveListLabel(),\n\t\t};\n\t}\n\n\tprivate async getFeaturedProjectURL() {\n\t\tconst url = new URL(\n\t\t\t(await settings.get('featuredProjectEndpoint')) ||\n\t\t\t\t'https://efp.balena.io/index.html',\n\t\t);\n\t\turl.searchParams.append('borderRight', 'false');\n\t\turl.searchParams.append('darkBackground', 'true');\n\t\treturn url.toString();\n\t}\n\n\tprivate hideAnalyticsAlert = () => {\n\t\tif (this.state.analyticsAlertIsVisible) {\n\t\t\tlocalStorage.setItem(ANALYTICS_ALERT_VISIBILITY_KEY, 'false');\n\t\t\tthis.setState({ analyticsAlertIsVisible: false });\n\t\t}\n\t};\n\n\tpublic async componentDidMount() {\n\t\tobserve(() => {\n\t\t\tthis.setState(this.stateHelper());\n\t\t});\n\t\tthis.setState({ featuredProjectURL: await this.getFeaturedProjectURL() });\n\t}\n\n\tpublic componentDidUpdate(\n\t\t_prevProps: object,\n\t\tprevState: Readonly<MainPageState & MainPageStateFromStore>,\n\t) {\n\t\tif (this.state.analyticsAlertIsVisible) {\n\t\t\tif (prevState.hideSettings !== this.state.hideSettings) {\n\t\t\t\tthis.setState({ analyticsAlertIsVisible: false });\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate renderMain() {\n\t\tconst state = flashState.getFlashState();\n\t\tconst shouldDriveStepBeDisabled = !this.state.hasImage;\n\t\tconst shouldFlashStepBeDisabled =\n\t\t\t!this.state.hasImage || !this.state.hasDrive;\n\t\tconst notFlashingOrSplitView =\n\t\t\t!this.state.isFlashing || !this.state.isWebviewShowing;\n\t\treturn (\n\t\t\t<Flex\n\t\t\t\tm={`110px ${this.state.isWebviewShowing ? 35 : 55}px 18px ${this.state.isWebviewShowing ? 35 : 55}px`}\n\t\t\t\tflexDirection=\"column\"\n\t\t\t>\n\t\t\t\t<Flex\n\t\t\t\t\tjustifyContent=\"space-between\"\n\t\t\t\t\tmb={this.state.analyticsAlertIsVisible ? '0px' : '92px'}\n\t\t\t\t>\n\t\t\t\t\t{notFlashingOrSplitView && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<SourceSelector\n\t\t\t\t\t\t\t\tflashing={this.state.isFlashing}\n\t\t\t\t\t\t\t\thideAnalyticsAlert={this.hideAnalyticsAlert}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Flex>\n\t\t\t\t\t\t\t\t<StepBorder disabled={shouldDriveStepBeDisabled} left />\n\t\t\t\t\t\t\t</Flex>\n\t\t\t\t\t\t\t<TargetSelector\n\t\t\t\t\t\t\t\tdisabled={shouldDriveStepBeDisabled}\n\t\t\t\t\t\t\t\thasDrive={this.state.hasDrive}\n\t\t\t\t\t\t\t\tflashing={this.state.isFlashing}\n\t\t\t\t\t\t\t\thideAnalyticsAlert={this.hideAnalyticsAlert}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Flex>\n\t\t\t\t\t\t\t\t<StepBorder disabled={shouldFlashStepBeDisabled} right />\n\t\t\t\t\t\t\t</Flex>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{this.state.isFlashing && this.state.isWebviewShowing && (\n\t\t\t\t\t\t<Flex\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\t\twidth: '36.2vw',\n\t\t\t\t\t\t\t\theight: '100vh',\n\t\t\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\t\t\tboxShadow: '0 2px 15px 0 rgba(0, 0, 0, 0.2)',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ReducedFlashingInfos\n\t\t\t\t\t\t\t\timageLogo={this.state.imageLogo}\n\t\t\t\t\t\t\t\timageName={this.state.imageName}\n\t\t\t\t\t\t\t\timageSize={\n\t\t\t\t\t\t\t\t\ttypeof this.state.imageSize === 'number'\n\t\t\t\t\t\t\t\t\t\t? prettyBytes(this.state.imageSize)\n\t\t\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tdriveTitle={this.state.driveTitle}\n\t\t\t\t\t\t\t\tdriveLabel={this.state.driveLabel}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\t\t\tcolor: '#fff',\n\t\t\t\t\t\t\t\t\tleft: 35,\n\t\t\t\t\t\t\t\t\ttop: 72,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Flex>\n\t\t\t\t\t)}\n\t\t\t\t\t{this.state.isFlashing && this.state.featuredProjectURL && (\n\t\t\t\t\t\t<SafeWebview\n\t\t\t\t\t\t\tsrc={this.state.featuredProjectURL}\n\t\t\t\t\t\t\tonWebviewShow={(isWebviewShowing: boolean) => {\n\t\t\t\t\t\t\t\tthis.setState({ isWebviewShowing });\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\t\twidth: '63.8vw',\n\t\t\t\t\t\t\t\theight: '100vh',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<FlashStep\n\t\t\t\t\t\twidth={this.state.isWebviewShowing ? '220px' : '200px'}\n\t\t\t\t\t\tgoToSuccess={() => this.setState({ current: 'success' })}\n\t\t\t\t\t\tshouldFlashStepBeDisabled={shouldFlashStepBeDisabled}\n\t\t\t\t\t\tisFlashing={this.state.isFlashing}\n\t\t\t\t\t\tstep={state.type}\n\t\t\t\t\t\tpercentage={state.percentage}\n\t\t\t\t\t\tposition={state.position}\n\t\t\t\t\t\tfailed={state.failed}\n\t\t\t\t\t\tspeed={state.speed}\n\t\t\t\t\t\teta={state.eta}\n\t\t\t\t\t\tstyle={{ zIndex: 1 }}\n\t\t\t\t\t/>\n\t\t\t\t</Flex>\n\t\t\t\t{this.state.analyticsAlertIsVisible && (\n\t\t\t\t\t<Alert mt=\"18px\" style={{ boxShadow: 'none', fontSize: '12px' }}>\n\t\t\t\t\t\t<Flex alignItems=\"center\" justifyContent=\"space-between\">\n\t\t\t\t\t\t\t<Flex flexDirection=\"column\">\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\tEtcher collects a limited amount of anonymous data to help us\n\t\t\t\t\t\t\t\t\timprove user experience. You can opt out in the{' '}\n\t\t\t\t\t\t\t\t\t<Link onClick={() => this.setState({ hideSettings: false })}>\n\t\t\t\t\t\t\t\t\t\tsettings\n\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t.\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\tFor more information about how we use this data, see our{' '}\n\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\topenExternal('https://www.balena.io/privacy-policy');\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tprivacy policy\n\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t.\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</Flex>\n\t\t\t\t\t\t\t{/* TODO: can we use onDismiss instead? */}\n\t\t\t\t\t\t\t<IconButton onClick={this.hideAnalyticsAlert}>\n\t\t\t\t\t\t\t\t<CloseSvg height=\"0.75rem\" fill={theme.colors.text.main} />\n\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t</Flex>\n\t\t\t\t\t</Alert>\n\t\t\t\t)}\n\t\t\t</Flex>\n\t\t);\n\t}\n\n\tprivate renderSuccess() {\n\t\treturn (\n\t\t\t<FinishPage\n\t\t\t\tgoToMain={() => {\n\t\t\t\t\tflashState.resetState();\n\t\t\t\t\tthis.setState({ current: 'main' });\n\t\t\t\t}}\n\t\t\t/>\n\t\t);\n\t}\n\n\tpublic render() {\n\t\treturn (\n\t\t\t<ThemedProvider style={{ height: '100%', width: '100%' }}>\n\t\t\t\t<Flex\n\t\t\t\t\tjustifyContent=\"space-between\"\n\t\t\t\t\talignItems=\"center\"\n\t\t\t\t\tpaddingTop=\"14px\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\t// Allow window to be dragged from header\n\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\tWebkitAppRegion: 'drag',\n\t\t\t\t\t\tposition: 'relative',\n\t\t\t\t\t\tzIndex: 2,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<Flex width=\"100%\" />\n\t\t\t\t\t<Flex width=\"100%\" alignItems=\"center\" justifyContent=\"center\">\n\t\t\t\t\t\t<EtcherSvg\n\t\t\t\t\t\t\twidth=\"123px\"\n\t\t\t\t\t\t\theight=\"22px\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\topenExternal('https://www.balena.io/etcher?ref=etcher_footer')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttabIndex={100}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Flex>\n\n\t\t\t\t\t<Flex width=\"100%\" alignItems=\"center\" justifyContent=\"flex-end\">\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\ticon={<CogSvg height=\"1em\" fill=\"currentColor\" />}\n\t\t\t\t\t\t\tplain\n\t\t\t\t\t\t\ttabIndex={5}\n\t\t\t\t\t\t\tonClick={() => this.setState({ hideSettings: false })}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t// Make touch events click instead of dragging\n\t\t\t\t\t\t\t\tWebkitAppRegion: 'no-drag',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{!settings.getSync('disableExternalLinks') && (\n\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\ticon={<QuestionCircleSvg height=\"1em\" fill=\"currentColor\" />}\n\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\topenExternal(\n\t\t\t\t\t\t\t\t\t\tselectionState.getImage()?.supportUrl ||\n\t\t\t\t\t\t\t\t\t\t\t'https://github.com/balena-io/etcher/blob/master/docs/SUPPORT.md',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttabIndex={6}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t// Make touch events click instead of dragging\n\t\t\t\t\t\t\t\t\tWebkitAppRegion: 'no-drag',\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Flex>\n\t\t\t\t</Flex>\n\t\t\t\t{this.state.hideSettings ? null : (\n\t\t\t\t\t<SettingsModal\n\t\t\t\t\t\ttoggleModal={(value: boolean) => {\n\t\t\t\t\t\t\tthis.setState({ hideSettings: !value });\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{this.state.current === 'main'\n\t\t\t\t\t? this.renderMain()\n\t\t\t\t\t: this.renderSuccess()}\n\t\t\t</ThemedProvider>\n\t\t);\n\t}\n}\n\nexport default MainPage;\n"
  },
  {
    "path": "lib/gui/app/preload.ts",
    "content": "// See the Electron documentation for details on how to use preload scripts:\n// https://www.electronjs.org/docs/latest/tutorial/process-model#preload-scripts\n\nimport * as webapi from '../webapi';\n\ndeclare global {\n\tinterface Window {\n\t\tetcher: typeof webapi;\n\t}\n}\n\nwindow['etcher'] = webapi;\n"
  },
  {
    "path": "lib/gui/app/renderer.ts",
    "content": "// @ts-nocheck\nimport { main } from './app';\nimport './i18n';\nimport { langParser } from './i18n';\nimport { ipcRenderer } from 'electron';\n\nipcRenderer.send('change-lng', langParser());\n\nmain();\n"
  },
  {
    "path": "lib/gui/app/styled-components.tsx",
    "content": "/*\n * Copyright 2018 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as React from 'react';\nimport type {\n\tFlexProps,\n\tButtonProps,\n\tTableProps as BaseTableProps,\n} from 'rendition';\nimport {\n\tAlert as AlertBase,\n\tFlex,\n\tButton,\n\tModal as ModalBase,\n\tProvider,\n\tTable as BaseTable,\n\tTxt,\n} from 'rendition';\nimport styled, { css } from 'styled-components';\n\nimport { colors, theme } from './theme';\n\nexport const ThemedProvider = (props: any) => (\n\t<Provider theme={theme} {...props}></Provider>\n);\n\nexport const BaseButton = styled(Button)`\n\twidth: 200px;\n\theight: 48px;\n\tfont-size: 16px;\n`;\n\nexport const IconButton = styled((props) => <Button plain {...props} />)`\n\t&&& {\n\t\twidth: 24px;\n\t\theight: 24px;\n\t\tfont-size: 24px;\n\t\tcolor: #fff;\n\n\t\t> svg {\n\t\t\tfont-size: 1em;\n\t\t}\n\t}\n`;\n\nexport const StepButton = styled((props: ButtonProps) => (\n\t<BaseButton {...props}></BaseButton>\n))`\n\tcolor: #ffffff;\n\tfont-size: 14px;\n`;\n\nexport const ChangeButton = styled(Button)`\n\t&& {\n\t\tborder-radius: 24px;\n\t\tcolor: ${colors.primary.background};\n\t\tpadding: 0;\n\t\theight: 18px;\n\t\tfont-size: 14px;\n\n\t\t&:enabled {\n\t\t\t&:hover,\n\t\t\t&:focus,\n\t\t\t&:active {\n\t\t\t\tcolor: #8f9297;\n\t\t\t}\n\t\t}\n\t}\n`;\n\nexport const StepNameButton = styled(BaseButton)`\n\tdisplay: inline-flex;\n\tjustify-content: center;\n\talign-items: center;\n\twidth: 100%;\n\tfont-weight: normal;\n\tcolor: ${colors.dark.foreground};\n\n\t&:enabled {\n\t\t&:hover,\n\t\t&:focus,\n\t\t&:active {\n\t\t\tcolor: #8f9297;\n\t\t}\n\t}\n`;\n\nexport const Footer = styled(Txt)`\n\tmargin-top: 10px;\n\tcolor: ${colors.dark.disabled.foreground};\n\tfont-size: 10px;\n`;\n\nexport const DetailsText = (props: FlexProps) => (\n\t<Flex\n\t\talignItems=\"center\"\n\t\tcolor={colors.dark.disabled.foreground}\n\t\t{...props}\n\t/>\n);\n\nconst modalFooterShadowCss = css`\n\toverflow: auto;\n\tbackground:\n\t\t0,\n\t\tlinear-gradient(rgba(255, 255, 255, 0), white 70%) 0 100%,\n\t\t0,\n\t\tlinear-gradient(rgba(255, 255, 255, 0), rgba(221, 225, 240, 0.5) 70%) 0 100%;\n\tbackground-repeat: no-repeat;\n\tbackground-size:\n\t\t100% 40px,\n\t\t100% 40px,\n\t\t100% 8px,\n\t\t100% 8px;\n\n\tbackground-repeat: no-repeat;\n\tbackground-color: white;\n\tbackground-size:\n\t\t100% 40px,\n\t\t100% 40px,\n\t\t100% 8px,\n\t\t100% 8px;\n\tbackground-attachment: local, local, scroll, scroll;\n`;\n\nexport const Modal = styled(({ style, children, ...props }) => {\n\treturn (\n\t\t<ModalBase\n\t\t\tposition=\"top\"\n\t\t\twidth=\"97vw\"\n\t\t\tcancelButtonProps={{\n\t\t\t\tstyle: {\n\t\t\t\t\tmarginRight: '20px',\n\t\t\t\t\tborder: 'solid 1px #2a506f',\n\t\t\t\t},\n\t\t\t}}\n\t\t\tstyle={{\n\t\t\t\theight: '87.5vh',\n\t\t\t\t...style,\n\t\t\t}}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ScrollableFlex flexDirection=\"column\" width=\"100%\" height=\"90%\">\n\t\t\t\t{children.length ? children.map((c: any) => <>{c}</>) : children}\n\t\t\t</ScrollableFlex>\n\t\t</ModalBase>\n\t);\n})`\n\t> div {\n\t\tpadding: 0;\n\t\theight: 99%;\n\n\t\t> div:first-child {\n\t\t\theight: 81%;\n\t\t\tpadding: 24px 30px 0;\n\t\t}\n\n\t\t> h3 {\n\t\t\tmargin: 0;\n\t\t\tpadding: 24px 30px 0;\n\t\t\theight: 14.3%;\n\t\t}\n\n\t\t> div:first-child {\n\t\t\theight: 81%;\n\t\t\tpadding: 24px 30px 0;\n\t\t}\n\n\t\t> div:nth-child(2) {\n\t\t\theight: 61%;\n\t\t\tpadding: 0 30px;\n\t\t\t${modalFooterShadowCss}\n\t\t}\n\n\t\t> div:last-child {\n\t\t\tmargin: 0;\n\t\t\tflex-direction: ${(props) =>\n\t\t\t\tprops.reverseFooterButtons ? 'row-reverse' : 'row'};\n\t\t\tborder-radius: 0 0 7px 7px;\n\t\t\theight: 80px;\n\t\t\tbackground-color: #fff;\n\t\t\tjustify-content: center;\n\t\t\twidth: 100%;\n\t\t}\n\n\t\t::-webkit-scrollbar {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n`;\n\nexport const ScrollableFlex = styled(Flex)`\n\toverflow: auto;\n\n\t::-webkit-scrollbar {\n\t\tdisplay: none;\n\t}\n\n\t> div > div {\n\t\t/* This is required for the sticky table header in TargetsTable */\n\t\toverflow-x: visible;\n\t}\n`;\n\nexport const Alert = styled((props) => (\n\t<AlertBase warning emphasized {...props}></AlertBase>\n))`\n\tposition: fixed;\n\ttop: -40px;\n\tleft: 50%;\n\ttransform: translate(-50%, 0px);\n\theight: 30px;\n\tmin-width: 50%;\n\tpadding: 0px;\n\tjustify-content: center;\n\talign-items: center;\n\tfont-size: 14px;\n\tbackground-color: #fca321;\n\ttext-align: center;\n\n\t* {\n\t\tcolor: #ffffff;\n\t}\n\n\t> div:first-child {\n\t\tdisplay: none;\n\t}\n`;\n\nexport interface GenericTableProps<T> extends BaseTableProps<T> {\n\trefFn: (t: BaseTable<T>) => void;\n\tdata: T[];\n\tcheckedRowsNumber?: number;\n\tmultipleSelection: boolean;\n\tshowWarnings?: boolean;\n}\n\nfunction GenericTable<T>(\n\tprops: GenericTableProps<T>,\n): React.ReactElement<GenericTableProps<T>> {\n\treturn (\n\t\t<div>\n\t\t\t<BaseTable<T> ref={props.refFn} {...props} />\n\t\t</div>\n\t);\n}\n\nfunction StyledTable<T>() {\n\treturn styled((props: GenericTableProps<T>) => (\n\t\t<GenericTable<T> {...props} />\n\t))`\n\t\t[data-display='table-head']\n\t\t\t> [data-display='table-row']\n\t\t\t> [data-display='table-cell'] {\n\t\t\tposition: sticky;\n\t\t\tbackground-color: #f8f9fd;\n\t\t\ttop: 0;\n\t\t\tz-index: 1;\n\n\t\t\tinput[type='checkbox'] + div {\n\t\t\t\tdisplay: ${(props) => (props.multipleSelection ? 'flex' : 'none')};\n\n\t\t\t\t${(props) =>\n\t\t\t\t\tprops.multipleSelection &&\n\t\t\t\t\tprops.checkedRowsNumber !== 0 &&\n\t\t\t\t\tprops.checkedRowsNumber !== props.data.length\n\t\t\t\t\t\t? `\n\t\t\t\t\t\tfont-weight: 600;\n\t\t\t\t\t\tcolor: ${colors.primary.foreground};\n\t\t\t\t\t\tbackground: ${colors.primary.background};\n\n\t\t\t\t\t\t::after {\n\t\t\t\t\t\t\tcontent: '–';\n\t\t\t\t\t\t}\n\t\t\t\t\t\t`\n\t\t\t\t\t\t: ''}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t[data-display='table-head'] > [data-display='table-row'],\n\t\t[data-display='table-body'] > [data-display='table-row'] {\n\t\t\t> [data-display='table-cell']:first-child {\n\t\t\t\tpadding-left: 15px;\n\t\t\t}\n\n\t\t\t> [data-display='table-cell']:last-child {\n\t\t\t\tpadding-right: 0;\n\t\t\t}\n\t\t}\n\n\t\t[data-display='table-body'] > [data-display='table-row'] {\n\t\t\t&:nth-of-type(2n) {\n\t\t\t\tbackground: transparent;\n\t\t\t}\n\n\t\t\t&[data-highlight='true'] {\n\t\t\t\t&.system {\n\t\t\t\t\tbackground-color: ${(props) => (props.showWarnings ? '#fff5e6' : '#e8f5fc')};\n\t\t\t\t}\n\n\t\t\t\t> [data-display='table-cell']:first-child {\n\t\t\t\t\tbox-shadow: none;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&& [data-display='table-row'] > [data-display='table-cell'] {\n\t\t\tpadding: 6px 8px;\n\t\t\tcolor: #2a506f;\n\t\t}\n\n\t\tinput[type='checkbox'] + div {\n\t\t\tborder-radius: ${(props) => (props.multipleSelection ? '4px' : '50%')};\n\t\t}\n\t`;\n}\n\nexport const Table = <T extends object>(props: GenericTableProps<T>) => {\n\tconst TypedStyledFunctional = StyledTable<T>();\n\treturn <TypedStyledFunctional {...props} />;\n};\n"
  },
  {
    "path": "lib/gui/app/theme.ts",
    "content": "/*\n * Copyright 2018 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"),\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as _ from 'lodash';\nimport { Theme } from 'rendition';\n\nexport const colors = {\n\tdark: {\n\t\tforeground: '#fff',\n\t\tbackground: '#4d5057',\n\t\tsoft: {\n\t\t\tforeground: '#ddd',\n\t\t\tbackground: '#64686a',\n\t\t},\n\t\tdisabled: {\n\t\t\tforeground: '#787c7f',\n\t\t\tbackground: '#3a3c41',\n\t\t},\n\t},\n\tlight: {\n\t\tforeground: '#666',\n\t\tbackground: '#fff',\n\t\tsoft: {\n\t\t\tforeground: '#b3b3b3',\n\t\t},\n\t\tdisabled: {\n\t\t\tforeground: '#787c7f',\n\t\t\tbackground: '#d5d5d5',\n\t\t},\n\t},\n\tdefault: {\n\t\tforeground: '#b3b3b3',\n\t\tbackground: '#ececec',\n\t},\n\tprimary: {\n\t\tforeground: '#fff',\n\t\tbackground: '#00aeef',\n\t},\n\tsecondary: {\n\t\tforeground: '#000',\n\t\tbackground: '#ddd',\n\t\tmain: '#fff',\n\t},\n\twarning: {\n\t\tforeground: '#fff',\n\t\tbackground: '#fca321',\n\t},\n\tdanger: {\n\t\tforeground: '#fff',\n\t\tbackground: '#d9534f',\n\t},\n\tsuccess: {\n\t\tforeground: '#fff',\n\t\tbackground: '#5fb835',\n\t},\n};\n\nconst font = 'SourceSansPro';\n\nexport const theme = _.merge({}, Theme, {\n\tcolors,\n\tfont,\n\theader: {\n\t\theight: '40px',\n\t},\n\tglobal: {\n\t\tfont: {\n\t\t\tfamily: font,\n\t\t\tsize: 16,\n\t\t},\n\t\ttext: {\n\t\t\tmedium: {\n\t\t\t\tsize: 16,\n\t\t\t},\n\t\t},\n\t},\n\tbutton: {\n\t\tborder: {\n\t\t\twidth: '0',\n\t\t\tradius: '24px',\n\t\t},\n\t\tdisabled: {\n\t\t\topacity: 1,\n\t\t},\n\t\textend: () => `\n\t\t\twidth: 200px;\n\t\t\tfont-size: 16px;\n\n\t\t\t&& {\n\t\t\t\twidth: 200px;\n\t\t\t\theight: 48px;\n\t\t\t}\n\n\t\t\t:disabled {\n\t\t\t\tbackground-color: ${colors.dark.disabled.background};\n\t\t\t\tcolor: ${colors.dark.disabled.foreground};\n\t\t\t\topacity: 1;\n\n\t\t\t\t:hover {\n\t\t\t\t\tbackground-color: ${colors.dark.disabled.background};\n\t\t\t\t\tcolor: ${colors.dark.disabled.foreground};\n\t\t\t\t}\n\t\t\t}\n\t\t`,\n\t},\n\tlayer: {\n\t\textend: () => `\n\t\t\t> div:first-child {\n\t\t\t\tbackground-color: transparent;\n\t\t\t}\n\t\t`,\n\t},\n});\n"
  },
  {
    "path": "lib/gui/app/utils/etcher-pro-specific.ts",
    "content": "/*\n * Copyright 2022 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Dictionary } from 'lodash';\n\ntype BalenaTag = {\n\tid: number;\n\tname: string;\n\tvalue: string;\n};\n\nexport class EtcherPro {\n\tprivate supervisorAddr: string;\n\tprivate supervisorKey: string;\n\tprivate tags: Dictionary<string> | undefined;\n\tpublic uuid: string;\n\n\tconstructor(supervisorAddr: string, supervisorKey: string) {\n\t\tthis.supervisorAddr = supervisorAddr;\n\t\tthis.supervisorKey = supervisorKey;\n\t\tthis.uuid = (process.env.BALENA_DEVICE_UUID ?? 'NO-UUID').substring(0, 7);\n\t\tthis.tags = undefined;\n\t\tthis.get_tags().then((tags) => (this.tags = tags));\n\t}\n\n\tasync get_tags(): Promise<Dictionary<string>> {\n\t\tconst result = await fetch(\n\t\t\tthis.supervisorAddr + '/v2/device/tags?apikey=' + this.supervisorKey,\n\t\t);\n\t\tconst parsed = await result.json();\n\t\tif (parsed['status'] === 'success') {\n\t\t\treturn Object.assign(\n\t\t\t\t{},\n\t\t\t\t...parsed['tags'].map((tag: BalenaTag) => {\n\t\t\t\t\treturn { [tag.name]: tag.value };\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\treturn {};\n\t\t}\n\t}\n\n\tpublic get_serial(): string | undefined {\n\t\tif (this.tags) {\n\t\t\treturn this.tags['Serial'];\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n}\n\nexport function etcherProInfo(): EtcherPro | undefined {\n\tconst BALENA_SUPERVISOR_ADDRESS = process.env.BALENA_SUPERVISOR_ADDRESS;\n\tconst BALENA_SUPERVISOR_API_KEY = process.env.BALENA_SUPERVISOR_API_KEY;\n\n\tif (BALENA_SUPERVISOR_ADDRESS && BALENA_SUPERVISOR_API_KEY) {\n\t\treturn new EtcherPro(BALENA_SUPERVISOR_ADDRESS, BALENA_SUPERVISOR_API_KEY);\n\t}\n\treturn undefined;\n}\n"
  },
  {
    "path": "lib/gui/app/utils/middle-ellipsis.ts",
    "content": "/*\n * Copyright 2016 Juan Cruz Viotti. https://github.com/jviotti\n * Copyright 2018 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @summary Truncate text from the middle with an ellipsis\n */\nexport function middleEllipsis(input: string, limit: number): string {\n\t// We can't provide a 100% expected result if the limit is less than 3. For example:\n\t//\n\t// If the limit == 2:\n\t//   Should we display the first at last character without an ellipses in the middle?\n\t//   Should we display just one character and an ellipses before or after?\n\t//   Should we display nothing at all?\n\t//\n\t// If the limit == 1:\n\t//   Should we display just one character?\n\t//   Should we display just an ellipses?\n\t//   Should we display nothing at all?\n\t//\n\t// Etc.\n\tif (limit < 3) {\n\t\tthrow new Error('middleEllipsis: Limit should be at least 3');\n\t}\n\n\t// Do nothing, the string doesn't need truncation.\n\tif (input.length <= limit) {\n\t\treturn input;\n\t}\n\n\tconst lengthOfTheSidesAfterTruncation = Math.floor((limit - 1) / 2);\n\tconst finalLeftPart = input.slice(0, lengthOfTheSidesAfterTruncation);\n\tconst finalRightPart = input.slice(\n\t\tinput.length - lengthOfTheSidesAfterTruncation,\n\t);\n\n\treturn finalLeftPart + '…' + finalRightPart;\n}\n"
  },
  {
    "path": "lib/gui/etcher.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// This allows TypeScript to pick up the magic constants that's auto-generated by Forge's Webpack\n// plugin that tells the Electron app where to look for the Webpack-bundled app code (depending on\n// whether you're running in development or production).\ndeclare const MAIN_WINDOW_WEBPACK_ENTRY: string;\ndeclare const MAIN_WINDOW_PRELOAD_WEBPACK_ENTRY: string;\n\nimport * as electron from 'electron';\nimport * as remoteMain from '@electron/remote/main';\nimport { autoUpdater } from 'electron-updater';\nimport { promises as fs } from 'fs';\nimport { platform } from 'os';\nimport * as path from 'path';\nimport * as semver from 'semver';\nimport { once } from 'lodash';\n\nimport './app/i18n';\n\nimport { packageType, version } from '../../package.json';\nimport * as EXIT_CODES from '../shared/exit-codes';\nimport * as settings from './app/models/settings';\nimport { buildWindowMenu } from './menu';\nimport * as i18n from 'i18next';\nimport * as SentryMain from '@sentry/electron/main';\nimport { anonymizeSentryData } from './app/modules/analytics';\n\nimport { delay } from '../shared/utils';\n\nconst customProtocol = 'etcher';\nconst scheme = `${customProtocol}://`;\nconst updatablePackageTypes = ['appimage', 'nsis', 'dmg'];\nconst packageUpdatable = updatablePackageTypes.includes(packageType);\nlet packageUpdated = false;\nlet mainWindow: any = null;\n\nremoteMain.initialize();\n\nasync function checkForUpdates(interval: number) {\n\t// We use a while loop instead of a setInterval to preserve\n\t// async execution time between each function call\n\twhile (!packageUpdated) {\n\t\tif (await settings.get('updatesEnabled')) {\n\t\t\ttry {\n\t\t\t\tconst release = await autoUpdater.checkForUpdates();\n\t\t\t\tconst isOutdated =\n\t\t\t\t\tsemver.compare(release!.updateInfo.version, version) > 0;\n\t\t\t\tconst shouldUpdate = release!.updateInfo.stagingPercentage !== 0; // undefined (default) means 100%\n\t\t\t\tif (shouldUpdate && isOutdated) {\n\t\t\t\t\tawait autoUpdater.downloadUpdate();\n\t\t\t\t\tpackageUpdated = true;\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tlogMainProcessException(err);\n\t\t\t}\n\t\t}\n\t\tawait delay(interval);\n\t}\n}\n\nfunction logMainProcessException(error: any) {\n\tconst shouldReportErrors = settings.getSync('errorReporting');\n\tconsole.error(error);\n\tif (shouldReportErrors) {\n\t\tSentryMain.captureException(error);\n\t}\n}\n\nasync function isFile(filePath: string): Promise<boolean> {\n\ttry {\n\t\tconst stat = await fs.stat(filePath);\n\t\treturn stat.isFile();\n\t} catch {\n\t\t// noop\n\t}\n\treturn false;\n}\n\nasync function getCommandLineURL(argv: string[]): Promise<string | undefined> {\n\targv = argv.slice(electron.app.isPackaged ? 1 : 2);\n\tif (argv.length) {\n\t\tconst value = argv[argv.length - 1];\n\t\t// Take into account electron arguments\n\t\tif (value.startsWith('--')) {\n\t\t\treturn;\n\t\t}\n\t\t// https://stackoverflow.com/questions/10242115/os-x-strange-psn-command-line-parameter-when-launched-from-finder\n\t\tif (platform() === 'darwin' && value.startsWith('-psn_')) {\n\t\t\treturn;\n\t\t}\n\t\tif (\n\t\t\t!value.startsWith('http://') &&\n\t\t\t!value.startsWith('https://') &&\n\t\t\t!value.startsWith(scheme) &&\n\t\t\t!(await isFile(value))\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\treturn value;\n\t}\n}\n\nconst initSentryMain = once(() => {\n\tconst dsn =\n\t\tsettings.getSync('analyticsSentryToken') || process.env.SENTRY_TOKEN;\n\n\tSentryMain.init({\n\t\tdsn,\n\t\tbeforeSend: anonymizeSentryData,\n\t\tdebug: process.env.ETCHER_SENTRY_DEBUG === 'true',\n\t});\n});\n\nconst sourceSelectorReady = new Promise((resolve) => {\n\telectron.ipcMain.on('source-selector-ready', resolve);\n});\n\nasync function selectImageURL(url?: string) {\n\t// 'data:,' is the default chromedriver url that is passed as last argument when running spectron tests\n\tif (url !== undefined && url !== 'data:,') {\n\t\turl = url.replace(/\\/$/, ''); // on windows the url ends with an extra slash\n\t\turl = url.startsWith(scheme) ? url.slice(scheme.length) : url;\n\t\tawait sourceSelectorReady;\n\t\telectron.BrowserWindow.getAllWindows().forEach((window) => {\n\t\t\twindow.webContents.send('select-image', url);\n\t\t});\n\t}\n}\n\n// This will catch clicks on links such as <a href=\"etcher://...\">Open in Etcher</a>\n// We need to listen to the event before everything else otherwise the event won't be fired\nelectron.app.on('open-url', async (event, data) => {\n\tevent.preventDefault();\n\tawait selectImageURL(data);\n});\n\nasync function createMainWindow() {\n\tconst fullscreen = Boolean(await settings.get('fullscreen'));\n\tconst defaultWidth = settings.DEFAULT_WIDTH;\n\tconst defaultHeight = settings.DEFAULT_HEIGHT;\n\tlet width = defaultWidth;\n\tlet height = defaultHeight;\n\tif (fullscreen) {\n\t\t({ width, height } = electron.screen.getPrimaryDisplay().bounds);\n\t}\n\tmainWindow = new electron.BrowserWindow({\n\t\twidth,\n\t\theight,\n\t\tframe: !fullscreen,\n\t\tuseContentSize: true,\n\t\tshow: false,\n\t\tresizable: false,\n\t\tmaximizable: false,\n\t\tfullscreen,\n\t\tfullscreenable: fullscreen,\n\t\tkiosk: fullscreen,\n\t\tautoHideMenuBar: true,\n\t\ttitleBarStyle: 'hiddenInset',\n\t\ticon: path.join(__dirname, 'media', 'icon.png'),\n\t\tdarkTheme: true,\n\t\twebPreferences: {\n\t\t\tbackgroundThrottling: false,\n\t\t\tnodeIntegration: true,\n\t\t\tcontextIsolation: false,\n\t\t\twebviewTag: true,\n\t\t\tzoomFactor: width / defaultWidth,\n\t\t\tpreload: MAIN_WINDOW_PRELOAD_WEBPACK_ENTRY,\n\t\t},\n\t});\n\n\telectron.app.setAsDefaultProtocolClient(customProtocol);\n\n\t// mainWindow.setFullScreen(true);\n\n\t// Prevent flash of white when starting the application\n\tmainWindow.once('ready-to-show', () => {\n\t\tconsole.timeEnd('ready-to-show');\n\t\t// Electron sometimes caches the zoomFactor\n\t\t// making it obnoxious to switch back-and-forth\n\t\tmainWindow.webContents.setZoomFactor(width / defaultWidth);\n\t\tmainWindow.show();\n\t});\n\n\t// Prevent external resources from being loaded (like images)\n\t// when dropping them on the WebView.\n\t// See https://github.com/electron/electron/issues/5919\n\tmainWindow.webContents.on('will-navigate', (event: any) => {\n\t\tevent.preventDefault();\n\t});\n\n\tmainWindow.loadURL(MAIN_WINDOW_WEBPACK_ENTRY);\n\n\tconst page = mainWindow.webContents;\n\tremoteMain.enable(page);\n\n\tpage.once('did-frame-finish-load', async () => {\n\t\tconsole.log('packageUpdatable', packageUpdatable);\n\t\tautoUpdater.on('error', (err) => {\n\t\t\tlogMainProcessException(err);\n\t\t});\n\t\tif (packageUpdatable) {\n\t\t\ttry {\n\t\t\t\tconst checkForUpdatesTimer = 300000;\n\t\t\t\tcheckForUpdates(checkForUpdatesTimer);\n\t\t\t} catch (err) {\n\t\t\t\tlogMainProcessException(err);\n\t\t\t}\n\t\t}\n\t});\n\n\treturn mainWindow;\n}\n\nelectron.app.on('window-all-closed', electron.app.quit);\n\n// Sending a `SIGINT` (e.g: Ctrl-C) to an Electron app that registers\n// a `beforeunload` window event handler results in a disconnected white\n// browser window in GNU/Linux and macOS.\n// The `before-quit` Electron event is triggered in `SIGINT`, so we can\n// make use of it to ensure the browser window is completely destroyed.\n// See https://github.com/electron/electron/issues/5273\nelectron.app.on('before-quit', () => {\n\telectron.app.releaseSingleInstanceLock();\n\tprocess.exit(EXIT_CODES.SUCCESS);\n});\n\n// this is replaced at build-time with the path to helper binary,\n// relative to the app resources directory.\ndeclare const ETCHER_UTIL_BIN_PATH: string;\n\nelectron.ipcMain.handle('get-util-path', () => {\n\tif (process.env.NODE_ENV === 'development') {\n\t\t// In development there is no \"app bundle\" and we're working directly with\n\t\t// artifacts from the \"out\" directory, where this value point to.\n\t\treturn ETCHER_UTIL_BIN_PATH;\n\t}\n\t// In any other case, resolve the helper relative to resources path.\n\treturn path.resolve(process.resourcesPath, ETCHER_UTIL_BIN_PATH);\n});\n\nasync function main(): Promise<void> {\n\tif (!electron.app.requestSingleInstanceLock()) {\n\t\telectron.app.quit();\n\t} else {\n\t\tinitSentryMain();\n\t\tawait electron.app.whenReady();\n\t\tconst window = await createMainWindow();\n\t\telectron.app.on('second-instance', async (_event, argv) => {\n\t\t\tif (window.isMinimized()) {\n\t\t\t\twindow.restore();\n\t\t\t}\n\t\t\twindow.focus();\n\t\t\tawait selectImageURL(await getCommandLineURL(argv));\n\t\t});\n\t\tawait selectImageURL(await getCommandLineURL(process.argv));\n\n\t\telectron.ipcMain.on('change-lng', function (event, args) {\n\t\t\ti18n.changeLanguage(args, () => {\n\t\t\t\tconsole.log('Language changed to: ' + args);\n\t\t\t});\n\t\t\tif (mainWindow != null) {\n\t\t\t\tbuildWindowMenu(mainWindow);\n\t\t\t} else {\n\t\t\t\tconsole.log('Build menu failed. ');\n\t\t\t}\n\t\t});\n\n\t\telectron.ipcMain.on('webview-dom-ready', (_, id) => {\n\t\t\tconst webview = electron.webContents.fromId(id);\n\n\t\t\t// Open link in browser if it's opened as a 'foreground-tab'\n\t\t\twebview!.setWindowOpenHandler((event) => {\n\t\t\t\tconst url = new URL(event.url);\n\t\t\t\tif (\n\t\t\t\t\t(url.protocol === 'http:' || url.protocol === 'https:') &&\n\t\t\t\t\tevent.disposition === 'foreground-tab' &&\n\t\t\t\t\t// Don't open links if they're disabled by the env var\n\t\t\t\t\t!settings.getSync('disableExternalLinks')\n\t\t\t\t) {\n\t\t\t\t\telectron.shell.openExternal(url.href);\n\t\t\t\t}\n\t\t\t\treturn { action: 'deny' };\n\t\t\t});\n\t\t});\n\t}\n}\n\n// Handle creating/removing shortcuts on Windows when installing/uninstalling.\n// tslint:disable-next-line:no-var-requires\nif (require('electron-squirrel-startup')) {\n\telectron.app.quit();\n}\n\nmain();\n\nconsole.time('ready-to-show');\n"
  },
  {
    "path": "lib/gui/menu.ts",
    "content": "/*\n * Copyright 2017 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as electron from 'electron';\nimport { displayName } from '../../package.json';\n\nimport * as i18next from 'i18next';\n\n/**\n * @summary Builds a native application menu for a given window\n */\nexport function buildWindowMenu(window: electron.BrowserWindow) {\n\t/**\n\t * @summary Toggle the main window's devtools\n\t */\n\tfunction toggleDevTools() {\n\t\tif (!window) {\n\t\t\treturn;\n\t\t}\n\t\t// NOTE: We can't use `webContents.toggleDevTools()` here,\n\t\t// as we need to force detached mode\n\t\tif (window.webContents.isDevToolsOpened()) {\n\t\t\twindow.webContents.closeDevTools();\n\t\t} else {\n\t\t\twindow.webContents.openDevTools({\n\t\t\t\tmode: 'detach',\n\t\t\t});\n\t\t}\n\t}\n\n\tconst menuTemplate: electron.MenuItemConstructorOptions[] = [\n\t\t{\n\t\t\trole: 'editMenu',\n\t\t\tlabel: i18next.t('menu.edit'),\n\t\t},\n\t\t{\n\t\t\tlabel: i18next.t('menu.view'),\n\t\t\tsubmenu: [\n\t\t\t\t{\n\t\t\t\t\tlabel: i18next.t('menu.devTool'),\n\t\t\t\t\taccelerator:\n\t\t\t\t\t\tprocess.platform === 'darwin' ? 'Command+Alt+I' : 'Control+Shift+I',\n\t\t\t\t\tclick: toggleDevTools,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\trole: 'windowMenu',\n\t\t\tlabel: i18next.t('menu.window'),\n\t\t},\n\t\t{\n\t\t\trole: 'help',\n\t\t\tlabel: i18next.t('menu.help'),\n\t\t\tsubmenu: [\n\t\t\t\t{\n\t\t\t\t\tlabel: i18next.t('menu.pro'),\n\t\t\t\t\tclick() {\n\t\t\t\t\t\telectron.shell.openExternal(\n\t\t\t\t\t\t\t'https://etcher.io/pro?utm_source=etcher_menu&ref=etcher_menu',\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: i18next.t('menu.website'),\n\t\t\t\t\tclick() {\n\t\t\t\t\t\telectron.shell.openExternal('https://etcher.io?ref=etcher_menu');\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: i18next.t('menu.issue'),\n\t\t\t\t\tclick() {\n\t\t\t\t\t\telectron.shell.openExternal(\n\t\t\t\t\t\t\t'https://github.com/balena-io/etcher/issues',\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t];\n\n\tif (process.platform === 'darwin') {\n\t\tmenuTemplate.unshift({\n\t\t\tlabel: displayName,\n\t\t\tsubmenu: [\n\t\t\t\t{\n\t\t\t\t\trole: 'about' as const,\n\t\t\t\t\tlabel: i18next.t('menu.about'),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: 'separator' as const,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\trole: 'hide' as const,\n\t\t\t\t\tlabel: i18next.t('menu.hide'),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\trole: 'hideOthers' as const,\n\t\t\t\t\tlabel: i18next.t('menu.hideOthers'),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\trole: 'unhide' as const,\n\t\t\t\t\tlabel: i18next.t('menu.unhide'),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: 'separator' as const,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\trole: 'quit' as const,\n\t\t\t\t\tlabel: i18next.t('menu.quit'),\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\t} else {\n\t\tmenuTemplate.unshift({\n\t\t\tlabel: displayName,\n\t\t\tsubmenu: [\n\t\t\t\t{\n\t\t\t\t\trole: 'quit',\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\t}\n\n\tconst menu = electron.Menu.buildFromTemplate(menuTemplate);\n\n\telectron.Menu.setApplicationMenu(menu);\n}\n"
  },
  {
    "path": "lib/gui/webapi.ts",
    "content": "//\n// Anything exported from this module will become available to the\n// renderer process via preload. They're accessible as `window.etcher.foo()`.\n//\n\nimport { ipcRenderer } from 'electron';\n\n// FIXME: this is a workaround for the renderer to be able to find the etcher-util\n// binary. We should instead export a function that asks the main process to launch\n// the binary itself.\nexport async function getEtcherUtilPath(): Promise<string> {\n\tconst utilPath = await ipcRenderer.invoke('get-util-path');\n\tconsole.log(utilPath);\n\treturn utilPath;\n}\n"
  },
  {
    "path": "lib/shared/drive-constraints.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Drive } from 'drivelist';\nimport { isNil } from 'lodash';\nimport * as pathIsInside from 'path-is-inside';\n\nimport * as messages from './messages';\nimport type { SourceMetadata } from './typings/source-selector';\n\n/**\n * @summary The default unknown size for things such as images and drives\n */\nconst UNKNOWN_SIZE = 0;\n\nexport type DrivelistDrive = Drive & {\n\tdisabled: boolean;\n\tname: string;\n\tpath: string;\n\tlogo: string;\n\tdisplayName: string;\n};\n\n/**\n * @summary Check if a drive is a system drive\n */\nexport function isSystemDrive(drive: DrivelistDrive): boolean {\n\treturn Boolean(drive.isSystem);\n}\n\nfunction sourceIsInsideDrive(source: string, drive: DrivelistDrive) {\n\tfor (const mountpoint of drive.mountpoints || []) {\n\t\tif (pathIsInside(source, mountpoint.path)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * @summary Check if a drive is source drive\n *\n * @description\n * In the context of Etcher, a source drive is a drive\n * containing the image.\n */\nexport function isSourceDrive(\n\tdrive: DrivelistDrive,\n\tselection?: SourceMetadata,\n): boolean {\n\tif (selection) {\n\t\tif (selection.drive) {\n\t\t\treturn selection.drive.device === drive.device;\n\t\t}\n\t\tif (selection.path) {\n\t\t\treturn sourceIsInsideDrive(selection.path, drive);\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * @summary Check if a drive is large enough for an image\n */\nexport function isDriveLargeEnough(\n\tdrive: DrivelistDrive,\n\timage?: SourceMetadata,\n): boolean {\n\tconst driveSize = drive.size || UNKNOWN_SIZE;\n\n\tif (image === undefined) {\n\t\treturn true;\n\t}\n\n\tif (image.isSizeEstimated) {\n\t\t// If the drive size is smaller than the original image size, and\n\t\t// the final image size is just an estimation, then we stop right\n\t\t// here, based on the assumption that the final size will never\n\t\t// be less than the original size.\n\t\tif (driveSize < (image.compressedSize || UNKNOWN_SIZE)) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If the final image size is just an estimation then consider it\n\t\t// large enough. In the worst case, the user gets an error saying\n\t\t// the drive has ran out of space, instead of prohibiting the flash\n\t\t// at all, when the estimation may be wrong.\n\t\treturn true;\n\t}\n\n\treturn driveSize >= (image.size || UNKNOWN_SIZE);\n}\n\n/**\n * @summary Check if a drive is valid, i.e. large enough for an image\n */\nexport function isDriveValid(\n\tdrive: DrivelistDrive,\n\timage?: SourceMetadata,\n\twrite: boolean = true,\n): boolean {\n\treturn (\n\t\t!write ||\n\t\t(!drive.disabled &&\n\t\t\tisDriveLargeEnough(drive, image) &&\n\t\t\t!isSourceDrive(drive, image as SourceMetadata))\n\t);\n}\n\n/**\n * @summary Check if a drive meets the recommended drive size suggestion\n *\n * @description\n * If the image doesn't have a recommended size, this function returns true.\n */\nexport function isDriveSizeRecommended(\n\tdrive: DrivelistDrive,\n\timage?: SourceMetadata,\n): boolean {\n\tconst driveSize = drive.size || UNKNOWN_SIZE;\n\treturn driveSize >= (image?.recommendedDriveSize || UNKNOWN_SIZE);\n}\n\n/**\n * @summary 128GB\n */\nexport const LARGE_DRIVE_SIZE = 128e9;\n\n/**\n * @summary Check whether a drive's size is 'large'\n */\nexport function isDriveSizeLarge(drive: DrivelistDrive): boolean {\n\tconst driveSize = drive.size || UNKNOWN_SIZE;\n\treturn driveSize > LARGE_DRIVE_SIZE;\n}\n\n/**\n * @summary Drive/image compatibility status types.\n *\n * @description\n * Status types classifying what kind of message it is, i.e. error, warning.\n */\nexport const COMPATIBILITY_STATUS_TYPES = {\n\tWARNING: 1,\n\tERROR: 2,\n};\n\nexport const statuses = {\n\tlocked: {\n\t\ttype: COMPATIBILITY_STATUS_TYPES.ERROR,\n\t\tmessage: messages.compatibility.locked(),\n\t},\n\tsystem: {\n\t\ttype: COMPATIBILITY_STATUS_TYPES.WARNING,\n\t\tmessage: messages.compatibility.system(),\n\t},\n\tcontainsImage: {\n\t\ttype: COMPATIBILITY_STATUS_TYPES.ERROR,\n\t\tmessage: messages.compatibility.containsImage(),\n\t},\n\tlarge: {\n\t\ttype: COMPATIBILITY_STATUS_TYPES.WARNING,\n\t\tmessage: messages.compatibility.largeDrive(),\n\t},\n\tsmall: {\n\t\ttype: COMPATIBILITY_STATUS_TYPES.ERROR,\n\t\tmessage: messages.compatibility.tooSmall(),\n\t},\n\tsizeNotRecommended: {\n\t\ttype: COMPATIBILITY_STATUS_TYPES.WARNING,\n\t\tmessage: messages.compatibility.sizeNotRecommended(),\n\t},\n};\n\n/**\n * @summary Get drive/image compatibility in an object\n *\n * @description\n * Given an image and a drive, return their compatibility status object\n * containing the status type (ERROR, WARNING), and accompanying\n * status message.\n *\n * @returns {Object[]} list of compatibility status objects\n */\nexport function getDriveImageCompatibilityStatuses(\n\tdrive: DrivelistDrive,\n\timage: SourceMetadata | undefined,\n\twrite: boolean,\n) {\n\tconst statusList = [];\n\n\t// Mind the order of the if-statements if you modify.\n\tif (drive.isReadOnly && write) {\n\t\tstatusList.push({\n\t\t\ttype: COMPATIBILITY_STATUS_TYPES.ERROR,\n\t\t\tmessage: messages.compatibility.locked(),\n\t\t});\n\t}\n\tif (\n\t\t!isNil(drive) &&\n\t\t!isNil(drive.size) &&\n\t\t!isDriveLargeEnough(drive, image)\n\t) {\n\t\tstatusList.push(statuses.small);\n\t} else {\n\t\t// Avoid showing \"large drive\" with \"system drive\" status\n\t\tif (isSystemDrive(drive)) {\n\t\t\tstatusList.push(statuses.system);\n\t\t} else if (isDriveSizeLarge(drive)) {\n\t\t\tstatusList.push(statuses.large);\n\t\t}\n\n\t\tif (isSourceDrive(drive, image as SourceMetadata)) {\n\t\t\tstatusList.push(statuses.containsImage);\n\t\t}\n\n\t\tif (\n\t\t\timage !== undefined &&\n\t\t\t!isNil(drive) &&\n\t\t\t!isDriveSizeRecommended(drive, image)\n\t\t) {\n\t\t\tstatusList.push(statuses.sizeNotRecommended);\n\t\t}\n\t}\n\n\treturn statusList;\n}\n\n/**\n * @summary Get drive/image compatibility status for many drives\n *\n * @description\n * Given an image and a list of drives, return all compatibility status objects,\n * containing the status type (ERROR, WARNING), and accompanying status message.\n */\nexport function getListDriveImageCompatibilityStatuses(\n\tdrives: DrivelistDrive[],\n\timage: SourceMetadata | undefined,\n\twrite: boolean,\n) {\n\treturn drives.flatMap((drive) => {\n\t\treturn getDriveImageCompatibilityStatuses(drive, image, write);\n\t});\n}\n\n/**\n * @summary Does the drive/image pair have at least one compatibility status?\n *\n * @description\n * Given an image and a drive, return whether they have a connected compatibility status object.\n */\nexport function hasDriveImageCompatibilityStatus(\n\tdrive: DrivelistDrive,\n\timage: SourceMetadata | undefined,\n\twrite: boolean,\n) {\n\treturn Boolean(\n\t\tgetDriveImageCompatibilityStatuses(drive, image, write).length,\n\t);\n}\n\nexport interface DriveStatus {\n\tmessage: string;\n\ttype: number;\n}\n"
  },
  {
    "path": "lib/shared/errors.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport type ErrorWithPath = Error & {\n\tpath?: string;\n\tcode?: keyof typeof HUMAN_FRIENDLY;\n};\n\n/**\n * @summary Human-friendly error messages\n */\nexport const HUMAN_FRIENDLY = {\n\tENOENT: {\n\t\ttitle: (error: ErrorWithPath) => {\n\t\t\treturn `No such file or directory: ${error.path}`;\n\t\t},\n\t\tdescription: () => \"The file you're trying to access doesn't exist\",\n\t},\n\tEPERM: {\n\t\ttitle: () => \"You're not authorized to perform this operation\",\n\t\tdescription: () =>\n\t\t\t'Please ensure you have necessary permissions for this task',\n\t},\n\tEACCES: {\n\t\ttitle: () => \"You don't have access to this resource\",\n\t\tdescription: () =>\n\t\t\t'Please ensure you have necessary permissions to access this resource',\n\t},\n\tENOMEM: {\n\t\ttitle: () => 'Your system ran out of memory',\n\t\tdescription: () =>\n\t\t\t'Please make sure your system has enough available memory for this task',\n\t},\n} as const;\n\n/**\n * @summary Get user friendly property from an error\n *\n * @example\n * const error = new Error('My error');\n * error.code = 'ENOMEM';\n *\n * const friendlyDescription = getUserFriendlyMessageProperty(error, 'description');\n *\n * if (friendlyDescription) {\n *   console.log(friendlyDescription);\n * }\n */\nfunction getUserFriendlyMessageProperty(\n\terror: ErrorWithPath,\n\tproperty: 'title' | 'description',\n): string | undefined {\n\tif (typeof error.code !== 'string') {\n\t\treturn undefined;\n\t}\n\treturn HUMAN_FRIENDLY[error.code]?.[property]?.(error);\n}\n\nfunction isBlank(s: string | number | null | undefined) {\n\tif (typeof s === 'number') {\n\t\ts = s.toString();\n\t}\n\treturn (s ?? '').trim() === '';\n}\n\n/**\n * @summary Get the title of an error\n *\n * @description\n * Try to get as much information as possible about the error\n * rather than falling back to generic messages right away.\n */\nexport function getTitle(error: ErrorWithPath): string {\n\tconst codeTitle = getUserFriendlyMessageProperty(error, 'title');\n\tif (codeTitle !== undefined) {\n\t\treturn codeTitle;\n\t}\n\n\tconst message = error.message;\n\tif (!isBlank(message)) {\n\t\treturn message;\n\t}\n\n\tconst code = error.code;\n\tif (!isBlank(code)) {\n\t\treturn `Error code: ${code}`;\n\t}\n\n\treturn 'An error ocurred';\n}\n\n/**\n * @summary Get the description of an error\n */\nexport function getDescription(\n\terror: ErrorWithPath & { description?: string },\n): string {\n\tif (!isBlank(error.description)) {\n\t\treturn error.description as string;\n\t}\n\tconst codeDescription = getUserFriendlyMessageProperty(error, 'description');\n\tif (codeDescription !== undefined) {\n\t\treturn codeDescription;\n\t}\n\tif (error.stack) {\n\t\treturn error.stack;\n\t}\n\treturn JSON.stringify(error, null, 2);\n}\n\n/**\n * @summary Create an error\n */\nexport function createError(options: {\n\ttitle: string;\n\tdescription?: string;\n\treport?: boolean;\n\tcode?: keyof typeof HUMAN_FRIENDLY;\n}): ErrorWithPath & { description?: string; report?: boolean } {\n\tif (isBlank(options.title)) {\n\t\tthrow new Error(`Invalid error title: ${options.title}`);\n\t}\n\n\tconst error: ErrorWithPath & {\n\t\tdescription?: string;\n\t\treport?: boolean;\n\t\tcode?: string;\n\t} = new Error(options.title);\n\terror.description = options.description;\n\n\tif (options.report === false) {\n\t\terror.report = false;\n\t}\n\n\tif (options.code !== undefined) {\n\t\terror.code = options.code;\n\t}\n\n\treturn error;\n}\n\n/**\n * @summary Create a user error\n *\n * @description\n * User errors represent invalid states that the user\n * caused, that are not errors on the application itself.\n * Therefore, user errors don't get reported to analytics\n * and error reporting services.\n */\nexport function createUserError(options: {\n\ttitle: string;\n\tdescription: string;\n\tcode?: keyof typeof HUMAN_FRIENDLY;\n}): Error {\n\treturn createError({\n\t\ttitle: options.title,\n\t\tdescription: options.description,\n\t\treport: false,\n\t\tcode: options.code,\n\t});\n}\n\n/**\n * @summary Convert an Error object to a JSON object\n * @function\n * @public\n *\n * @param {Error} error - error object\n * @returns {Object} json error\n *\n * @example\n * const error = errors.toJSON(new Error('foo'))\n *\n * console.log(error.message);\n * > 'foo'\n */\nexport function toJSON(\n\terror: Error & {\n\t\tdescription?: string;\n\t\treport?: boolean;\n\t\tcode?: string;\n\t\tsyscall?: string;\n\t\terrno?: number;\n\t\tstdout?: string;\n\t\tstderr?: string;\n\t\tdevice?: string;\n\t},\n): any {\n\treturn {\n\t\tname: error.name,\n\t\tmessage: error.message,\n\t\tdescription: error.description,\n\t\tstack: error.stack,\n\t\treport: error.report,\n\t\tcode: error.code,\n\t\tsyscall: error.syscall,\n\t\terrno: error.errno,\n\t\tstdout: error.stdout,\n\t\tstderr: error.stderr,\n\t\tdevice: error.device,\n\t};\n}\n\n/**\n * @summary Convert a JSON object to an Error object\n */\nexport function fromJSON(json: any): Error {\n\treturn Object.assign(new Error(json.message), json);\n}\n"
  },
  {
    "path": "lib/shared/exit-codes.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const SUCCESS = 0;\nexport const GENERAL_ERROR = 1;\nexport const VALIDATION_ERROR = 2;\nexport const CANCELLED = 3;\n"
  },
  {
    "path": "lib/shared/messages.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Dictionary } from 'lodash';\nimport { outdent } from 'outdent';\nimport prettyBytes from 'pretty-bytes';\nimport '../gui/app/i18n';\nimport * as i18next from 'i18next';\n\nexport const progress: Dictionary<(quantity: number) => string> = {\n\tsuccessful: (quantity: number) => {\n\t\treturn i18next.t('message.flashSucceed', { count: quantity });\n\t},\n\n\tfailed: (quantity: number) => {\n\t\treturn i18next.t('message.flashFail', { count: quantity });\n\t},\n};\n\nexport const info = {\n\tflashComplete: (\n\t\timageBasename: string,\n\t\t[drive]: [{ description: string; displayName: string }],\n\t\t{ failed, successful }: { failed: number; successful: number },\n\t) => {\n\t\tconst targets = [];\n\t\tif (failed + successful === 1) {\n\t\t\ttargets.push(\n\t\t\t\ti18next.t('message.toDrive', {\n\t\t\t\t\tdescription: drive.description,\n\t\t\t\t\tname: drive.displayName,\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tif (successful) {\n\t\t\t\ttargets.push(\n\t\t\t\t\ti18next.t('message.toTarget', {\n\t\t\t\t\t\tcount: successful,\n\t\t\t\t\t\tnum: successful,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (failed) {\n\t\t\t\ttargets.push(\n\t\t\t\t\ti18next.t('message.andFailTarget', { count: failed, num: failed }),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn i18next.t('message.succeedTo', {\n\t\t\tname: imageBasename,\n\t\t\ttarget: targets.join(' '),\n\t\t});\n\t},\n};\n\nexport const compatibility = {\n\tsizeNotRecommended: () => {\n\t\treturn i18next.t('message.sizeNotRecommended');\n\t},\n\n\ttooSmall: () => {\n\t\treturn i18next.t('message.tooSmall');\n\t},\n\n\tlocked: () => {\n\t\treturn i18next.t('message.locked');\n\t},\n\n\tsystem: () => {\n\t\treturn i18next.t('message.system');\n\t},\n\n\tcontainsImage: () => {\n\t\treturn i18next.t('message.containsImage');\n\t},\n\n\t// The drive is large and therefore likely not a medium you want to write to.\n\tlargeDrive: () => {\n\t\treturn i18next.t('message.largeDrive');\n\t},\n} as const;\n\nexport const warning = {\n\ttooSmall: (source: { size: number }, target: { size: number }) => {\n\t\treturn outdent({ newline: ' ' })`\n\t\t\t ${i18next.t('message.sourceLarger', {\n\t\t\t\t\tbyte: prettyBytes(source.size - target.size),\n\t\t\t\t})}\n\t\t`;\n\t},\n\n\texitWhileFlashing: () => {\n\t\treturn i18next.t('message.exitWhileFlashing');\n\t},\n\n\tlooksLikeWindowsImage: () => {\n\t\treturn i18next.t('message.looksLikeWindowsImage');\n\t},\n\n\tmissingPartitionTable: () => {\n\t\treturn i18next.t('message.missingPartitionTable', {\n\t\t\ttype: i18next.t('message.image'),\n\t\t});\n\t},\n\n\tdriveMissingPartitionTable: () => {\n\t\treturn i18next.t('message.missingPartitionTable', {\n\t\t\ttype: i18next.t('message.drive'),\n\t\t});\n\t},\n\n\tlargeDriveSize: () => {\n\t\treturn i18next.t('message.largeDriveSize');\n\t},\n\n\tsystemDrive: () => {\n\t\treturn i18next.t('message.systemDrive');\n\t},\n\n\tsourceDrive: () => {\n\t\treturn i18next.t('message.sourceDrive');\n\t},\n};\n\nexport const error = {\n\tnotEnoughSpaceInDrive: () => {\n\t\treturn i18next.t('message.noSpace');\n\t},\n\n\tgenericFlashError: (err: Error) => {\n\t\treturn i18next.t('message.genericFlashError', { error: err.message });\n\t},\n\n\tvalidation: () => {\n\t\treturn i18next.t('message.validation');\n\t},\n\n\topenSource: (sourceName: string, errorMessage: string) => {\n\t\treturn i18next.t('message.openError', {\n\t\t\tsource: sourceName,\n\t\t\terror: errorMessage,\n\t\t});\n\t},\n\n\tflashFailure: (\n\t\timageBasename: string,\n\t\tdrives: Array<{ description: string; displayName: string }>,\n\t) => {\n\t\tconst target =\n\t\t\tdrives.length === 1\n\t\t\t\t? i18next.t('message.toDrive', {\n\t\t\t\t\t\tdescription: drives[0].description,\n\t\t\t\t\t\tname: drives[0].displayName,\n\t\t\t\t\t})\n\t\t\t\t: i18next.t('message.toTarget', {\n\t\t\t\t\t\tcount: drives.length,\n\t\t\t\t\t\tnum: drives.length,\n\t\t\t\t\t});\n\t\treturn i18next.t('message.flashError', {\n\t\t\timage: imageBasename,\n\t\t\ttargets: target,\n\t\t});\n\t},\n\n\tdriveUnplugged: () => {\n\t\treturn i18next.t('message.unplug');\n\t},\n\n\tinputOutput: () => {\n\t\treturn i18next.t('message.cannotWrite');\n\t},\n\n\tchildWriterDied: () => {\n\t\treturn i18next.t('message.childWriterDied');\n\t},\n\n\tunsupportedProtocol: () => {\n\t\treturn i18next.t('message.badProtocol');\n\t},\n};\n"
  },
  {
    "path": "lib/shared/permissions.ts",
    "content": "/*\n * Copyright 2017 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { spawn, exec } from 'child_process';\nimport { promisify } from 'util';\nimport * as _ from 'lodash';\nimport * as os from 'os';\nimport * as semver from 'semver';\n\nimport { sudo as darwinSudo } from './sudo/darwin';\nimport { sudo as linuxSudo } from './sudo/linux';\nimport { sudo as winSudo } from './sudo/windows';\nimport * as errors from './errors';\n\nconst execAsync = promisify(exec);\n\n/**\n * @summary The user id of the UNIX \"superuser\"\n */\nconst UNIX_SUPERUSER_USER_ID = 0;\n\n// Augment the command to pass the environment variables as args\n// This is required because both windows and linux sudo commands strips the environment\n// variables when running the elevated command, so we need to pass them as arguments\nfunction commandWithEnv(\n\tcommand: string[],\n\tenv: _.Dictionary<string | undefined>,\n): string[] {\n\tconst envFilter: string[] = [\n\t\t'ETCHER_SERVER_ADDRESS',\n\t\t'ETCHER_SERVER_PORT',\n\t\t'ETCHER_SERVER_ID',\n\t\t'ETCHER_NO_SPAWN_UTIL',\n\t\t'ETCHER_TERMINATE_TIMEOUT',\n\t\t'UV_THREADPOOL_SIZE',\n\t];\n\n\treturn [\n\t\tcommand[0],\n\t\t...command.slice(1),\n\t\t...Object.keys(env)\n\t\t\t.filter((key) => Object.prototype.hasOwnProperty.call(env, key))\n\t\t\t.filter((key) => envFilter.includes(key))\n\t\t\t.map((key) => `--${key}=${env[key]}`),\n\t];\n}\n\nexport async function isElevated(): Promise<boolean> {\n\tif (os.platform() === 'win32') {\n\t\t// `fltmc` is available on WinPE, XP, Vista, 7, 8, and 10\n\t\t// Works even when the \"Server\" service is disabled\n\t\t// See http://stackoverflow.com/a/28268802\n\t\ttry {\n\t\t\tawait execAsync('fltmc');\n\t\t} catch (error: any) {\n\t\t\tif (error.code === os.constants.errno.EPERM) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t\treturn true;\n\t}\n\treturn process.geteuid!() === UNIX_SUPERUSER_USER_ID;\n}\n\n/**\n * @summary Check if the current process is running with elevated permissions\n */\nexport function isElevatedUnixSync(): boolean {\n\treturn process.geteuid!() === UNIX_SUPERUSER_USER_ID;\n}\n\nexport async function elevateCommand(\n\tcommand: string[],\n\toptions: {\n\t\tenv: _.Dictionary<string | undefined>;\n\t\tapplicationName: string;\n\t},\n): Promise<{ cancelled: boolean }> {\n\t// if we're running with elevated privileges, we can just spawn the command\n\tif (await isElevated()) {\n\t\tspawn(command[0], command.slice(1), {\n\t\t\tenv: options.env,\n\t\t});\n\t\treturn { cancelled: false };\n\t}\n\n\ttry {\n\t\tif (os.platform() === 'win32') {\n\t\t\tconst { cancelled } = await winSudo(commandWithEnv(command, options.env));\n\t\t\treturn { cancelled };\n\t\t}\n\t\tif (\n\t\t\tos.platform() === 'darwin' &&\n\t\t\tsemver.compare(os.release(), '19.0.0') >= 0\n\t\t) {\n\t\t\t// >= macOS Catalina\n\t\t\tconst { cancelled } = await darwinSudo(command, options.env);\n\t\t\treturn { cancelled };\n\t\t}\n\t} catch (error: any) {\n\t\tthrow errors.createError({ title: error.stderr });\n\t}\n\n\ttry {\n\t\tconst { cancelled } = await linuxSudo(commandWithEnv(command, options.env));\n\t\treturn { cancelled };\n\t} catch (error: any) {\n\t\t// We're hardcoding internal error messages declared by `sudo-prompt`.\n\t\t// There doesn't seem to be a better way to handle these errors, so\n\t\t// for now, we should make sure we double check if the error messages\n\t\t// have changed every time we upgrade `sudo-prompt`.\n\t\tconsole.log('error', error);\n\t\tif (_.includes(error.message, 'is not in the sudoers file')) {\n\t\t\tthrow errors.createUserError({\n\t\t\t\ttitle: \"Your user doesn't have enough privileges to proceed\",\n\t\t\t\tdescription:\n\t\t\t\t\t'This application requires sudo privileges to be able to write to drives',\n\t\t\t});\n\t\t} else if (_.startsWith(error.message, 'Command failed:')) {\n\t\t\tthrow errors.createUserError({\n\t\t\t\ttitle: 'The elevated process died unexpectedly',\n\t\t\t\tdescription: `The process error code was ${error.code}`,\n\t\t\t});\n\t\t} else if (error.message === 'User did not grant permission.') {\n\t\t\treturn { cancelled: true };\n\t\t} else if (error.message === 'No polkit authentication agent found.') {\n\t\t\tthrow errors.createUserError({\n\t\t\t\ttitle: 'No polkit authentication agent found',\n\t\t\t\tdescription:\n\t\t\t\t\t'Please install a polkit authentication agent for your desktop environment of choice to continue',\n\t\t\t});\n\t\t}\n\t\tthrow error;\n\t}\n}\n"
  },
  {
    "path": "lib/shared/sudo/darwin.ts",
    "content": "/*\n * Copyright 2025 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { spawn } from 'child_process';\nimport { join } from 'path';\n\nimport { supportedLocales } from '../../gui/app/i18n';\n\nconst SUCCESSFUL_AUTH_MARKER = 'AUTHENTICATION SUCCEEDED';\n\nfunction getAskPassScriptPath(lang: string): string {\n\tif (process.env.NODE_ENV === 'development') {\n\t\t// Force webpack's hand to bundle the script.\n\t\treturn require.resolve(`./sudo-askpass.osascript-${lang}.js`);\n\t}\n\t// Otherwise resolve the script relative to resources path.\n\treturn join(process.resourcesPath, `sudo-askpass.osascript-${lang}.js`);\n}\n\nexport async function sudo(\n\tcommand: string[],\n\tenv: any,\n): Promise<{ cancelled: boolean; stdout?: string; stderr?: string }> {\n\tlet lang = Intl.DateTimeFormat().resolvedOptions().locale;\n\tlang = lang.substr(0, 2);\n\tif (supportedLocales.indexOf(lang) === -1) {\n\t\tlang = 'en';\n\t}\n\n\t// Build the shell command string\n\tconst shellCmd = `echo ${SUCCESSFUL_AUTH_MARKER} && ${command[0]} ${command\n\t\t.slice(1)\n\t\t.map((a) => a.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"'))\n\t\t.join(' ')}`;\n\n\tlet elevated = 'pending';\n\n\ttry {\n\t\tconst elevateProcess = spawn(\n\t\t\t'sudo',\n\t\t\t['-E', '--askpass', 'sh', '-c', shellCmd],\n\t\t\t{\n\t\t\t\tenv: {\n\t\t\t\t\t...env,\n\t\t\t\t\tPATH: env.PATH,\n\t\t\t\t\tSUDO_ASKPASS: getAskPassScriptPath(lang),\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n\t\televateProcess.stdout.on('data', (data) => {\n\t\t\t// console.log(`stdout: ${data}`);\n\t\t\tif (data.toString().includes(SUCCESSFUL_AUTH_MARKER)) {\n\t\t\t\televated = 'granted';\n\t\t\t} else {\n\t\t\t\televated = 'rejected';\n\t\t\t}\n\t\t});\n\n\t\t// elevateProcess.stderr.on('data', (data) => {\n\t\t// \tconsole.log(`stderr: ${data}`);\n\t\t// });\n\t} catch (error: any) {\n\t\tconsole.error('Error starting sudo process', error);\n\t\tthrow new Error('Error starting sudo process');\n\t}\n\n\treturn new Promise((resolve, reject) => {\n\t\tconst checkElevation = setInterval(() => {\n\t\t\tconsole.log('elevated', elevated);\n\t\t\tif (elevated === 'granted') {\n\t\t\t\tclearInterval(checkElevation);\n\t\t\t\tresolve({ cancelled: false });\n\t\t\t} else if (elevated === 'rejected') {\n\t\t\t\tclearInterval(checkElevation);\n\t\t\t\tresolve({ cancelled: true });\n\t\t\t}\n\t\t}, 300);\n\n\t\tsetTimeout(() => {\n\t\t\tclearInterval(checkElevation);\n\t\t\treject(new Error('Elevation timeout'));\n\t\t}, 30000);\n\t});\n}\n"
  },
  {
    "path": "lib/shared/sudo/linux.ts",
    "content": "/*\n * Copyright 2025 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { spawn } from 'child_process';\nimport { access, constants } from 'fs/promises';\n\nconst SUCCESSFUL_AUTH_MARKER = 'AUTHENTICATION SUCCEEDED';\n\n/** Check for kdesudo or pkexec */\nfunction checkLinuxBinary() {\n\t// eslint-disable-next-line no-async-promise-executor\n\treturn new Promise(async (resolve, reject) => {\n\t\t// We used to prefer gksudo over pkexec since it enabled a better prompt.\n\t\t// However, gksudo cannot run multiple commands concurrently.\n\n\t\tconst paths = ['/usr/bin/kdesudo', '/usr/bin/pkexec'];\n\t\tfor (const path of paths) {\n\t\t\ttry {\n\t\t\t\t// check if the file exist and is executable\n\t\t\t\tawait access(path, constants.X_OK);\n\t\t\t\tresolve(path);\n\t\t\t} catch (error: any) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\treject('Unable to find pkexec or kdesudo.');\n\t});\n}\n\nfunction escapeDoubleQuotes(escapeString: string) {\n\treturn escapeString.replace(/\"/g, '\\\\\"');\n}\n\nexport async function sudo(\n\tcommand: string[],\n): Promise<{ cancelled: boolean; stdout?: string; stderr?: string }> {\n\tconst linuxBinary: string = (await checkLinuxBinary()) as string;\n\tif (!linuxBinary) {\n\t\tthrow new Error('Unable to find pkexec.');\n\t}\n\n\tconst parameters = [];\n\n\t// Add pkexec specific parameters\n\tif (/pkexec/i.test(linuxBinary)) {\n\t\tparameters.push('--disable-internal-agent');\n\t}\n\n\t// Build the shell command string\n\tconst shellCmd = `echo ${SUCCESSFUL_AUTH_MARKER} && ${command\n\t\t.map((a) => escapeDoubleQuotes(a))\n\t\t.join(' ')}`;\n\n\tparameters.push('/bin/bash');\n\tparameters.push('-c');\n\tparameters.push(shellCmd);\n\n\tconst elevateProcess = spawn(linuxBinary, parameters);\n\n\tlet elevated = '';\n\n\televateProcess.stdout.on('data', (data) => {\n\t\t// console.log(`stdout: ${data.toString()}`);\n\t\tif (data.toString().includes(SUCCESSFUL_AUTH_MARKER)) {\n\t\t\t// if the first data comming out of the sudo command is the expected marker we resolve the promise\n\t\t\televated = 'granted';\n\t\t} else {\n\t\t\t// if the first data comming out of the sudo command is not the expected marker we reject the promise\n\t\t\televated = 'refused';\n\t\t}\n\t});\n\n\t// we don't spawn or read stdout in the promise otherwise resolving stop the process\n\treturn new Promise((resolve, reject) => {\n\t\tconst checkElevation = setInterval(() => {\n\t\t\tif (elevated === 'granted') {\n\t\t\t\tclearInterval(checkElevation);\n\t\t\t\tresolve({ cancelled: false });\n\t\t\t} else if (elevated === 'refused') {\n\t\t\t\tclearInterval(checkElevation);\n\t\t\t\tresolve({ cancelled: true });\n\t\t\t}\n\t\t}, 300);\n\n\t\t// if the elevation didn't occured in 30 seconds we reject the promise\n\t\tsetTimeout(() => {\n\t\t\tclearInterval(checkElevation);\n\t\t\treject(new Error('Elevation timeout'));\n\t\t}, 30000);\n\t});\n}\n"
  },
  {
    "path": "lib/shared/sudo/sudo-askpass.osascript-en.js",
    "content": "#!/usr/bin/env osascript -l JavaScript\n\nObjC.import('stdlib')\n\nconst app = Application.currentApplication()\napp.includeStandardAdditions = true\n\nconst result = app.displayDialog('balenaEtcher needs privileged access in order to flash disks.\\n\\nType your password to allow this.', {\n  defaultAnswer: '',\n  withIcon: 'caution',\n  buttons: ['Cancel', 'Ok'],\n  defaultButton: 'Ok',\n  hiddenAnswer: true,\n})\n\nif (result.buttonReturned === 'Ok') {\n  result.textReturned\n} else {\n  $.exit(255)\n}\n\n"
  },
  {
    "path": "lib/shared/sudo/sudo-askpass.osascript-zh.js",
    "content": "#!/usr/bin/env osascript -l JavaScript\n\nObjC.import('stdlib')\n\nconst app = Application.currentApplication()\napp.includeStandardAdditions = true\n\nconst result = app.displayDialog('balenaEtcher 需要来自管理员的权限才能烧录镜像到磁盘。\\n\\n输入您的密码以允许此操作。', {\n  defaultAnswer: '',\n  withIcon: 'caution',\n  buttons: ['取消', '好'],\n  defaultButton: '好',\n  hiddenAnswer: true,\n})\n\nif (result.buttonReturned === '好') {\n  result.textReturned\n} else {\n  $.exit(255)\n}\n\n"
  },
  {
    "path": "lib/shared/sudo/windows.ts",
    "content": "/*\n * Copyright 2025 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { spawn } from 'child_process';\n\nexport async function sudo(\n\tcommand: string[],\n): Promise<{ cancelled: boolean; stdout?: string; stderr?: string }> {\n\ttry {\n\t\t// Powershell (required to ask for elevated privileges) as of win10\n\t\t// cannot pass environment variables as a map, so we pass them as args\n\t\t// this is a workaround as we can't use an equivalent of `sudo -E` on Windows\n\n\t\tconst spawnCommand = [];\n\t\tspawnCommand.push('Start-Process');\n\t\tspawnCommand.push('-FilePath');\n\n\t\t// Escape characters for cmd using double quotes:\n\t\t// Escape characters for PowerShell using single quotes:\n\t\t// Escape single quotes for PowerShell using backtick:\n\t\t// See: https://ss64.com/ps/syntax-esc.html\n\t\tspawnCommand.push(`'${command[0].replace(/'/g, \"`'\")}'`);\n\n\t\tspawnCommand.push('-ArgumentList');\n\n\t\t// Join and escape arguments for PowerShell\n\t\tspawnCommand.push(\n\t\t\t`'${command\n\t\t\t\t.slice(1)\n\t\t\t\t.map((a) => a.replace(/'/g, \"`'\"))\n\t\t\t\t.join(' ')}'`,\n\t\t);\n\t\tspawnCommand.push('-WindowStyle hidden');\n\t\tspawnCommand.push('-Verb runAs');\n\n\t\tconst child = spawn('powershell.exe', spawnCommand);\n\n\t\tlet result = { status: 'waiting' };\n\n\t\tchild.on('close', (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\t// User accepted UAC, process started\n\t\t\t\tconsole.log('UAC accepted, process started');\n\t\t\t\tresult = { status: 'granted' };\n\t\t\t} else {\n\t\t\t\t// User cancelled or error occurred\n\t\t\t\tconsole.log('UAC cancelled or error occurred');\n\t\t\t\tresult = { status: 'cancelled' };\n\t\t\t}\n\t\t});\n\n\t\tchild.on('error', (err) => {\n\t\t\tresult = { status: err.message };\n\t\t});\n\n\t\t// we don't spawn directly in the promise otherwise resolving stop the process\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst checkElevation = setInterval(() => {\n\t\t\t\tif (result.status === 'waiting') {\n\t\t\t\t\treturn;\n\t\t\t\t} else if (result.status === 'granted') {\n\t\t\t\t\tclearInterval(checkElevation);\n\t\t\t\t\tresolve({ cancelled: false });\n\t\t\t\t} else if (result.status === 'cancelled') {\n\t\t\t\t\tclearInterval(checkElevation);\n\t\t\t\t\tresolve({ cancelled: true });\n\t\t\t\t}\n\t\t\t}, 300);\n\n\t\t\t// if the elevation didn't occured in 30 seconds we reject the promise\n\t\t\tsetTimeout(() => {\n\t\t\t\tclearInterval(checkElevation);\n\t\t\t\treject(new Error('Elevation timeout'));\n\t\t\t}, 30000);\n\t\t});\n\t} catch (error) {\n\t\tthrow new Error(`Can't elevate process ${error}`);\n\t}\n}\n"
  },
  {
    "path": "lib/shared/supported-formats.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { basename } from 'path';\n\nexport const SUPPORTED_EXTENSIONS = [\n\t'bin',\n\t'bz2',\n\t'dmg',\n\t'dsk',\n\t'etch',\n\t'gz',\n\t'hddimg',\n\t'img',\n\t'iso',\n\t'raw',\n\t'rpi-sdimg',\n\t'sdcard',\n\t'vhd',\n\t'wic',\n\t'xz',\n\t'zip',\n];\n\nexport function looksLikeWindowsImage(imagePath: string): boolean {\n\tconst regex = /windows|win7|win8|win10|winxp/i;\n\treturn regex.test(basename(imagePath));\n}\n"
  },
  {
    "path": "lib/shared/units.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst MEGABYTE_TO_BYTE_RATIO = 1000000;\n\nexport function bytesToMegabytes(bytes: number): number {\n\treturn bytes / MEGABYTE_TO_BYTE_RATIO;\n}\n"
  },
  {
    "path": "lib/shared/utils.ts",
    "content": "/*\n * Copyright 2017 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as errors from './errors';\n\nexport function isValidPercentage(percentage: any): boolean {\n\treturn typeof percentage === 'number' && percentage >= 0 && percentage <= 100;\n}\n\nexport function percentageToFloat(percentage: any) {\n\tif (!isValidPercentage(percentage)) {\n\t\tthrow errors.createError({\n\t\t\ttitle: `Invalid percentage: ${percentage}`,\n\t\t});\n\t}\n\treturn percentage / 100;\n}\n\nexport async function delay(duration: number): Promise<void> {\n\tawait new Promise((resolve) => {\n\t\tsetTimeout(resolve, duration);\n\t});\n}\n\nexport function isJson(jsonString: string) {\n\ttry {\n\t\tJSON.parse(jsonString);\n\t} catch (e) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n"
  },
  {
    "path": "lib/util/api.ts",
    "content": "/*\n * Copyright 2017 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WebSocketServer } from 'ws';\nimport type { Dictionary } from 'lodash';\nimport { values } from 'lodash';\n\nimport type { MultiDestinationProgress } from 'etcher-sdk/build/multi-write';\n\nimport { toJSON } from '../shared/errors';\nimport { GENERAL_ERROR, SUCCESS } from '../shared/exit-codes';\nimport type { WriteOptions } from './types/types';\nimport { write, cleanup } from './child-writer';\nimport { startScanning } from './scanner';\nimport { getSourceMetadata } from './source-metadata';\nimport type { DrivelistDrive } from '../shared/drive-constraints';\nimport type { SourceMetadata } from '../shared/typings/source-selector';\n\n// Utility to parse --key=value arguments into process.env if not already set\nfunction injectEnvFromArgs() {\n\tfor (const arg of process.argv.slice(2)) {\n\t\tconst match = arg.match(/^--([^=]+)=(.*)$/);\n\t\tif (match) {\n\t\t\tconst key = match[1];\n\t\t\tconst value = match[2];\n\t\t\tif (process.env[key] === undefined) {\n\t\t\t\tprocess.env[key] = value;\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Inject env vars from arguments if not already present\ninjectEnvFromArgs();\n\nconsole.log(\n\t'Etcher child process started with the following environment variables:',\n);\nconsole.log(JSON.stringify(process.env, null, 2));\n\nconst ETCHER_SERVER_ADDRESS = process.env.ETCHER_SERVER_ADDRESS as string;\nconst ETCHER_SERVER_PORT = process.env.ETCHER_SERVER_PORT as string;\n// const ETCHER_SERVER_ID = process.env.ETCHER_SERVER_ID as string;\n\nconst ETCHER_TERMINATE_TIMEOUT: number = parseInt(\n\tprocess.env.ETCHER_TERMINATE_TIMEOUT ?? '10000',\n\t10,\n);\n\nconst host = ETCHER_SERVER_ADDRESS ?? '127.0.0.1';\nconst port = parseInt(ETCHER_SERVER_PORT || '3434', 10);\n// const path = ETCHER_SERVER_ID || \"etcher\";\n\n// TODO: use the path as cheap authentication\n\nconst wss = new WebSocketServer({ host, port });\n\n// hold emit functions\nlet emitLog: (message: string) => void | undefined;\nlet emitState: (state: MultiDestinationProgress) => void | undefined;\nlet emitFail: (data: any) => void | undefined;\nlet emitDrives: (drives: Dictionary<DrivelistDrive>) => void | undefined;\nlet emitSourceMetadata: (\n\tsourceMetadata: SourceMetadata | Record<string, never>,\n) => void | undefined; // Record<string, never> means an empty object\n\n// Terminate the child process\nasync function terminate(exitCode?: number) {\n\tawait cleanup(Date.now());\n\tprocess.nextTick(() => {\n\t\tprocess.exit(exitCode || SUCCESS);\n\t});\n}\n\n// kill the process if no initila connections or heartbeat for X sec (default 10)\nfunction setTerminateTimeout() {\n\tif (ETCHER_TERMINATE_TIMEOUT > 0) {\n\t\treturn setTimeout(() => {\n\t\t\tconsole.log(\n\t\t\t\t`no connections or heartbeat for ${ETCHER_TERMINATE_TIMEOUT} ms, terminating`,\n\t\t\t);\n\t\t\tterminate();\n\t\t}, ETCHER_TERMINATE_TIMEOUT);\n\t} else {\n\t\treturn null;\n\t}\n}\n\n// terminate the process cleanly on SIGINT\nprocess.once('SIGINT', async () => {\n\tawait terminate(SUCCESS);\n});\n\n// terminate the process cleanly on SIGTERM\nprocess.once('SIGTERM', async () => {\n\tawait terminate(SUCCESS);\n});\n\nlet terminateInterval = setTerminateTimeout();\n\ninterface EmitLog {\n\temit: (channel: string, message: object | string) => void;\n\tlog: (message: string) => void;\n}\n\nfunction setup(): Promise<EmitLog> {\n\treturn new Promise((resolve, reject) => {\n\t\twss.on('connection', (ws) => {\n\t\t\tconsole.log('connection established... setting up');\n\n\t\t\t/**\n\t\t\t * @summary Send a message to the IPC server\n\t\t\t */\n\t\t\tfunction emit(type: string, payload?: object | string) {\n\t\t\t\tws.send(JSON.stringify({ type, payload }));\n\t\t\t\t// ipc.of[IPC_SERVER_ID].emit(\"message\", { type, payload });\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * @summary Print logs and send them back to client\n\t\t\t */\n\t\t\tfunction log(message: string) {\n\t\t\t\tconsole.log(message);\n\t\t\t\temit('log', message);\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * @summary Handle `errors`\n\t\t\t */\n\t\t\tasync function handleError(error: Error) {\n\t\t\t\temit('error', toJSON(error));\n\t\t\t\tawait terminate(GENERAL_ERROR);\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * @summary Handle `abort` from client\n\t\t\t */\n\t\t\tconst onAbort = async (exitCode: number) => {\n\t\t\t\tlog('Abort');\n\t\t\t\temit('abort');\n\t\t\t\tawait terminate(exitCode);\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * @summary Handle `skip` from client; skip validation\n\t\t\t */\n\t\t\tconst onSkip = async (exitCode: number) => {\n\t\t\t\tlog('Skip validation');\n\t\t\t\temit('skip');\n\t\t\t\tawait terminate(exitCode);\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * @summary Handle `write` from client; start writing to the drives\n\t\t\t */\n\t\t\tconst onWrite = async (options: WriteOptions) => {\n\t\t\t\tlog('write requested');\n\n\t\t\t\t// Remove leftover tmp files older than 1 hour\n\t\t\t\tcleanup(Date.now() - 60 * 60 * 1000);\n\n\t\t\t\tlet exitCode = SUCCESS;\n\n\t\t\t\t// Write to the drives\n\t\t\t\tconst results = await write(options);\n\n\t\t\t\t// handle potential errors from the write process\n\t\t\t\tif (results.errors.length > 0) {\n\t\t\t\t\tresults.errors = results.errors.map(toJSON);\n\t\t\t\t\texitCode = GENERAL_ERROR;\n\t\t\t\t}\n\n\t\t\t\t// send the results back to the client\n\t\t\t\temit('done', { results });\n\n\t\t\t\t// terminate this process\n\t\t\t\tawait terminate(exitCode);\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * @summary Handle `sourceMetadata` from client; get source metadata\n\t\t\t */\n\t\t\tconst onSourceMetadata = async (params: any) => {\n\t\t\t\tlog('sourceMetadata requested');\n\t\t\t\tconst { selected, SourceType, auth } = JSON.parse(params);\n\t\t\t\ttry {\n\t\t\t\t\tconst sourceMatadata = await getSourceMetadata(\n\t\t\t\t\t\tselected,\n\t\t\t\t\t\tSourceType,\n\t\t\t\t\t\tauth,\n\t\t\t\t\t);\n\t\t\t\t\temitSourceMetadata(sourceMatadata);\n\t\t\t\t} catch (error: any) {\n\t\t\t\t\temitFail(error);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// handle uncaught exceptions\n\t\t\tprocess.once('uncaughtException', handleError);\n\n\t\t\t// terminate the process if the connection is closed\n\t\t\tws.on('error', async () => {\n\t\t\t\tawait terminate(SUCCESS);\n\t\t\t});\n\n\t\t\t// route messages from the client by `type`\n\t\t\tconst messagesHandler: any = {\n\t\t\t\t// terminate the process\n\t\t\t\tterminate: () => terminate(SUCCESS),\n\n\t\t\t\t/* \n\t\t\t\t receive a `heartbeat`, reset the terminate timeout\n\t\t\t\t this mechanism ensure the process will be terminated if the client is disconnected\n\t\t\t\t*/\n\t\t\t\theartbeat: () => {\n\t\t\t\t\tif (terminateInterval) {\n\t\t\t\t\t\tclearTimeout(terminateInterval);\n\t\t\t\t\t}\n\t\t\t\t\tterminateInterval = setTerminateTimeout();\n\t\t\t\t},\n\n\t\t\t\t// resolve the setup promise when the client is ready\n\t\t\t\tready: () => {\n\t\t\t\t\tlog('Ready ...');\n\t\t\t\t\tresolve({ emit, log });\n\t\t\t\t},\n\n\t\t\t\t// start scanning for drives\n\t\t\t\tscan: () => {\n\t\t\t\t\tlog('Scan requested');\n\t\t\t\t\tstartScanning();\n\t\t\t\t},\n\n\t\t\t\t// route `cancel` from client\n\t\t\t\tcancel: () => onAbort(GENERAL_ERROR),\n\n\t\t\t\t// route `skip` from client\n\t\t\t\tskip: () => onSkip(GENERAL_ERROR),\n\n\t\t\t\t// route `write` from client\n\t\t\t\twrite: async (options: WriteOptions) => onWrite(options),\n\n\t\t\t\t// route `sourceMetadata` from client\n\t\t\t\tsourceMetadata: async (params: any) => onSourceMetadata(params),\n\t\t\t};\n\n\t\t\t// message handler, parse and route messages coming on WS\n\t\t\tws.on('message', async (jsonData: any) => {\n\t\t\t\tconst data = JSON.parse(jsonData);\n\t\t\t\tconst message = messagesHandler[data.type];\n\t\t\t\tif (message) {\n\t\t\t\t\tawait message(data.payload);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`Unknown message type: ${data.type}`);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// inform the client that the server is ready to receive messages\n\t\t\temit('ready', {});\n\n\t\t\tws.on('error', (error) => {\n\t\t\t\treject(error);\n\t\t\t});\n\t\t});\n\t});\n}\n\n// setTimeout(() => console.log('wss', wss.address()), 1000);\nconsole.log('waiting for connection...');\n\nsetup().then(({ emit, log }: EmitLog) => {\n\t// connection is established, clear initial terminate timeout\n\tif (terminateInterval) {\n\t\tclearInterval(terminateInterval);\n\t}\n\n\tconsole.log('waiting for instruction...');\n\n\t// set the exportable emit functions\n\temitLog = (message) => {\n\t\tlog(message);\n\t};\n\n\temitState = (state) => {\n\t\temit('state', state);\n\t};\n\n\temitFail = (data) => {\n\t\temit('fail', data);\n\t};\n\n\temitDrives = (drives) => {\n\t\temit('drives', JSON.stringify(values(drives)));\n\t};\n\n\temitSourceMetadata = (sourceMetadata) => {\n\t\temit('sourceMetadata', JSON.stringify(sourceMetadata));\n\t};\n});\n\nexport { emitLog, emitState, emitFail, emitDrives, emitSourceMetadata };\n"
  },
  {
    "path": "lib/util/child-writer.ts",
    "content": "/*\n * Copyright 2023 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * This file handles the writer process.\n */\n\nimport type {\n\tOnProgressFunction,\n\tOnFailFunction,\n\tMultiDestinationProgress,\n} from 'etcher-sdk/build/multi-write';\nimport {\n\tdecompressThenFlash,\n\tDECOMPRESSED_IMAGE_PREFIX,\n} from 'etcher-sdk/build/multi-write';\n\nimport { totalmem } from 'os';\n\nimport { cleanupTmpFiles } from 'etcher-sdk/build/tmp';\n\nimport type { SourceDestination } from 'etcher-sdk/build/source-destination';\nimport { File, Http, BlockDevice } from 'etcher-sdk/build/source-destination';\n\nimport type { WriteResult, FlashError, WriteOptions } from './types/types';\n\nimport { isJson } from '../shared/utils';\nimport { toJSON } from '../shared/errors';\nimport axios from 'axios';\nimport { omit } from 'lodash';\nimport { emitLog, emitState, emitFail } from './api';\n\nasync function write(options: WriteOptions) {\n\t/**\n\t * @summary Failure handler (non-fatal errors)\n\t * @param {SourceDestination} destination - destination\n\t * @param {Error} error - error\n\t */\n\tconst onFail = (destination: SourceDestination, error: Error) => {\n\t\temitFail({\n\t\t\t// TODO: device should be destination\n\n\t\t\t// @ts-ignore (destination.drive is private)\n\t\t\tdevice: destination.drive,\n\t\t\terror: toJSON(error),\n\t\t});\n\t};\n\n\t/**\n\t * @summary Progress handler\n\t * @param {Object} state - progress state\n\t * @example\n\t * writer.on('progress', onProgress)\n\t */\n\tconst onProgress = (state: MultiDestinationProgress) => {\n\t\temitState(state);\n\t};\n\n\t// Write the image to the destinations\n\tconst destinations = options.destinations.map((d) => d.device);\n\tconst imagePath = options.image.path;\n\temitLog(`Image: ${imagePath}`);\n\temitLog(`Devices: ${destinations.join(', ')}`);\n\temitLog(`Auto blockmapping: ${options.autoBlockmapping}`);\n\temitLog(`Decompress first: ${options.decompressFirst}`);\n\tconst dests = options.destinations.map((destination) => {\n\t\treturn new BlockDevice({\n\t\t\tdrive: destination,\n\t\t\tunmountOnSuccess: true,\n\t\t\twrite: true,\n\t\t\tdirect: true,\n\t\t});\n\t});\n\tconst { SourceType } = options;\n\ttry {\n\t\tlet source;\n\t\tif (options.image.drive) {\n\t\t\tsource = new BlockDevice({\n\t\t\t\tdrive: options.image.drive,\n\t\t\t\tdirect: !options.autoBlockmapping,\n\t\t\t});\n\t\t} else {\n\t\t\tif (SourceType === File.name) {\n\t\t\t\tsource = new File({\n\t\t\t\t\tpath: imagePath,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst decodedImagePath = decodeURIComponent(imagePath);\n\t\t\t\tif (isJson(decodedImagePath)) {\n\t\t\t\t\tconst imagePathObject = JSON.parse(decodedImagePath);\n\t\t\t\t\tsource = new Http({\n\t\t\t\t\t\turl: imagePathObject.url,\n\t\t\t\t\t\tavoidRandomAccess: true,\n\t\t\t\t\t\taxiosInstance: axios.create(omit(imagePathObject, ['url'])),\n\t\t\t\t\t\tauth: options.image.auth,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tsource = new Http({\n\t\t\t\t\t\turl: imagePath,\n\t\t\t\t\t\tavoidRandomAccess: true,\n\t\t\t\t\t\tauth: options.image.auth,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst results = await writeAndValidate({\n\t\t\tsource,\n\t\t\tdestinations: dests,\n\t\t\tverify: true,\n\t\t\tautoBlockmapping: options.autoBlockmapping,\n\t\t\tdecompressFirst: options.decompressFirst,\n\t\t\tonProgress,\n\t\t\tonFail,\n\t\t});\n\n\t\treturn results;\n\t} catch (error: any) {\n\t\treturn { errors: [error] };\n\t}\n}\n\n/** @summary clean up tmp files */\nexport async function cleanup(until: number) {\n\tawait cleanupTmpFiles(until, DECOMPRESSED_IMAGE_PREFIX);\n}\n\n/**\n * @summary writes the source to the destinations and validates the writes\n * @param {SourceDestination} source - source\n * @param {SourceDestination[]} destinations - destinations\n * @param {Boolean} verify - whether to validate the writes or not\n * @param {Boolean} autoBlockmapping - whether to trim ext partitions before writing\n * @param {Function} onProgress - function to call on progress\n * @param {Function} onFail - function to call on fail\n * @returns {Promise<{ bytesWritten, devices, errors }>}\n */\nasync function writeAndValidate({\n\tsource,\n\tdestinations,\n\tverify,\n\tautoBlockmapping,\n\tdecompressFirst,\n\tonProgress,\n\tonFail,\n}: {\n\tsource: SourceDestination;\n\tdestinations: BlockDevice[];\n\tverify: boolean;\n\tautoBlockmapping: boolean;\n\tdecompressFirst: boolean;\n\tonProgress: OnProgressFunction;\n\tonFail: OnFailFunction;\n}): Promise<WriteResult> {\n\tconst { sourceMetadata, failures, bytesWritten } = await decompressThenFlash({\n\t\tsource,\n\t\tdestinations,\n\t\tonFail,\n\t\tonProgress,\n\t\tverify,\n\t\ttrim: autoBlockmapping,\n\t\tnumBuffers: Math.min(\n\t\t\t2 + (destinations.length - 1) * 32,\n\t\t\t256,\n\t\t\tMath.floor(totalmem() / 1024 ** 2 / 8),\n\t\t),\n\t\tdecompressFirst,\n\t});\n\tconst result: WriteResult = {\n\t\tbytesWritten,\n\t\tdevices: {\n\t\t\tfailed: failures.size,\n\t\t\tsuccessful: destinations.length - failures.size,\n\t\t},\n\t\terrors: [],\n\t\tsourceMetadata,\n\t};\n\tfor (const [destination, error] of failures) {\n\t\tconst err = error as FlashError;\n\t\tconst drive = destination as BlockDevice;\n\t\terr.device = drive.device;\n\t\terr.description = drive.description;\n\t\tresult.errors.push(err);\n\t}\n\treturn result;\n}\n\nexport { write };\n"
  },
  {
    "path": "lib/util/drive-scanner.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as sdk from 'etcher-sdk';\nimport type { Adapter } from 'etcher-sdk/build/scanner/adapters';\nimport {\n\tBlockDeviceAdapter,\n\tUsbbootDeviceAdapter,\n} from 'etcher-sdk/build/scanner/adapters';\nimport { geteuid, platform } from 'process';\n\nconst adapters: Adapter[] = [\n\tnew BlockDeviceAdapter({\n\t\tincludeSystemDrives: () => true,\n\t}),\n];\n\n// Can't use permissions.isElevated() here as it returns a promise and we need to set\n// module.exports = scanner right now.\nif (platform !== 'linux' || (geteuid && geteuid() === 0)) {\n\tadapters.push(new UsbbootDeviceAdapter());\n}\n\nif (platform === 'win32') {\n\tconst {\n\t\tDriverlessDeviceAdapter: driverless,\n\t} = require('etcher-sdk/build/scanner/adapters/driverless');\n\tadapters.push(new driverless());\n}\n\nexport const scanner = new sdk.scanner.Scanner(adapters);\n"
  },
  {
    "path": "lib/util/scanner.ts",
    "content": "import { scanner as driveScanner } from './drive-scanner';\nimport * as sdk from 'etcher-sdk';\nimport type { DrivelistDrive } from '../shared/drive-constraints';\nimport outdent from 'outdent';\nimport type { Dictionary } from 'lodash';\nimport { values, keyBy, padStart } from 'lodash';\nimport { emitDrives } from './api';\n\nlet availableDrives: DrivelistDrive[] = [];\n\nexport function hasAvailableDrives() {\n\treturn availableDrives.length > 0;\n}\n\ndriveScanner.on('error', (error) => {\n\t// Stop the drive scanning loop in case of errors,\n\t// otherwise we risk presenting the same error over\n\t// and over again to the user, while also heavily\n\t// spamming our error reporting service.\n\tdriveScanner.stop();\n\n\tconsole.log('scanner error', error);\n});\n\nfunction setDrives(drives: Dictionary<DrivelistDrive>) {\n\tavailableDrives = values(drives);\n\temitDrives(drives);\n}\n\nfunction getDrives() {\n\treturn keyBy(availableDrives, 'device');\n}\n\nasync function addDrive(drive: Drive) {\n\tconst preparedDrive = prepareDrive(drive);\n\tif (!(await driveIsAllowed(preparedDrive))) {\n\t\treturn;\n\t}\n\tconst drives = getDrives();\n\tdrives[preparedDrive.device] = preparedDrive;\n\n\tsetDrives(drives);\n}\n\nfunction removeDrive(drive: Drive) {\n\tconst preparedDrive = prepareDrive(drive);\n\tconst drives = getDrives();\n\tdelete drives[preparedDrive.device];\n\tsetDrives(drives);\n}\n\nasync function driveIsAllowed(drive: {\n\tdevicePath: string;\n\tdevice: string;\n\traw: string;\n}) {\n\t// const driveBlacklist = (await settings.get(\"driveBlacklist\")) || [];\n\tconst driveBlacklist: any[] = [];\n\treturn !(\n\t\tdriveBlacklist.includes(drive.devicePath) ||\n\t\tdriveBlacklist.includes(drive.device) ||\n\t\tdriveBlacklist.includes(drive.raw)\n\t);\n}\n\ntype Drive =\n\t| sdk.sourceDestination.BlockDevice\n\t| sdk.sourceDestination.UsbbootDrive\n\t| sdk.sourceDestination.DriverlessDevice;\n\nfunction prepareDrive(drive: Drive) {\n\tif (drive instanceof sdk.sourceDestination.BlockDevice) {\n\t\t// @ts-ignore (BlockDevice.drive is private)\n\t\treturn drive.drive;\n\t} else if (drive instanceof sdk.sourceDestination.UsbbootDrive) {\n\t\t// This is a workaround etcher expecting a device string and a size\n\n\t\t// @ts-ignore\n\t\tdrive.device = drive.usbDevice.portId;\n\t\tdrive.size = null;\n\n\t\t// @ts-ignore\n\t\tdrive.progress = 0;\n\t\tdrive.disabled = true;\n\t\tdrive.on('progress', (progress) => {\n\t\t\tupdateDriveProgress(drive, progress);\n\t\t});\n\t\treturn drive;\n\t} else if (drive instanceof sdk.sourceDestination.DriverlessDevice) {\n\t\tconst description =\n\t\t\tCOMPUTE_MODULE_DESCRIPTIONS[\n\t\t\t\tdrive.deviceDescriptor.idProduct.toString()\n\t\t\t] || 'Compute Module';\n\t\treturn {\n\t\t\tdevice: `${usbIdToString(\n\t\t\t\tdrive.deviceDescriptor.idVendor,\n\t\t\t)}:${usbIdToString(drive.deviceDescriptor.idProduct)}`,\n\t\t\tdisplayName: 'Missing drivers',\n\t\t\tdescription,\n\t\t\tmountpoints: [],\n\t\t\tisReadOnly: false,\n\t\t\tisSystem: false,\n\t\t\tdisabled: true,\n\t\t\ticon: 'warning',\n\t\t\tsize: null,\n\t\t\tlink: 'https://www.raspberrypi.com/documentation/computers/compute-module.html#flashing-the-compute-module-emmc',\n\t\t\tlinkCTA: 'Install',\n\t\t\tlinkTitle: 'Install missing drivers',\n\t\t\tlinkMessage: outdent`\n\t\t\t\tWould you like to download the necessary drivers from the Raspberry Pi Foundation?\n\t\t\t\tThis will open your browser.\n\n\n\t\t\t\tOnce opened, download and run the installer from the \"Windows Installer\" section to install the drivers\n\t\t\t`,\n\t\t};\n\t}\n}\n\n/**\n * @summary The radix used by USB ID numbers\n */\nconst USB_ID_RADIX = 16;\n\n/**\n * @summary The expected length of a USB ID number\n */\nconst USB_ID_LENGTH = 4;\n\n/**\n * @summary Convert a USB id (e.g. product/vendor) to a string\n *\n * @example\n * console.log(usbIdToString(2652))\n * > '0x0a5c'\n */\nfunction usbIdToString(id: number): string {\n\treturn `0x${padStart(id.toString(USB_ID_RADIX), USB_ID_LENGTH, '0')}`;\n}\n\nfunction updateDriveProgress(\n\tdrive: sdk.sourceDestination.UsbbootDrive,\n\tprogress: number,\n) {\n\tconst drives = getDrives();\n\n\t// @ts-ignore\n\tconst driveInMap = drives[drive.device];\n\tif (driveInMap) {\n\t\t// @ts-ignore\n\t\tdrives[drive.device] = { ...driveInMap, progress };\n\t\tsetDrives(drives);\n\t}\n}\n\n/**\n * @summary Product ID of BCM2708\n */\nconst USB_PRODUCT_ID_BCM2708_BOOT = 0x2763;\n\n/**\n * @summary Product ID of BCM2710\n */\nconst USB_PRODUCT_ID_BCM2710_BOOT = 0x2764;\n\n/**\n * @summary Compute module descriptions\n */\nconst COMPUTE_MODULE_DESCRIPTIONS: Dictionary<string> = {\n\t[USB_PRODUCT_ID_BCM2708_BOOT]: 'Compute Module 1',\n\t[USB_PRODUCT_ID_BCM2710_BOOT]: 'Compute Module 3',\n};\n\nconst startScanning = () => {\n\tdriveScanner.on('attach', (drive) => addDrive(drive));\n\tdriveScanner.on('detach', (drive) => removeDrive(drive));\n\tdriveScanner.start();\n};\n\nconst stopScanning = () => {\n\tdriveScanner.stop();\n};\n\nexport { startScanning, stopScanning };\n"
  },
  {
    "path": "lib/util/source-metadata.ts",
    "content": "/** Get metadata for a source */\n\nimport { sourceDestination } from 'etcher-sdk';\nimport { replaceWindowsNetworkDriveLetter } from '../gui/app/os/windows-network-drives';\nimport type { AxiosRequestConfig } from 'axios';\nimport axios from 'axios';\nimport { isJson } from '../shared/utils';\nimport * as path from 'path';\nimport type {\n\tSourceMetadata,\n\tAuthentication,\n\tSource,\n} from '../shared/typings/source-selector';\nimport type { DrivelistDrive } from '../shared/drive-constraints';\nimport { omit } from 'lodash';\n\nfunction isString(value: any): value is string {\n\treturn typeof value === 'string';\n}\n\nasync function createSource(\n\tselected: string,\n\tSourceType: Source,\n\tauth?: Authentication,\n) {\n\ttry {\n\t\tselected = await replaceWindowsNetworkDriveLetter(selected);\n\t} catch (error: any) {\n\t\t// TODO: analytics.logException(error);\n\t}\n\n\tif (isJson(decodeURIComponent(selected))) {\n\t\tconst config: AxiosRequestConfig = JSON.parse(decodeURIComponent(selected));\n\t\treturn new sourceDestination.Http({\n\t\t\turl: config.url!,\n\t\t\taxiosInstance: axios.create(omit(config, ['url'])),\n\t\t});\n\t}\n\n\tif (SourceType === 'File') {\n\t\treturn new sourceDestination.File({\n\t\t\tpath: selected,\n\t\t});\n\t}\n\n\treturn new sourceDestination.Http({ url: selected, auth });\n}\n\nasync function getMetadata(\n\tsource: sourceDestination.SourceDestination,\n\tselected: string | DrivelistDrive,\n) {\n\tconst metadata = (await source.getMetadata()) as SourceMetadata;\n\tconst partitionTable = await source.getPartitionTable();\n\tif (partitionTable) {\n\t\tmetadata.hasMBR = true;\n\t\tmetadata.partitions = partitionTable.partitions;\n\t} else {\n\t\tmetadata.hasMBR = false;\n\t}\n\tif (isString(selected)) {\n\t\tmetadata.extension = path.extname(selected).slice(1);\n\t\tmetadata.path = selected;\n\t}\n\treturn metadata;\n}\n\nasync function getSourceMetadata(\n\tselected: string | DrivelistDrive,\n\tSourceType: Source,\n\tauth?: Authentication,\n): Promise<SourceMetadata | Record<string, never>> {\n\t// `Record<string, never>` means an empty object\n\tif (isString(selected)) {\n\t\tconst source = await createSource(selected, SourceType, auth);\n\n\t\ttry {\n\t\t\tconst innerSource = await source.getInnerSource();\n\n\t\t\tconst metadata = await getMetadata(innerSource, selected);\n\n\t\t\treturn metadata;\n\t\t} catch (error: any) {\n\t\t\t// TODO: handle error\n\t\t\treturn {};\n\t\t} finally {\n\t\t\tawait source.close();\n\t\t}\n\t} else {\n\t\treturn {};\n\t}\n}\n\nexport { getSourceMetadata };\n"
  },
  {
    "path": "lib/util/types/types.d.ts",
    "content": "import type { Metadata } from 'etcher-sdk/build/source-destination';\nimport type { SourceMetadata } from '../../shared/typings/source-selector';\nimport type { Drive as DrivelistDrive } from 'drivelist';\n\nexport interface WriteResult {\n\tbytesWritten?: number;\n\tdevices?: {\n\t\tfailed: number;\n\t\tsuccessful: number;\n\t};\n\terrors: FlashError[];\n\tsourceMetadata?: Metadata;\n}\n\nexport interface FlashError extends Error {\n\tdescription: string;\n\tdevice: string;\n\tcode: string;\n}\n\nexport interface FlashResults extends WriteResult {\n\tskip?: boolean;\n\tcancelled?: boolean;\n}\n\ninterface WriteOptions {\n\timage: SourceMetadata;\n\tdestinations: DrivelistDrive[];\n\tautoBlockmapping: boolean;\n\tdecompressFirst: boolean;\n\tSourceType: string;\n\thttpRequest?: any;\n}\n"
  },
  {
    "path": "npm-shrinkwrap.json",
    "content": "{\n  \"name\": \"balena-etcher\",\n  \"version\": \"2.1.4\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"balena-etcher\",\n      \"version\": \"2.1.4\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@electron/remote\": \"^2.1.2\",\n        \"@fortawesome/fontawesome-free\": \"^6.5.2\",\n        \"@ronomon/direct-io\": \"^3.0.1\",\n        \"@sentry/electron\": \"^4.24.0\",\n        \"axios\": \"^1.6.8\",\n        \"debug\": \"4.3.4\",\n        \"drivelist\": \"^12.0.2\",\n        \"electron-squirrel-startup\": \"^1.0.0\",\n        \"electron-updater\": \"6.1.8\",\n        \"etcher-sdk\": \"10.0.0\",\n        \"i18next\": \"23.11.2\",\n        \"immutable\": \"3.8.2\",\n        \"lodash\": \"4.17.21\",\n        \"outdent\": \"0.8.0\",\n        \"path-is-inside\": \"1.0.2\",\n        \"pretty-bytes\": \"6.1.1\",\n        \"react\": \"17.0.2\",\n        \"react-dom\": \"17.0.2\",\n        \"react-i18next\": \"13.5.0\",\n        \"redux\": \"4.2.1\",\n        \"rendition\": \"35.2.0\",\n        \"semver\": \"7.6.0\",\n        \"styled-components\": \"5.3.6\",\n        \"sys-class-rgb-led\": \"3.0.1\",\n        \"uuid\": \"9.0.1\",\n        \"ws\": \"^8.16.0\"\n      },\n      \"devDependencies\": {\n        \"@balena/lint\": \"8.0.2\",\n        \"@electron-forge/cli\": \"7.8.1\",\n        \"@electron-forge/maker-deb\": \"7.8.1\",\n        \"@electron-forge/maker-dmg\": \"7.8.1\",\n        \"@electron-forge/maker-rpm\": \"7.8.1\",\n        \"@electron-forge/maker-squirrel\": \"7.8.1\",\n        \"@electron-forge/maker-zip\": \"7.8.1\",\n        \"@electron-forge/plugin-auto-unpack-natives\": \"7.8.1\",\n        \"@electron-forge/plugin-webpack\": \"7.8.1\",\n        \"@reforged/maker-appimage\": \"3.3.2\",\n        \"@svgr/webpack\": \"8.1.0\",\n        \"@types/chai\": \"4.3.14\",\n        \"@types/debug\": \"^4.1.12\",\n        \"@types/mime-types\": \"2.1.4\",\n        \"@types/node\": \"^20.11.6\",\n        \"@types/react\": \"17.0.2\",\n        \"@types/react-dom\": \"17.0.2\",\n        \"@types/semver\": \"7.5.8\",\n        \"@types/sinon\": \"17.0.3\",\n        \"@types/tmp\": \"0.2.6\",\n        \"@vercel/webpack-asset-relocator-loader\": \"1.7.3\",\n        \"@wdio/cli\": \"^8.36.1\",\n        \"@wdio/local-runner\": \"^8.36.1\",\n        \"@wdio/mocha-framework\": \"^8.36.1\",\n        \"@wdio/spec-reporter\": \"^8.36.1\",\n        \"@yao-pkg/pkg\": \"^5.11.5\",\n        \"catch-uncommitted\": \"^2.0.0\",\n        \"chai\": \"4.3.10\",\n        \"css-loader\": \"5.2.7\",\n        \"electron\": \"37.2.4\",\n        \"file-loader\": \"6.2.0\",\n        \"husky\": \"8.0.3\",\n        \"native-addon-loader\": \"2.0.1\",\n        \"node-loader\": \"^2.0.0\",\n        \"sinon\": \"^17.0.1\",\n        \"string-replace-loader\": \"3.1.0\",\n        \"style-loader\": \"3.3.3\",\n        \"ts-loader\": \"^9.5.1\",\n        \"ts-node\": \"^10.9.2\",\n        \"tslib\": \"2.6.2\",\n        \"typescript\": \"^5.3.3\",\n        \"url-loader\": \"4.1.1\",\n        \"wdio-electron-service\": \"^6.4.1\",\n        \"xvfb-maybe\": \"^0.2.1\"\n      },\n      \"engines\": {\n        \"node\": \">=20 <21\"\n      },\n      \"optionalDependencies\": {\n        \"bufferutil\": \"^4.0.8\",\n        \"utf-8-validate\": \"^5.0.10\",\n        \"winusb-driver-generator\": \"2.1.2\"\n      }\n    },\n    \"node_modules/@aashutoshrathi/word-wrap\": {\n      \"version\": \"1.2.6\",\n      \"resolved\": \"https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz\",\n      \"integrity\": \"sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/@ampproject/remapping\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz\",\n      \"integrity\": \"sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==\",\n      \"dependencies\": {\n        \"@jridgewell/gen-mapping\": \"^0.3.5\",\n        \"@jridgewell/trace-mapping\": \"^0.3.24\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@aws-crypto/ie11-detection\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz\",\n      \"integrity\": \"sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==\",\n      \"dependencies\": {\n        \"tslib\": \"^1.11.1\"\n      }\n    },\n    \"node_modules/@aws-crypto/ie11-detection/node_modules/tslib\": {\n      \"version\": \"1.14.1\",\n      \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz\",\n      \"integrity\": \"sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==\"\n    },\n    \"node_modules/@aws-crypto/sha256-browser\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz\",\n      \"integrity\": \"sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==\",\n      \"dependencies\": {\n        \"@aws-crypto/ie11-detection\": \"^3.0.0\",\n        \"@aws-crypto/sha256-js\": \"^3.0.0\",\n        \"@aws-crypto/supports-web-crypto\": \"^3.0.0\",\n        \"@aws-crypto/util\": \"^3.0.0\",\n        \"@aws-sdk/types\": \"^3.222.0\",\n        \"@aws-sdk/util-locate-window\": \"^3.0.0\",\n        \"@aws-sdk/util-utf8-browser\": \"^3.0.0\",\n        \"tslib\": \"^1.11.1\"\n      }\n    },\n    \"node_modules/@aws-crypto/sha256-browser/node_modules/tslib\": {\n      \"version\": \"1.14.1\",\n      \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz\",\n      \"integrity\": \"sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==\"\n    },\n    \"node_modules/@aws-crypto/sha256-js\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz\",\n      \"integrity\": \"sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==\",\n      \"dependencies\": {\n        \"@aws-crypto/util\": \"^3.0.0\",\n        \"@aws-sdk/types\": \"^3.222.0\",\n        \"tslib\": \"^1.11.1\"\n      }\n    },\n    \"node_modules/@aws-crypto/sha256-js/node_modules/tslib\": {\n      \"version\": \"1.14.1\",\n      \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz\",\n      \"integrity\": \"sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==\"\n    },\n    \"node_modules/@aws-crypto/supports-web-crypto\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz\",\n      \"integrity\": \"sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==\",\n      \"dependencies\": {\n        \"tslib\": \"^1.11.1\"\n      }\n    },\n    \"node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib\": {\n      \"version\": \"1.14.1\",\n      \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz\",\n      \"integrity\": \"sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==\"\n    },\n    \"node_modules/@aws-crypto/util\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz\",\n      \"integrity\": \"sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==\",\n      \"dependencies\": {\n        \"@aws-sdk/types\": \"^3.222.0\",\n        \"@aws-sdk/util-utf8-browser\": \"^3.0.0\",\n        \"tslib\": \"^1.11.1\"\n      }\n    },\n    \"node_modules/@aws-crypto/util/node_modules/tslib\": {\n      \"version\": \"1.14.1\",\n      \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz\",\n      \"integrity\": \"sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==\"\n    },\n    \"node_modules/@aws-sdk/client-sso\": {\n      \"version\": \"3.556.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.556.0.tgz\",\n      \"integrity\": \"sha512-unXdWS7uvHqCcOyC1de+Fr8m3F2vMg2m24GPea0bg7rVGTYmiyn9mhUX11VCt+ozydrw+F50FQwL6OqoqPocmw==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-crypto/sha256-browser\": \"3.0.0\",\n        \"@aws-crypto/sha256-js\": \"3.0.0\",\n        \"@aws-sdk/core\": \"3.556.0\",\n        \"@aws-sdk/middleware-host-header\": \"3.535.0\",\n        \"@aws-sdk/middleware-logger\": \"3.535.0\",\n        \"@aws-sdk/middleware-recursion-detection\": \"3.535.0\",\n        \"@aws-sdk/middleware-user-agent\": \"3.540.0\",\n        \"@aws-sdk/region-config-resolver\": \"3.535.0\",\n        \"@aws-sdk/types\": \"3.535.0\",\n        \"@aws-sdk/util-endpoints\": \"3.540.0\",\n        \"@aws-sdk/util-user-agent-browser\": \"3.535.0\",\n        \"@aws-sdk/util-user-agent-node\": \"3.535.0\",\n        \"@smithy/config-resolver\": \"^2.2.0\",\n        \"@smithy/core\": \"^1.4.2\",\n        \"@smithy/fetch-http-handler\": \"^2.5.0\",\n        \"@smithy/hash-node\": \"^2.2.0\",\n        \"@smithy/invalid-dependency\": \"^2.2.0\",\n        \"@smithy/middleware-content-length\": \"^2.2.0\",\n        \"@smithy/middleware-endpoint\": \"^2.5.1\",\n        \"@smithy/middleware-retry\": \"^2.3.1\",\n        \"@smithy/middleware-serde\": \"^2.3.0\",\n        \"@smithy/middleware-stack\": \"^2.2.0\",\n        \"@smithy/node-config-provider\": \"^2.3.0\",\n        \"@smithy/node-http-handler\": \"^2.5.0\",\n        \"@smithy/protocol-http\": \"^3.3.0\",\n        \"@smithy/smithy-client\": \"^2.5.1\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"@smithy/url-parser\": \"^2.2.0\",\n        \"@smithy/util-base64\": \"^2.3.0\",\n        \"@smithy/util-body-length-browser\": \"^2.2.0\",\n        \"@smithy/util-body-length-node\": \"^2.3.0\",\n        \"@smithy/util-defaults-mode-browser\": \"^2.2.1\",\n        \"@smithy/util-defaults-mode-node\": \"^2.3.1\",\n        \"@smithy/util-endpoints\": \"^1.2.0\",\n        \"@smithy/util-middleware\": \"^2.2.0\",\n        \"@smithy/util-retry\": \"^2.2.0\",\n        \"@smithy/util-utf8\": \"^2.3.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/client-sso-oidc\": {\n      \"version\": \"3.556.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.556.0.tgz\",\n      \"integrity\": \"sha512-AXKd2TB6nNrksu+OfmHl8uI07PdgzOo4o8AxoRO8SHlwoMAGvcT9optDGVSYoVfgOKTymCoE7h8/UoUfPc11wQ==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-crypto/sha256-browser\": \"3.0.0\",\n        \"@aws-crypto/sha256-js\": \"3.0.0\",\n        \"@aws-sdk/client-sts\": \"3.556.0\",\n        \"@aws-sdk/core\": \"3.556.0\",\n        \"@aws-sdk/middleware-host-header\": \"3.535.0\",\n        \"@aws-sdk/middleware-logger\": \"3.535.0\",\n        \"@aws-sdk/middleware-recursion-detection\": \"3.535.0\",\n        \"@aws-sdk/middleware-user-agent\": \"3.540.0\",\n        \"@aws-sdk/region-config-resolver\": \"3.535.0\",\n        \"@aws-sdk/types\": \"3.535.0\",\n        \"@aws-sdk/util-endpoints\": \"3.540.0\",\n        \"@aws-sdk/util-user-agent-browser\": \"3.535.0\",\n        \"@aws-sdk/util-user-agent-node\": \"3.535.0\",\n        \"@smithy/config-resolver\": \"^2.2.0\",\n        \"@smithy/core\": \"^1.4.2\",\n        \"@smithy/fetch-http-handler\": \"^2.5.0\",\n        \"@smithy/hash-node\": \"^2.2.0\",\n        \"@smithy/invalid-dependency\": \"^2.2.0\",\n        \"@smithy/middleware-content-length\": \"^2.2.0\",\n        \"@smithy/middleware-endpoint\": \"^2.5.1\",\n        \"@smithy/middleware-retry\": \"^2.3.1\",\n        \"@smithy/middleware-serde\": \"^2.3.0\",\n        \"@smithy/middleware-stack\": \"^2.2.0\",\n        \"@smithy/node-config-provider\": \"^2.3.0\",\n        \"@smithy/node-http-handler\": \"^2.5.0\",\n        \"@smithy/protocol-http\": \"^3.3.0\",\n        \"@smithy/smithy-client\": \"^2.5.1\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"@smithy/url-parser\": \"^2.2.0\",\n        \"@smithy/util-base64\": \"^2.3.0\",\n        \"@smithy/util-body-length-browser\": \"^2.2.0\",\n        \"@smithy/util-body-length-node\": \"^2.3.0\",\n        \"@smithy/util-defaults-mode-browser\": \"^2.2.1\",\n        \"@smithy/util-defaults-mode-node\": \"^2.3.1\",\n        \"@smithy/util-endpoints\": \"^1.2.0\",\n        \"@smithy/util-middleware\": \"^2.2.0\",\n        \"@smithy/util-retry\": \"^2.2.0\",\n        \"@smithy/util-utf8\": \"^2.3.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      },\n      \"peerDependencies\": {\n        \"@aws-sdk/credential-provider-node\": \"^3.556.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/client-sts\": {\n      \"version\": \"3.556.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.556.0.tgz\",\n      \"integrity\": \"sha512-TsK3js7Suh9xEmC886aY+bv0KdLLYtzrcmVt6sJ/W6EnDXYQhBuKYFhp03NrN2+vSvMGpqJwR62DyfKe1G0QzQ==\",\n      \"dependencies\": {\n        \"@aws-crypto/sha256-browser\": \"3.0.0\",\n        \"@aws-crypto/sha256-js\": \"3.0.0\",\n        \"@aws-sdk/core\": \"3.556.0\",\n        \"@aws-sdk/middleware-host-header\": \"3.535.0\",\n        \"@aws-sdk/middleware-logger\": \"3.535.0\",\n        \"@aws-sdk/middleware-recursion-detection\": \"3.535.0\",\n        \"@aws-sdk/middleware-user-agent\": \"3.540.0\",\n        \"@aws-sdk/region-config-resolver\": \"3.535.0\",\n        \"@aws-sdk/types\": \"3.535.0\",\n        \"@aws-sdk/util-endpoints\": \"3.540.0\",\n        \"@aws-sdk/util-user-agent-browser\": \"3.535.0\",\n        \"@aws-sdk/util-user-agent-node\": \"3.535.0\",\n        \"@smithy/config-resolver\": \"^2.2.0\",\n        \"@smithy/core\": \"^1.4.2\",\n        \"@smithy/fetch-http-handler\": \"^2.5.0\",\n        \"@smithy/hash-node\": \"^2.2.0\",\n        \"@smithy/invalid-dependency\": \"^2.2.0\",\n        \"@smithy/middleware-content-length\": \"^2.2.0\",\n        \"@smithy/middleware-endpoint\": \"^2.5.1\",\n        \"@smithy/middleware-retry\": \"^2.3.1\",\n        \"@smithy/middleware-serde\": \"^2.3.0\",\n        \"@smithy/middleware-stack\": \"^2.2.0\",\n        \"@smithy/node-config-provider\": \"^2.3.0\",\n        \"@smithy/node-http-handler\": \"^2.5.0\",\n        \"@smithy/protocol-http\": \"^3.3.0\",\n        \"@smithy/smithy-client\": \"^2.5.1\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"@smithy/url-parser\": \"^2.2.0\",\n        \"@smithy/util-base64\": \"^2.3.0\",\n        \"@smithy/util-body-length-browser\": \"^2.2.0\",\n        \"@smithy/util-body-length-node\": \"^2.3.0\",\n        \"@smithy/util-defaults-mode-browser\": \"^2.2.1\",\n        \"@smithy/util-defaults-mode-node\": \"^2.3.1\",\n        \"@smithy/util-endpoints\": \"^1.2.0\",\n        \"@smithy/util-middleware\": \"^2.2.0\",\n        \"@smithy/util-retry\": \"^2.2.0\",\n        \"@smithy/util-utf8\": \"^2.3.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      },\n      \"peerDependencies\": {\n        \"@aws-sdk/credential-provider-node\": \"^3.556.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/core\": {\n      \"version\": \"3.556.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/core/-/core-3.556.0.tgz\",\n      \"integrity\": \"sha512-vJaSaHw2kPQlo11j/Rzuz0gk1tEaKdz+2ser0f0qZ5vwFlANjt08m/frU17ctnVKC1s58bxpctO/1P894fHLrA==\",\n      \"dependencies\": {\n        \"@smithy/core\": \"^1.4.2\",\n        \"@smithy/protocol-http\": \"^3.3.0\",\n        \"@smithy/signature-v4\": \"^2.3.0\",\n        \"@smithy/smithy-client\": \"^2.5.1\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"fast-xml-parser\": \"4.2.5\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/credential-provider-env\": {\n      \"version\": \"3.535.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.535.0.tgz\",\n      \"integrity\": \"sha512-XppwO8c0GCGSAvdzyJOhbtktSEaShg14VJKg8mpMa1XcgqzmcqqHQjtDWbx5rZheY1VdpXZhpEzJkB6LpQejpA==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/types\": \"3.535.0\",\n        \"@smithy/property-provider\": \"^2.2.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/credential-provider-http\": {\n      \"version\": \"3.552.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.552.0.tgz\",\n      \"integrity\": \"sha512-vsmu7Cz1i45pFEqzVb4JcFmAmVnWFNLsGheZc8SCptlqCO5voETrZZILHYIl4cjKkSDk3pblBOf0PhyjqWW6WQ==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/types\": \"3.535.0\",\n        \"@smithy/fetch-http-handler\": \"^2.5.0\",\n        \"@smithy/node-http-handler\": \"^2.5.0\",\n        \"@smithy/property-provider\": \"^2.2.0\",\n        \"@smithy/protocol-http\": \"^3.3.0\",\n        \"@smithy/smithy-client\": \"^2.5.1\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"@smithy/util-stream\": \"^2.2.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/credential-provider-ini\": {\n      \"version\": \"3.556.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.556.0.tgz\",\n      \"integrity\": \"sha512-0Nz4ErOlXhe3muxWYMbPwRMgfKmVbBp36BAE2uv/z5wTbfdBkcgUwaflEvlKCLUTdHzuZsQk+BFS/gVyaUeOuA==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/client-sts\": \"3.556.0\",\n        \"@aws-sdk/credential-provider-env\": \"3.535.0\",\n        \"@aws-sdk/credential-provider-process\": \"3.535.0\",\n        \"@aws-sdk/credential-provider-sso\": \"3.556.0\",\n        \"@aws-sdk/credential-provider-web-identity\": \"3.556.0\",\n        \"@aws-sdk/types\": \"3.535.0\",\n        \"@smithy/credential-provider-imds\": \"^2.3.0\",\n        \"@smithy/property-provider\": \"^2.2.0\",\n        \"@smithy/shared-ini-file-loader\": \"^2.4.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/credential-provider-node\": {\n      \"version\": \"3.563.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.563.0.tgz\",\n      \"integrity\": \"sha512-cNGT93uuAzM2ZnWT0rHbT/bjnVRCIQDTi8ylnvNpsOj+zFCn2q2eQAh6fgACPjKhCA7Szc38AX0hH2PDXH6+yg==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/credential-provider-env\": \"3.535.0\",\n        \"@aws-sdk/credential-provider-http\": \"3.552.0\",\n        \"@aws-sdk/credential-provider-ini\": \"3.556.0\",\n        \"@aws-sdk/credential-provider-process\": \"3.535.0\",\n        \"@aws-sdk/credential-provider-sso\": \"3.556.0\",\n        \"@aws-sdk/credential-provider-web-identity\": \"3.556.0\",\n        \"@aws-sdk/types\": \"3.535.0\",\n        \"@smithy/credential-provider-imds\": \"^2.3.0\",\n        \"@smithy/property-provider\": \"^2.2.0\",\n        \"@smithy/shared-ini-file-loader\": \"^2.4.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/credential-provider-process\": {\n      \"version\": \"3.535.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.535.0.tgz\",\n      \"integrity\": \"sha512-9O1OaprGCnlb/kYl8RwmH7Mlg8JREZctB8r9sa1KhSsWFq/SWO0AuJTyowxD7zL5PkeS4eTvzFFHWCa3OO5epA==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/types\": \"3.535.0\",\n        \"@smithy/property-provider\": \"^2.2.0\",\n        \"@smithy/shared-ini-file-loader\": \"^2.4.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/credential-provider-sso\": {\n      \"version\": \"3.556.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.556.0.tgz\",\n      \"integrity\": \"sha512-ETuBgcnpfxqadEAqhQFWpKoV1C/NAgvs5CbBc5EJbelJ8f4prTdErIHjrRtVT8c02MXj92QwczsiNYd5IoOqyw==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/client-sso\": \"3.556.0\",\n        \"@aws-sdk/token-providers\": \"3.556.0\",\n        \"@aws-sdk/types\": \"3.535.0\",\n        \"@smithy/property-provider\": \"^2.2.0\",\n        \"@smithy/shared-ini-file-loader\": \"^2.4.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/credential-provider-web-identity\": {\n      \"version\": \"3.556.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.556.0.tgz\",\n      \"integrity\": \"sha512-R/YAL8Uh8i+dzVjzMnbcWLIGeeRi2mioHVGnVF+minmaIkCiQMZg2HPrdlKm49El+RljT28Nl5YHRuiqzEIwMA==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/client-sts\": \"3.556.0\",\n        \"@aws-sdk/types\": \"3.535.0\",\n        \"@smithy/property-provider\": \"^2.2.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/middleware-host-header\": {\n      \"version\": \"3.535.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.535.0.tgz\",\n      \"integrity\": \"sha512-0h6TWjBWtDaYwHMQJI9ulafeS4lLaw1vIxRjbpH0svFRt6Eve+Sy8NlVhECfTU2hNz/fLubvrUxsXoThaLBIew==\",\n      \"dependencies\": {\n        \"@aws-sdk/types\": \"3.535.0\",\n        \"@smithy/protocol-http\": \"^3.3.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/middleware-logger\": {\n      \"version\": \"3.535.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.535.0.tgz\",\n      \"integrity\": \"sha512-huNHpONOrEDrdRTvSQr1cJiRMNf0S52NDXtaPzdxiubTkP+vni2MohmZANMOai/qT0olmEVX01LhZ0ZAOgmg6A==\",\n      \"dependencies\": {\n        \"@aws-sdk/types\": \"3.535.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/middleware-recursion-detection\": {\n      \"version\": \"3.535.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.535.0.tgz\",\n      \"integrity\": \"sha512-am2qgGs+gwqmR4wHLWpzlZ8PWhm4ktj5bYSgDrsOfjhdBlWNxvPoID9/pDAz5RWL48+oH7I6SQzMqxXsFDikrw==\",\n      \"dependencies\": {\n        \"@aws-sdk/types\": \"3.535.0\",\n        \"@smithy/protocol-http\": \"^3.3.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/middleware-user-agent\": {\n      \"version\": \"3.540.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.540.0.tgz\",\n      \"integrity\": \"sha512-8Rd6wPeXDnOYzWj1XCmOKcx/Q87L0K1/EHqOBocGjLVbN3gmRxBvpmR1pRTjf7IsWfnnzN5btqtcAkfDPYQUMQ==\",\n      \"dependencies\": {\n        \"@aws-sdk/types\": \"3.535.0\",\n        \"@aws-sdk/util-endpoints\": \"3.540.0\",\n        \"@smithy/protocol-http\": \"^3.3.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/region-config-resolver\": {\n      \"version\": \"3.535.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.535.0.tgz\",\n      \"integrity\": \"sha512-IXOznDiaItBjsQy4Fil0kzX/J3HxIOknEphqHbOfUf+LpA5ugcsxuQQONrbEQusCBnfJyymrldBvBhFmtlU9Wg==\",\n      \"dependencies\": {\n        \"@aws-sdk/types\": \"3.535.0\",\n        \"@smithy/node-config-provider\": \"^2.3.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"@smithy/util-config-provider\": \"^2.3.0\",\n        \"@smithy/util-middleware\": \"^2.2.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/token-providers\": {\n      \"version\": \"3.556.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.556.0.tgz\",\n      \"integrity\": \"sha512-tvIiugNF0/+2wfuImMrpKjXMx4nCnFWQjQvouObny+wrif/PGqqQYrybwxPJDvzbd965bu1I+QuSv85/ug7xsg==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/client-sso-oidc\": \"3.556.0\",\n        \"@aws-sdk/types\": \"3.535.0\",\n        \"@smithy/property-provider\": \"^2.2.0\",\n        \"@smithy/shared-ini-file-loader\": \"^2.4.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/types\": {\n      \"version\": \"3.535.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/types/-/types-3.535.0.tgz\",\n      \"integrity\": \"sha512-aY4MYfduNj+sRR37U7XxYR8wemfbKP6lx00ze2M2uubn7mZotuVrWYAafbMSXrdEMSToE5JDhr28vArSOoLcSg==\",\n      \"dependencies\": {\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/util-endpoints\": {\n      \"version\": \"3.540.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.540.0.tgz\",\n      \"integrity\": \"sha512-1kMyQFAWx6f8alaI6UT65/5YW/7pDWAKAdNwL6vuJLea03KrZRX3PMoONOSJpAS5m3Ot7HlWZvf3wZDNTLELZw==\",\n      \"dependencies\": {\n        \"@aws-sdk/types\": \"3.535.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"@smithy/util-endpoints\": \"^1.2.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/util-locate-window\": {\n      \"version\": \"3.535.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.535.0.tgz\",\n      \"integrity\": \"sha512-PHJ3SL6d2jpcgbqdgiPxkXpu7Drc2PYViwxSIqvvMKhDwzSB1W3mMvtpzwKM4IE7zLFodZo0GKjJ9AsoXndXhA==\",\n      \"dependencies\": {\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/util-user-agent-browser\": {\n      \"version\": \"3.535.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.535.0.tgz\",\n      \"integrity\": \"sha512-RWMcF/xV5n+nhaA/Ff5P3yNP3Kur/I+VNZngog4TEs92oB/nwOdAg/2JL8bVAhUbMrjTjpwm7PItziYFQoqyig==\",\n      \"dependencies\": {\n        \"@aws-sdk/types\": \"3.535.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"bowser\": \"^2.11.0\",\n        \"tslib\": \"^2.6.2\"\n      }\n    },\n    \"node_modules/@aws-sdk/util-user-agent-node\": {\n      \"version\": \"3.535.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.535.0.tgz\",\n      \"integrity\": \"sha512-dRek0zUuIT25wOWJlsRm97nTkUlh1NDcLsQZIN2Y8KxhwoXXWtJs5vaDPT+qAg+OpcNj80i1zLR/CirqlFg/TQ==\",\n      \"dependencies\": {\n        \"@aws-sdk/types\": \"3.535.0\",\n        \"@smithy/node-config-provider\": \"^2.3.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      },\n      \"peerDependencies\": {\n        \"aws-crt\": \">=1.0.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"aws-crt\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/@aws-sdk/util-utf8-browser\": {\n      \"version\": \"3.259.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz\",\n      \"integrity\": \"sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==\",\n      \"dependencies\": {\n        \"tslib\": \"^2.3.1\"\n      }\n    },\n    \"node_modules/@babel/code-frame\": {\n      \"version\": \"7.24.2\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz\",\n      \"integrity\": \"sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==\",\n      \"dependencies\": {\n        \"@babel/highlight\": \"^7.24.2\",\n        \"picocolors\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/compat-data\": {\n      \"version\": \"7.24.4\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz\",\n      \"integrity\": \"sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/core\": {\n      \"version\": \"7.24.4\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz\",\n      \"integrity\": \"sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==\",\n      \"dependencies\": {\n        \"@ampproject/remapping\": \"^2.2.0\",\n        \"@babel/code-frame\": \"^7.24.2\",\n        \"@babel/generator\": \"^7.24.4\",\n        \"@babel/helper-compilation-targets\": \"^7.23.6\",\n        \"@babel/helper-module-transforms\": \"^7.23.3\",\n        \"@babel/helpers\": \"^7.24.4\",\n        \"@babel/parser\": \"^7.24.4\",\n        \"@babel/template\": \"^7.24.0\",\n        \"@babel/traverse\": \"^7.24.1\",\n        \"@babel/types\": \"^7.24.0\",\n        \"convert-source-map\": \"^2.0.0\",\n        \"debug\": \"^4.1.0\",\n        \"gensync\": \"^1.0.0-beta.2\",\n        \"json5\": \"^2.2.3\",\n        \"semver\": \"^6.3.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/babel\"\n      }\n    },\n    \"node_modules/@babel/core/node_modules/semver\": {\n      \"version\": \"6.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n      \"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n      \"bin\": {\n        \"semver\": \"bin/semver.js\"\n      }\n    },\n    \"node_modules/@babel/generator\": {\n      \"version\": \"7.24.4\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz\",\n      \"integrity\": \"sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==\",\n      \"dependencies\": {\n        \"@babel/types\": \"^7.24.0\",\n        \"@jridgewell/gen-mapping\": \"^0.3.5\",\n        \"@jridgewell/trace-mapping\": \"^0.3.25\",\n        \"jsesc\": \"^2.5.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-annotate-as-pure\": {\n      \"version\": \"7.22.5\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz\",\n      \"integrity\": \"sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==\",\n      \"dependencies\": {\n        \"@babel/types\": \"^7.22.5\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-builder-binary-assignment-operator-visitor\": {\n      \"version\": \"7.22.15\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz\",\n      \"integrity\": \"sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/types\": \"^7.22.15\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-compilation-targets\": {\n      \"version\": \"7.23.6\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz\",\n      \"integrity\": \"sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==\",\n      \"dependencies\": {\n        \"@babel/compat-data\": \"^7.23.5\",\n        \"@babel/helper-validator-option\": \"^7.23.5\",\n        \"browserslist\": \"^4.22.2\",\n        \"lru-cache\": \"^5.1.1\",\n        \"semver\": \"^6.3.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-compilation-targets/node_modules/semver\": {\n      \"version\": \"6.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n      \"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n      \"bin\": {\n        \"semver\": \"bin/semver.js\"\n      }\n    },\n    \"node_modules/@babel/helper-create-class-features-plugin\": {\n      \"version\": \"7.24.4\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz\",\n      \"integrity\": \"sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-annotate-as-pure\": \"^7.22.5\",\n        \"@babel/helper-environment-visitor\": \"^7.22.20\",\n        \"@babel/helper-function-name\": \"^7.23.0\",\n        \"@babel/helper-member-expression-to-functions\": \"^7.23.0\",\n        \"@babel/helper-optimise-call-expression\": \"^7.22.5\",\n        \"@babel/helper-replace-supers\": \"^7.24.1\",\n        \"@babel/helper-skip-transparent-expression-wrappers\": \"^7.22.5\",\n        \"@babel/helper-split-export-declaration\": \"^7.22.6\",\n        \"semver\": \"^6.3.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0\"\n      }\n    },\n    \"node_modules/@babel/helper-create-class-features-plugin/node_modules/semver\": {\n      \"version\": \"6.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n      \"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n      \"dev\": true,\n      \"bin\": {\n        \"semver\": \"bin/semver.js\"\n      }\n    },\n    \"node_modules/@babel/helper-create-regexp-features-plugin\": {\n      \"version\": \"7.22.15\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz\",\n      \"integrity\": \"sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-annotate-as-pure\": \"^7.22.5\",\n        \"regexpu-core\": \"^5.3.1\",\n        \"semver\": \"^6.3.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0\"\n      }\n    },\n    \"node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver\": {\n      \"version\": \"6.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n      \"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n      \"dev\": true,\n      \"bin\": {\n        \"semver\": \"bin/semver.js\"\n      }\n    },\n    \"node_modules/@babel/helper-define-polyfill-provider\": {\n      \"version\": \"0.6.2\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz\",\n      \"integrity\": \"sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-compilation-targets\": \"^7.22.6\",\n        \"@babel/helper-plugin-utils\": \"^7.22.5\",\n        \"debug\": \"^4.1.1\",\n        \"lodash.debounce\": \"^4.0.8\",\n        \"resolve\": \"^1.14.2\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.4.0 || ^8.0.0-0 <8.0.0\"\n      }\n    },\n    \"node_modules/@babel/helper-environment-visitor\": {\n      \"version\": \"7.22.20\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz\",\n      \"integrity\": \"sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-function-name\": {\n      \"version\": \"7.23.0\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz\",\n      \"integrity\": \"sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==\",\n      \"dependencies\": {\n        \"@babel/template\": \"^7.22.15\",\n        \"@babel/types\": \"^7.23.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-hoist-variables\": {\n      \"version\": \"7.22.5\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz\",\n      \"integrity\": \"sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==\",\n      \"dependencies\": {\n        \"@babel/types\": \"^7.22.5\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-member-expression-to-functions\": {\n      \"version\": \"7.23.0\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz\",\n      \"integrity\": \"sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/types\": \"^7.23.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-module-imports\": {\n      \"version\": \"7.24.3\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz\",\n      \"integrity\": \"sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==\",\n      \"dependencies\": {\n        \"@babel/types\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-module-transforms\": {\n      \"version\": \"7.23.3\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz\",\n      \"integrity\": \"sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==\",\n      \"dependencies\": {\n        \"@babel/helper-environment-visitor\": \"^7.22.20\",\n        \"@babel/helper-module-imports\": \"^7.22.15\",\n        \"@babel/helper-simple-access\": \"^7.22.5\",\n        \"@babel/helper-split-export-declaration\": \"^7.22.6\",\n        \"@babel/helper-validator-identifier\": \"^7.22.20\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0\"\n      }\n    },\n    \"node_modules/@babel/helper-optimise-call-expression\": {\n      \"version\": \"7.22.5\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz\",\n      \"integrity\": \"sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/types\": \"^7.22.5\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-plugin-utils\": {\n      \"version\": \"7.24.0\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz\",\n      \"integrity\": \"sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-remap-async-to-generator\": {\n      \"version\": \"7.22.20\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz\",\n      \"integrity\": \"sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-annotate-as-pure\": \"^7.22.5\",\n        \"@babel/helper-environment-visitor\": \"^7.22.20\",\n        \"@babel/helper-wrap-function\": \"^7.22.20\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0\"\n      }\n    },\n    \"node_modules/@babel/helper-replace-supers\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz\",\n      \"integrity\": \"sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-environment-visitor\": \"^7.22.20\",\n        \"@babel/helper-member-expression-to-functions\": \"^7.23.0\",\n        \"@babel/helper-optimise-call-expression\": \"^7.22.5\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0\"\n      }\n    },\n    \"node_modules/@babel/helper-simple-access\": {\n      \"version\": \"7.22.5\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz\",\n      \"integrity\": \"sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==\",\n      \"dependencies\": {\n        \"@babel/types\": \"^7.22.5\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-skip-transparent-expression-wrappers\": {\n      \"version\": \"7.22.5\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz\",\n      \"integrity\": \"sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/types\": \"^7.22.5\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-split-export-declaration\": {\n      \"version\": \"7.22.6\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz\",\n      \"integrity\": \"sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==\",\n      \"dependencies\": {\n        \"@babel/types\": \"^7.22.5\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-string-parser\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz\",\n      \"integrity\": \"sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-validator-identifier\": {\n      \"version\": \"7.22.20\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz\",\n      \"integrity\": \"sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-validator-option\": {\n      \"version\": \"7.23.5\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz\",\n      \"integrity\": \"sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-wrap-function\": {\n      \"version\": \"7.22.20\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz\",\n      \"integrity\": \"sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-function-name\": \"^7.22.5\",\n        \"@babel/template\": \"^7.22.15\",\n        \"@babel/types\": \"^7.22.19\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helpers\": {\n      \"version\": \"7.24.4\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz\",\n      \"integrity\": \"sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==\",\n      \"dependencies\": {\n        \"@babel/template\": \"^7.24.0\",\n        \"@babel/traverse\": \"^7.24.1\",\n        \"@babel/types\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/highlight\": {\n      \"version\": \"7.24.2\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz\",\n      \"integrity\": \"sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==\",\n      \"dependencies\": {\n        \"@babel/helper-validator-identifier\": \"^7.22.20\",\n        \"chalk\": \"^2.4.2\",\n        \"js-tokens\": \"^4.0.0\",\n        \"picocolors\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/highlight/node_modules/ansi-styles\": {\n      \"version\": \"3.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz\",\n      \"integrity\": \"sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==\",\n      \"dependencies\": {\n        \"color-convert\": \"^1.9.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/@babel/highlight/node_modules/chalk\": {\n      \"version\": \"2.4.2\",\n      \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz\",\n      \"integrity\": \"sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^3.2.1\",\n        \"escape-string-regexp\": \"^1.0.5\",\n        \"supports-color\": \"^5.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/@babel/highlight/node_modules/color-convert\": {\n      \"version\": \"1.9.3\",\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz\",\n      \"integrity\": \"sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==\",\n      \"dependencies\": {\n        \"color-name\": \"1.1.3\"\n      }\n    },\n    \"node_modules/@babel/highlight/node_modules/color-name\": {\n      \"version\": \"1.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz\",\n      \"integrity\": \"sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==\"\n    },\n    \"node_modules/@babel/highlight/node_modules/escape-string-regexp\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz\",\n      \"integrity\": \"sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==\",\n      \"engines\": {\n        \"node\": \">=0.8.0\"\n      }\n    },\n    \"node_modules/@babel/highlight/node_modules/has-flag\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz\",\n      \"integrity\": \"sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/@babel/highlight/node_modules/supports-color\": {\n      \"version\": \"5.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz\",\n      \"integrity\": \"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==\",\n      \"dependencies\": {\n        \"has-flag\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/@babel/parser\": {\n      \"version\": \"7.24.4\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz\",\n      \"integrity\": \"sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==\",\n      \"bin\": {\n        \"parser\": \"bin/babel-parser.js\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key\": {\n      \"version\": \"7.24.4\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz\",\n      \"integrity\": \"sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-environment-visitor\": \"^7.22.20\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0\"\n      }\n    },\n    \"node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz\",\n      \"integrity\": \"sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0\"\n      }\n    },\n    \"node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz\",\n      \"integrity\": \"sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/helper-skip-transparent-expression-wrappers\": \"^7.22.5\",\n        \"@babel/plugin-transform-optional-chaining\": \"^7.24.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.13.0\"\n      }\n    },\n    \"node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz\",\n      \"integrity\": \"sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-environment-visitor\": \"^7.22.20\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0\"\n      }\n    },\n    \"node_modules/@babel/plugin-proposal-private-property-in-object\": {\n      \"version\": \"7.21.0-placeholder-for-preset-env.2\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz\",\n      \"integrity\": \"sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-async-generators\": {\n      \"version\": \"7.8.4\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz\",\n      \"integrity\": \"sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.8.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-class-properties\": {\n      \"version\": \"7.12.13\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz\",\n      \"integrity\": \"sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.12.13\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-class-static-block\": {\n      \"version\": \"7.14.5\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz\",\n      \"integrity\": \"sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.14.5\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-dynamic-import\": {\n      \"version\": \"7.8.3\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz\",\n      \"integrity\": \"sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.8.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-export-namespace-from\": {\n      \"version\": \"7.8.3\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz\",\n      \"integrity\": \"sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.8.3\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-import-assertions\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz\",\n      \"integrity\": \"sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-import-attributes\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz\",\n      \"integrity\": \"sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-import-meta\": {\n      \"version\": \"7.10.4\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz\",\n      \"integrity\": \"sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.10.4\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-json-strings\": {\n      \"version\": \"7.8.3\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz\",\n      \"integrity\": \"sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.8.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-jsx\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz\",\n      \"integrity\": \"sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==\",\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-logical-assignment-operators\": {\n      \"version\": \"7.10.4\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz\",\n      \"integrity\": \"sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.10.4\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-nullish-coalescing-operator\": {\n      \"version\": \"7.8.3\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz\",\n      \"integrity\": \"sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.8.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-numeric-separator\": {\n      \"version\": \"7.10.4\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz\",\n      \"integrity\": \"sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.10.4\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-object-rest-spread\": {\n      \"version\": \"7.8.3\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz\",\n      \"integrity\": \"sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.8.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-optional-catch-binding\": {\n      \"version\": \"7.8.3\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz\",\n      \"integrity\": \"sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.8.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-optional-chaining\": {\n      \"version\": \"7.8.3\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz\",\n      \"integrity\": \"sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.8.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-private-property-in-object\": {\n      \"version\": \"7.14.5\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz\",\n      \"integrity\": \"sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.14.5\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-top-level-await\": {\n      \"version\": \"7.14.5\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz\",\n      \"integrity\": \"sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.14.5\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-typescript\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz\",\n      \"integrity\": \"sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-unicode-sets-regex\": {\n      \"version\": \"7.18.6\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz\",\n      \"integrity\": \"sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-create-regexp-features-plugin\": \"^7.18.6\",\n        \"@babel/helper-plugin-utils\": \"^7.18.6\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-arrow-functions\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz\",\n      \"integrity\": \"sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-async-generator-functions\": {\n      \"version\": \"7.24.3\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz\",\n      \"integrity\": \"sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-environment-visitor\": \"^7.22.20\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/helper-remap-async-to-generator\": \"^7.22.20\",\n        \"@babel/plugin-syntax-async-generators\": \"^7.8.4\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-async-to-generator\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz\",\n      \"integrity\": \"sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-module-imports\": \"^7.24.1\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/helper-remap-async-to-generator\": \"^7.22.20\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-block-scoped-functions\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz\",\n      \"integrity\": \"sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-block-scoping\": {\n      \"version\": \"7.24.4\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz\",\n      \"integrity\": \"sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-class-properties\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz\",\n      \"integrity\": \"sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-create-class-features-plugin\": \"^7.24.1\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-class-static-block\": {\n      \"version\": \"7.24.4\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz\",\n      \"integrity\": \"sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-create-class-features-plugin\": \"^7.24.4\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/plugin-syntax-class-static-block\": \"^7.14.5\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.12.0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-classes\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz\",\n      \"integrity\": \"sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-annotate-as-pure\": \"^7.22.5\",\n        \"@babel/helper-compilation-targets\": \"^7.23.6\",\n        \"@babel/helper-environment-visitor\": \"^7.22.20\",\n        \"@babel/helper-function-name\": \"^7.23.0\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/helper-replace-supers\": \"^7.24.1\",\n        \"@babel/helper-split-export-declaration\": \"^7.22.6\",\n        \"globals\": \"^11.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-computed-properties\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz\",\n      \"integrity\": \"sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/template\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-destructuring\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz\",\n      \"integrity\": \"sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-dotall-regex\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz\",\n      \"integrity\": \"sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-create-regexp-features-plugin\": \"^7.22.15\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-duplicate-keys\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz\",\n      \"integrity\": \"sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-dynamic-import\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz\",\n      \"integrity\": \"sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/plugin-syntax-dynamic-import\": \"^7.8.3\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-exponentiation-operator\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz\",\n      \"integrity\": \"sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-builder-binary-assignment-operator-visitor\": \"^7.22.15\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-export-namespace-from\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz\",\n      \"integrity\": \"sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/plugin-syntax-export-namespace-from\": \"^7.8.3\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-for-of\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz\",\n      \"integrity\": \"sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/helper-skip-transparent-expression-wrappers\": \"^7.22.5\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-function-name\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz\",\n      \"integrity\": \"sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-compilation-targets\": \"^7.23.6\",\n        \"@babel/helper-function-name\": \"^7.23.0\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-json-strings\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz\",\n      \"integrity\": \"sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/plugin-syntax-json-strings\": \"^7.8.3\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-literals\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz\",\n      \"integrity\": \"sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-logical-assignment-operators\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz\",\n      \"integrity\": \"sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/plugin-syntax-logical-assignment-operators\": \"^7.10.4\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-member-expression-literals\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz\",\n      \"integrity\": \"sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-modules-amd\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz\",\n      \"integrity\": \"sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-module-transforms\": \"^7.23.3\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-modules-commonjs\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz\",\n      \"integrity\": \"sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-module-transforms\": \"^7.23.3\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/helper-simple-access\": \"^7.22.5\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-modules-systemjs\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz\",\n      \"integrity\": \"sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-hoist-variables\": \"^7.22.5\",\n        \"@babel/helper-module-transforms\": \"^7.23.3\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/helper-validator-identifier\": \"^7.22.20\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-modules-umd\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz\",\n      \"integrity\": \"sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-module-transforms\": \"^7.23.3\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-named-capturing-groups-regex\": {\n      \"version\": \"7.22.5\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz\",\n      \"integrity\": \"sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-create-regexp-features-plugin\": \"^7.22.5\",\n        \"@babel/helper-plugin-utils\": \"^7.22.5\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-new-target\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz\",\n      \"integrity\": \"sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-nullish-coalescing-operator\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz\",\n      \"integrity\": \"sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/plugin-syntax-nullish-coalescing-operator\": \"^7.8.3\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-numeric-separator\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz\",\n      \"integrity\": \"sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/plugin-syntax-numeric-separator\": \"^7.10.4\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-object-rest-spread\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz\",\n      \"integrity\": \"sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-compilation-targets\": \"^7.23.6\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/plugin-syntax-object-rest-spread\": \"^7.8.3\",\n        \"@babel/plugin-transform-parameters\": \"^7.24.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-object-super\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz\",\n      \"integrity\": \"sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/helper-replace-supers\": \"^7.24.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-optional-catch-binding\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz\",\n      \"integrity\": \"sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/plugin-syntax-optional-catch-binding\": \"^7.8.3\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-optional-chaining\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz\",\n      \"integrity\": \"sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/helper-skip-transparent-expression-wrappers\": \"^7.22.5\",\n        \"@babel/plugin-syntax-optional-chaining\": \"^7.8.3\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-parameters\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz\",\n      \"integrity\": \"sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-private-methods\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz\",\n      \"integrity\": \"sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-create-class-features-plugin\": \"^7.24.1\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-private-property-in-object\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz\",\n      \"integrity\": \"sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-annotate-as-pure\": \"^7.22.5\",\n        \"@babel/helper-create-class-features-plugin\": \"^7.24.1\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/plugin-syntax-private-property-in-object\": \"^7.14.5\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-property-literals\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz\",\n      \"integrity\": \"sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-react-constant-elements\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.1.tgz\",\n      \"integrity\": \"sha512-QXp1U9x0R7tkiGB0FOk8o74jhnap0FlZ5gNkRIWdG3eP+SvMFg118e1zaWewDzgABb106QSKpVsD3Wgd8t6ifA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-react-display-name\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz\",\n      \"integrity\": \"sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-react-jsx\": {\n      \"version\": \"7.23.4\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz\",\n      \"integrity\": \"sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-annotate-as-pure\": \"^7.22.5\",\n        \"@babel/helper-module-imports\": \"^7.22.15\",\n        \"@babel/helper-plugin-utils\": \"^7.22.5\",\n        \"@babel/plugin-syntax-jsx\": \"^7.23.3\",\n        \"@babel/types\": \"^7.23.4\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-react-jsx-development\": {\n      \"version\": \"7.22.5\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz\",\n      \"integrity\": \"sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/plugin-transform-react-jsx\": \"^7.22.5\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-react-pure-annotations\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz\",\n      \"integrity\": \"sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-annotate-as-pure\": \"^7.22.5\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-regenerator\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz\",\n      \"integrity\": \"sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"regenerator-transform\": \"^0.15.2\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-reserved-words\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz\",\n      \"integrity\": \"sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-shorthand-properties\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz\",\n      \"integrity\": \"sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-spread\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz\",\n      \"integrity\": \"sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/helper-skip-transparent-expression-wrappers\": \"^7.22.5\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-sticky-regex\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz\",\n      \"integrity\": \"sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-template-literals\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz\",\n      \"integrity\": \"sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-typeof-symbol\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz\",\n      \"integrity\": \"sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-typescript\": {\n      \"version\": \"7.24.4\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.4.tgz\",\n      \"integrity\": \"sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-annotate-as-pure\": \"^7.22.5\",\n        \"@babel/helper-create-class-features-plugin\": \"^7.24.4\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/plugin-syntax-typescript\": \"^7.24.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-unicode-escapes\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz\",\n      \"integrity\": \"sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-unicode-property-regex\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz\",\n      \"integrity\": \"sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-create-regexp-features-plugin\": \"^7.22.15\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-unicode-regex\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz\",\n      \"integrity\": \"sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-create-regexp-features-plugin\": \"^7.22.15\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-transform-unicode-sets-regex\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz\",\n      \"integrity\": \"sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-create-regexp-features-plugin\": \"^7.22.15\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0\"\n      }\n    },\n    \"node_modules/@babel/preset-env\": {\n      \"version\": \"7.24.4\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.4.tgz\",\n      \"integrity\": \"sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/compat-data\": \"^7.24.4\",\n        \"@babel/helper-compilation-targets\": \"^7.23.6\",\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/helper-validator-option\": \"^7.23.5\",\n        \"@babel/plugin-bugfix-firefox-class-in-computed-class-key\": \"^7.24.4\",\n        \"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression\": \"^7.24.1\",\n        \"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining\": \"^7.24.1\",\n        \"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly\": \"^7.24.1\",\n        \"@babel/plugin-proposal-private-property-in-object\": \"7.21.0-placeholder-for-preset-env.2\",\n        \"@babel/plugin-syntax-async-generators\": \"^7.8.4\",\n        \"@babel/plugin-syntax-class-properties\": \"^7.12.13\",\n        \"@babel/plugin-syntax-class-static-block\": \"^7.14.5\",\n        \"@babel/plugin-syntax-dynamic-import\": \"^7.8.3\",\n        \"@babel/plugin-syntax-export-namespace-from\": \"^7.8.3\",\n        \"@babel/plugin-syntax-import-assertions\": \"^7.24.1\",\n        \"@babel/plugin-syntax-import-attributes\": \"^7.24.1\",\n        \"@babel/plugin-syntax-import-meta\": \"^7.10.4\",\n        \"@babel/plugin-syntax-json-strings\": \"^7.8.3\",\n        \"@babel/plugin-syntax-logical-assignment-operators\": \"^7.10.4\",\n        \"@babel/plugin-syntax-nullish-coalescing-operator\": \"^7.8.3\",\n        \"@babel/plugin-syntax-numeric-separator\": \"^7.10.4\",\n        \"@babel/plugin-syntax-object-rest-spread\": \"^7.8.3\",\n        \"@babel/plugin-syntax-optional-catch-binding\": \"^7.8.3\",\n        \"@babel/plugin-syntax-optional-chaining\": \"^7.8.3\",\n        \"@babel/plugin-syntax-private-property-in-object\": \"^7.14.5\",\n        \"@babel/plugin-syntax-top-level-await\": \"^7.14.5\",\n        \"@babel/plugin-syntax-unicode-sets-regex\": \"^7.18.6\",\n        \"@babel/plugin-transform-arrow-functions\": \"^7.24.1\",\n        \"@babel/plugin-transform-async-generator-functions\": \"^7.24.3\",\n        \"@babel/plugin-transform-async-to-generator\": \"^7.24.1\",\n        \"@babel/plugin-transform-block-scoped-functions\": \"^7.24.1\",\n        \"@babel/plugin-transform-block-scoping\": \"^7.24.4\",\n        \"@babel/plugin-transform-class-properties\": \"^7.24.1\",\n        \"@babel/plugin-transform-class-static-block\": \"^7.24.4\",\n        \"@babel/plugin-transform-classes\": \"^7.24.1\",\n        \"@babel/plugin-transform-computed-properties\": \"^7.24.1\",\n        \"@babel/plugin-transform-destructuring\": \"^7.24.1\",\n        \"@babel/plugin-transform-dotall-regex\": \"^7.24.1\",\n        \"@babel/plugin-transform-duplicate-keys\": \"^7.24.1\",\n        \"@babel/plugin-transform-dynamic-import\": \"^7.24.1\",\n        \"@babel/plugin-transform-exponentiation-operator\": \"^7.24.1\",\n        \"@babel/plugin-transform-export-namespace-from\": \"^7.24.1\",\n        \"@babel/plugin-transform-for-of\": \"^7.24.1\",\n        \"@babel/plugin-transform-function-name\": \"^7.24.1\",\n        \"@babel/plugin-transform-json-strings\": \"^7.24.1\",\n        \"@babel/plugin-transform-literals\": \"^7.24.1\",\n        \"@babel/plugin-transform-logical-assignment-operators\": \"^7.24.1\",\n        \"@babel/plugin-transform-member-expression-literals\": \"^7.24.1\",\n        \"@babel/plugin-transform-modules-amd\": \"^7.24.1\",\n        \"@babel/plugin-transform-modules-commonjs\": \"^7.24.1\",\n        \"@babel/plugin-transform-modules-systemjs\": \"^7.24.1\",\n        \"@babel/plugin-transform-modules-umd\": \"^7.24.1\",\n        \"@babel/plugin-transform-named-capturing-groups-regex\": \"^7.22.5\",\n        \"@babel/plugin-transform-new-target\": \"^7.24.1\",\n        \"@babel/plugin-transform-nullish-coalescing-operator\": \"^7.24.1\",\n        \"@babel/plugin-transform-numeric-separator\": \"^7.24.1\",\n        \"@babel/plugin-transform-object-rest-spread\": \"^7.24.1\",\n        \"@babel/plugin-transform-object-super\": \"^7.24.1\",\n        \"@babel/plugin-transform-optional-catch-binding\": \"^7.24.1\",\n        \"@babel/plugin-transform-optional-chaining\": \"^7.24.1\",\n        \"@babel/plugin-transform-parameters\": \"^7.24.1\",\n        \"@babel/plugin-transform-private-methods\": \"^7.24.1\",\n        \"@babel/plugin-transform-private-property-in-object\": \"^7.24.1\",\n        \"@babel/plugin-transform-property-literals\": \"^7.24.1\",\n        \"@babel/plugin-transform-regenerator\": \"^7.24.1\",\n        \"@babel/plugin-transform-reserved-words\": \"^7.24.1\",\n        \"@babel/plugin-transform-shorthand-properties\": \"^7.24.1\",\n        \"@babel/plugin-transform-spread\": \"^7.24.1\",\n        \"@babel/plugin-transform-sticky-regex\": \"^7.24.1\",\n        \"@babel/plugin-transform-template-literals\": \"^7.24.1\",\n        \"@babel/plugin-transform-typeof-symbol\": \"^7.24.1\",\n        \"@babel/plugin-transform-unicode-escapes\": \"^7.24.1\",\n        \"@babel/plugin-transform-unicode-property-regex\": \"^7.24.1\",\n        \"@babel/plugin-transform-unicode-regex\": \"^7.24.1\",\n        \"@babel/plugin-transform-unicode-sets-regex\": \"^7.24.1\",\n        \"@babel/preset-modules\": \"0.1.6-no-external-plugins\",\n        \"babel-plugin-polyfill-corejs2\": \"^0.4.10\",\n        \"babel-plugin-polyfill-corejs3\": \"^0.10.4\",\n        \"babel-plugin-polyfill-regenerator\": \"^0.6.1\",\n        \"core-js-compat\": \"^3.31.0\",\n        \"semver\": \"^6.3.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/preset-env/node_modules/semver\": {\n      \"version\": \"6.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n      \"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n      \"dev\": true,\n      \"bin\": {\n        \"semver\": \"bin/semver.js\"\n      }\n    },\n    \"node_modules/@babel/preset-modules\": {\n      \"version\": \"0.1.6-no-external-plugins\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz\",\n      \"integrity\": \"sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.0.0\",\n        \"@babel/types\": \"^7.4.4\",\n        \"esutils\": \"^2.0.2\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0 || ^8.0.0-0 <8.0.0\"\n      }\n    },\n    \"node_modules/@babel/preset-react\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz\",\n      \"integrity\": \"sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/helper-validator-option\": \"^7.23.5\",\n        \"@babel/plugin-transform-react-display-name\": \"^7.24.1\",\n        \"@babel/plugin-transform-react-jsx\": \"^7.23.4\",\n        \"@babel/plugin-transform-react-jsx-development\": \"^7.22.5\",\n        \"@babel/plugin-transform-react-pure-annotations\": \"^7.24.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/preset-typescript\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz\",\n      \"integrity\": \"sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.24.0\",\n        \"@babel/helper-validator-option\": \"^7.23.5\",\n        \"@babel/plugin-syntax-jsx\": \"^7.24.1\",\n        \"@babel/plugin-transform-modules-commonjs\": \"^7.24.1\",\n        \"@babel/plugin-transform-typescript\": \"^7.24.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/regjsgen\": {\n      \"version\": \"0.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz\",\n      \"integrity\": \"sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==\",\n      \"dev\": true\n    },\n    \"node_modules/@babel/runtime\": {\n      \"version\": \"7.24.4\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz\",\n      \"integrity\": \"sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==\",\n      \"dependencies\": {\n        \"regenerator-runtime\": \"^0.14.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/runtime-corejs2\": {\n      \"version\": \"7.24.4\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.24.4.tgz\",\n      \"integrity\": \"sha512-ZCKqyUKt/Coimg+3Kafu43yNetgYnTXzNbEGAgxc81J5sI0qFNbQ613w7PNny+SmijAmGVroL0GDvx5rG/JI5Q==\",\n      \"dependencies\": {\n        \"core-js\": \"^2.6.12\",\n        \"regenerator-runtime\": \"^0.14.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/template\": {\n      \"version\": \"7.24.0\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz\",\n      \"integrity\": \"sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==\",\n      \"dependencies\": {\n        \"@babel/code-frame\": \"^7.23.5\",\n        \"@babel/parser\": \"^7.24.0\",\n        \"@babel/types\": \"^7.24.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/traverse\": {\n      \"version\": \"7.24.1\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz\",\n      \"integrity\": \"sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==\",\n      \"dependencies\": {\n        \"@babel/code-frame\": \"^7.24.1\",\n        \"@babel/generator\": \"^7.24.1\",\n        \"@babel/helper-environment-visitor\": \"^7.22.20\",\n        \"@babel/helper-function-name\": \"^7.23.0\",\n        \"@babel/helper-hoist-variables\": \"^7.22.5\",\n        \"@babel/helper-split-export-declaration\": \"^7.22.6\",\n        \"@babel/parser\": \"^7.24.1\",\n        \"@babel/types\": \"^7.24.0\",\n        \"debug\": \"^4.3.1\",\n        \"globals\": \"^11.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/types\": {\n      \"version\": \"7.24.0\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz\",\n      \"integrity\": \"sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==\",\n      \"dependencies\": {\n        \"@babel/helper-string-parser\": \"^7.23.4\",\n        \"@babel/helper-validator-identifier\": \"^7.22.20\",\n        \"to-fast-properties\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@balena/apple-plist\": {\n      \"version\": \"0.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@balena/apple-plist/-/apple-plist-0.0.3.tgz\",\n      \"integrity\": \"sha512-OCb2lH6twxm0EX4UjMyK9SB8BKqhDA+8NAanThsheALJ2Jys9jsgpnixUakrGaq3qKeNITVoC0NJ4s4Q4bKRfQ==\",\n      \"dependencies\": {\n        \"sax\": \"^1.2.4\"\n      },\n      \"engines\": {\n        \"node\": \">=10.4.0\"\n      }\n    },\n    \"node_modules/@balena/es-version\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@balena/es-version/-/es-version-1.0.3.tgz\",\n      \"integrity\": \"sha512-ER6xtNwBSytZ1E1TmEzcE19mHpfJH8NPItxgGeJZjMYE4k5VHlBorl4UwZkAmsiW4vhy7LgJ+RGvHU15rB1L7g==\"\n    },\n    \"node_modules/@balena/lint\": {\n      \"version\": \"8.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/@balena/lint/-/lint-8.0.2.tgz\",\n      \"integrity\": \"sha512-Efac+rn2cRZUsQF3kLk6Jp5HbkLLtVzwacHa+IaZHejmrB7kqUxCOfD38Y0/2DDDxhNrepjsJY72IOw3jnamJA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@typescript-eslint/eslint-plugin\": \"^7.7.0\",\n        \"@typescript-eslint/parser\": \"^7.7.0\",\n        \"depcheck\": \"^1.4.7\",\n        \"eslint\": \"^8.57.0\",\n        \"eslint-config-prettier\": \"^9.1.0\",\n        \"eslint-plugin-chai-friendly\": \"^0.7.4\",\n        \"eslint-plugin-jsdoc\": \"^48.2.3\",\n        \"eslint-plugin-no-only-tests\": \"^3.1.0\",\n        \"eslint-plugin-react\": \"^7.34.1\",\n        \"glob\": \"^10.3.12\",\n        \"prettier\": \"^3.2.5\",\n        \"typescript\": \"^5.4.5\",\n        \"yargs\": \"^17.7.2\"\n      },\n      \"bin\": {\n        \"balena-lint\": \"bin/balena-lint\"\n      },\n      \"engines\": {\n        \"node\": \">=18.18.0\",\n        \"npm\": \">=9.8.1\"\n      }\n    },\n    \"node_modules/@balena/node-beaglebone-usbboot\": {\n      \"version\": \"3.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@balena/node-beaglebone-usbboot/-/node-beaglebone-usbboot-3.0.4.tgz\",\n      \"integrity\": \"sha512-Y3DrHL5vEIiIZXeMleq8QyaN94TPagDjBEAfdS0CWNeXhsYgu1iZ0j/QXHSJ1ZdpWZt07syPq+su2qEMvYJEkw==\",\n      \"dependencies\": {\n        \"binary-parser-encoder\": \"^1.4.5\",\n        \"debug\": \"^4.3.1\",\n        \"endian-toggle\": \"0.0.0\",\n        \"schemapack\": \"^1.4.2\",\n        \"usb\": \"^2.5.2\"\n      },\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/@balena/node-crc-utils\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/@balena/node-crc-utils/-/node-crc-utils-3.0.1.tgz\",\n      \"integrity\": \"sha512-QIZ+sjCdC7A7zh5ywyc4sKrEUOJS6Dq+k7BPWINFYkQOYbWjnJHq2jfg2HuauorsHTTrYAv5ZlqJnjIThzZIvA==\",\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/@balena/udif\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/@balena/udif/-/udif-1.1.2.tgz\",\n      \"integrity\": \"sha512-DbcRQFTPn/O6QYmRC1qT3YeWKk/2jg90lqER96hexeuynA9/njh5KUViwtGdwZHxhS03ZsQbD2LpNbNW+DvCQQ==\",\n      \"dependencies\": {\n        \"@balena/apple-plist\": \"0.0.3\",\n        \"apple-data-compression\": \"^0.4.1\",\n        \"cyclic-32\": \"^1.1.0\",\n        \"unbzip2-stream\": \"^1.4.3\"\n      }\n    },\n    \"node_modules/@braintree/sanitize-url\": {\n      \"version\": \"6.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz\",\n      \"integrity\": \"sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==\"\n    },\n    \"node_modules/@cspotcode/source-map-support\": {\n      \"version\": \"0.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz\",\n      \"integrity\": \"sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/trace-mapping\": \"0.3.9\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping\": {\n      \"version\": \"0.3.9\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz\",\n      \"integrity\": \"sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/resolve-uri\": \"^3.0.3\",\n        \"@jridgewell/sourcemap-codec\": \"^1.4.10\"\n      }\n    },\n    \"node_modules/@electron-forge/cli\": {\n      \"version\": \"7.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@electron-forge/cli/-/cli-7.8.1.tgz\",\n      \"integrity\": \"sha512-QI3EShutfq9Y+2TWWrPjm4JZM3eSAKzoQvRZdVhAfVpUbyJ8K23VqJShg3kGKlPf9BXHAGvE+8LyH5s2yDr1qA==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://github.com/sponsors/malept\"\n        },\n        {\n          \"type\": \"tidelift\",\n          \"url\": \"https://tidelift.com/subscription/pkg/npm-.electron-forge-cli?utm_medium=referral&utm_source=npm_fund\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@electron-forge/core\": \"7.8.1\",\n        \"@electron-forge/core-utils\": \"7.8.1\",\n        \"@electron-forge/shared-types\": \"7.8.1\",\n        \"@electron/get\": \"^3.0.0\",\n        \"chalk\": \"^4.0.0\",\n        \"commander\": \"^11.1.0\",\n        \"debug\": \"^4.3.1\",\n        \"fs-extra\": \"^10.0.0\",\n        \"listr2\": \"^7.0.2\",\n        \"log-symbols\": \"^4.0.0\",\n        \"semver\": \"^7.2.1\"\n      },\n      \"bin\": {\n        \"electron-forge\": \"dist/electron-forge.js\",\n        \"electron-forge-vscode-nix\": \"script/vscode.sh\",\n        \"electron-forge-vscode-win\": \"script/vscode.cmd\"\n      },\n      \"engines\": {\n        \"node\": \">= 16.4.0\"\n      }\n    },\n    \"node_modules/@electron-forge/core\": {\n      \"version\": \"7.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@electron-forge/core/-/core-7.8.1.tgz\",\n      \"integrity\": \"sha512-jkh0QPW5p0zmruu1E8+2XNufc4UMxy13WLJcm7hn9jbaXKLkMbKuEvhrN1tH/9uGp1mhr/t8sC4N67gP+gS87w==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://github.com/sponsors/malept\"\n        },\n        {\n          \"type\": \"tidelift\",\n          \"url\": \"https://tidelift.com/subscription/pkg/npm-.electron-forge-core?utm_medium=referral&utm_source=npm_fund\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@electron-forge/core-utils\": \"7.8.1\",\n        \"@electron-forge/maker-base\": \"7.8.1\",\n        \"@electron-forge/plugin-base\": \"7.8.1\",\n        \"@electron-forge/publisher-base\": \"7.8.1\",\n        \"@electron-forge/shared-types\": \"7.8.1\",\n        \"@electron-forge/template-base\": \"7.8.1\",\n        \"@electron-forge/template-vite\": \"7.8.1\",\n        \"@electron-forge/template-vite-typescript\": \"7.8.1\",\n        \"@electron-forge/template-webpack\": \"7.8.1\",\n        \"@electron-forge/template-webpack-typescript\": \"7.8.1\",\n        \"@electron-forge/tracer\": \"7.8.1\",\n        \"@electron/get\": \"^3.0.0\",\n        \"@electron/packager\": \"^18.3.5\",\n        \"@electron/rebuild\": \"^3.7.0\",\n        \"@malept/cross-spawn-promise\": \"^2.0.0\",\n        \"chalk\": \"^4.0.0\",\n        \"debug\": \"^4.3.1\",\n        \"fast-glob\": \"^3.2.7\",\n        \"filenamify\": \"^4.1.0\",\n        \"find-up\": \"^5.0.0\",\n        \"fs-extra\": \"^10.0.0\",\n        \"global-dirs\": \"^3.0.0\",\n        \"got\": \"^11.8.5\",\n        \"interpret\": \"^3.1.1\",\n        \"jiti\": \"^2.4.2\",\n        \"listr2\": \"^7.0.2\",\n        \"lodash\": \"^4.17.20\",\n        \"log-symbols\": \"^4.0.0\",\n        \"node-fetch\": \"^2.6.7\",\n        \"rechoir\": \"^0.8.0\",\n        \"semver\": \"^7.2.1\",\n        \"source-map-support\": \"^0.5.13\",\n        \"sudo-prompt\": \"^9.1.1\",\n        \"username\": \"^5.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 16.4.0\"\n      }\n    },\n    \"node_modules/@electron-forge/core-utils\": {\n      \"version\": \"7.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@electron-forge/core-utils/-/core-utils-7.8.1.tgz\",\n      \"integrity\": \"sha512-mRoPLDNZgmjyOURE/K0D3Op53XGFmFRgfIvFC7c9S/BqsRpovVblrqI4XxPRdNmH9dvhd8On9gGz+XIYAKD3aQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@electron-forge/shared-types\": \"7.8.1\",\n        \"@electron/rebuild\": \"^3.7.0\",\n        \"@malept/cross-spawn-promise\": \"^2.0.0\",\n        \"chalk\": \"^4.0.0\",\n        \"debug\": \"^4.3.1\",\n        \"find-up\": \"^5.0.0\",\n        \"fs-extra\": \"^10.0.0\",\n        \"log-symbols\": \"^4.0.0\",\n        \"semver\": \"^7.2.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 16.4.0\"\n      }\n    },\n    \"node_modules/@electron-forge/core/node_modules/global-dirs\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz\",\n      \"integrity\": \"sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ini\": \"2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/@electron-forge/core/node_modules/ini\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ini/-/ini-2.0.0.tgz\",\n      \"integrity\": \"sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/@electron-forge/maker-base\": {\n      \"version\": \"7.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-7.8.1.tgz\",\n      \"integrity\": \"sha512-GUZqschGuEBzSzE0bMeDip65IDds48DZXzldlRwQ+85SYVA6RMU2AwDDqx3YiYsvP2OuxKruuqIJZtOF5ps4FQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@electron-forge/shared-types\": \"7.8.1\",\n        \"fs-extra\": \"^10.0.0\",\n        \"which\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 16.4.0\"\n      }\n    },\n    \"node_modules/@electron-forge/maker-deb\": {\n      \"version\": \"7.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-7.8.1.tgz\",\n      \"integrity\": \"sha512-tjjeesQtCP5Xht1X7gl4+K9bwoETPmQfBkOVAY/FZIxPj40uQh/hOUtLX2tYENNGNVZ1ryDYRs8TuPi+I41Vfw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@electron-forge/maker-base\": \"7.8.1\",\n        \"@electron-forge/shared-types\": \"7.8.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 16.4.0\"\n      },\n      \"optionalDependencies\": {\n        \"electron-installer-debian\": \"^3.2.0\"\n      }\n    },\n    \"node_modules/@electron-forge/maker-dmg\": {\n      \"version\": \"7.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@electron-forge/maker-dmg/-/maker-dmg-7.8.1.tgz\",\n      \"integrity\": \"sha512-l449QvY2Teu+J9rHnjkTHEm/wOJ1LRfmrQ2QkGtFoTRcqvFWdUAEN8nK2/08w3j2h6tvOY3QSUjRzXrhJZRNRA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@electron-forge/maker-base\": \"7.8.1\",\n        \"@electron-forge/shared-types\": \"7.8.1\",\n        \"fs-extra\": \"^10.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 16.4.0\"\n      },\n      \"optionalDependencies\": {\n        \"electron-installer-dmg\": \"^5.0.1\"\n      }\n    },\n    \"node_modules/@electron-forge/maker-rpm\": {\n      \"version\": \"7.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-7.8.1.tgz\",\n      \"integrity\": \"sha512-TF6wylft3BHkw9zdHcxmjEPBZYgTIc0jE31skFnMEQ/aExbNRiNaCZvsXy+7ptTWZxhxUKRc9KHhLFRMCmOK8g==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@electron-forge/maker-base\": \"7.8.1\",\n        \"@electron-forge/shared-types\": \"7.8.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 16.4.0\"\n      },\n      \"optionalDependencies\": {\n        \"electron-installer-redhat\": \"^3.2.0\"\n      }\n    },\n    \"node_modules/@electron-forge/maker-squirrel\": {\n      \"version\": \"7.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-7.8.1.tgz\",\n      \"integrity\": \"sha512-qT1PMvT7ALF0ONOkxlA0oc0PiFuKCAKgoMPoxYo9gGOqFvnAb+TBcnLxflQ4ashE/ZkrHpykr4LcDJxqythQTA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@electron-forge/maker-base\": \"7.8.1\",\n        \"@electron-forge/shared-types\": \"7.8.1\",\n        \"fs-extra\": \"^10.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 16.4.0\"\n      },\n      \"optionalDependencies\": {\n        \"electron-winstaller\": \"^5.3.0\"\n      }\n    },\n    \"node_modules/@electron-forge/maker-zip\": {\n      \"version\": \"7.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-7.8.1.tgz\",\n      \"integrity\": \"sha512-unIxEoV1lnK4BLVqCy3L2y897fTyg8nKY1WT4rrpv0MUKnQG4qmigDfST5zZNNHHaulEn/ElAic2GEiP7d6bhQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@electron-forge/maker-base\": \"7.8.1\",\n        \"@electron-forge/shared-types\": \"7.8.1\",\n        \"cross-zip\": \"^4.0.0\",\n        \"fs-extra\": \"^10.0.0\",\n        \"got\": \"^11.8.5\"\n      },\n      \"engines\": {\n        \"node\": \">= 16.4.0\"\n      }\n    },\n    \"node_modules/@electron-forge/plugin-auto-unpack-natives\": {\n      \"version\": \"7.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@electron-forge/plugin-auto-unpack-natives/-/plugin-auto-unpack-natives-7.8.1.tgz\",\n      \"integrity\": \"sha512-4URAgWX9qqqKe6Bfad0VmpFRrwINYMODfKGd2nFQrfHxmBtdpXnsWlLwVGE/wGssIQaTMI5bWQ6F2RNeXTgnhA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@electron-forge/plugin-base\": \"7.8.1\",\n        \"@electron-forge/shared-types\": \"7.8.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 16.4.0\"\n      }\n    },\n    \"node_modules/@electron-forge/plugin-base\": {\n      \"version\": \"7.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-7.8.1.tgz\",\n      \"integrity\": \"sha512-iCZC2d7CbsZ9l6j5d+KPIiyQx0U1QBfWAbKnnQhWCSizjcrZ7A9V4sMFZeTO6+PVm48b/r9GFPm+slpgZtYQLg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@electron-forge/shared-types\": \"7.8.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 16.4.0\"\n      }\n    },\n    \"node_modules/@electron-forge/plugin-webpack\": {\n      \"version\": \"7.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@electron-forge/plugin-webpack/-/plugin-webpack-7.8.1.tgz\",\n      \"integrity\": \"sha512-4SqQyX7abx6wcMSB8JwsM6gm72r3/8b//JcYZxWihYaqoz9ZMWQqci47FFSpncRlYZjUi7mbRpC2dSAjuQks2A==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@electron-forge/core-utils\": \"7.8.1\",\n        \"@electron-forge/plugin-base\": \"7.8.1\",\n        \"@electron-forge/shared-types\": \"7.8.1\",\n        \"@electron-forge/web-multi-logger\": \"7.8.1\",\n        \"chalk\": \"^4.0.0\",\n        \"debug\": \"^4.3.1\",\n        \"fast-glob\": \"^3.2.7\",\n        \"fs-extra\": \"^10.0.0\",\n        \"html-webpack-plugin\": \"^5.5.3\",\n        \"listr2\": \"^7.0.2\",\n        \"webpack\": \"^5.69.1\",\n        \"webpack-dev-server\": \"^4.0.0\",\n        \"webpack-merge\": \"^5.7.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 16.4.0\"\n      }\n    },\n    \"node_modules/@electron-forge/publisher-base\": {\n      \"version\": \"7.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-7.8.1.tgz\",\n      \"integrity\": \"sha512-z2C+C4pcFxyCXIFwXGDcxhU8qtVUPZa3sPL6tH5RuMxJi77768chLw2quDWk2/dfupcSELXcOMYCs7aLysCzeQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@electron-forge/shared-types\": \"7.8.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 16.4.0\"\n      }\n    },\n    \"node_modules/@electron-forge/shared-types\": {\n      \"version\": \"7.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-7.8.1.tgz\",\n      \"integrity\": \"sha512-guLyGjIISKQQRWHX+ugmcjIOjn2q/BEzCo3ioJXFowxiFwmZw/oCZ2KlPig/t6dMqgUrHTH5W/F0WKu0EY4M+Q==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@electron-forge/tracer\": \"7.8.1\",\n        \"@electron/packager\": \"^18.3.5\",\n        \"@electron/rebuild\": \"^3.7.0\",\n        \"listr2\": \"^7.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 16.4.0\"\n      }\n    },\n    \"node_modules/@electron-forge/template-base\": {\n      \"version\": \"7.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@electron-forge/template-base/-/template-base-7.8.1.tgz\",\n      \"integrity\": \"sha512-k8jEUr0zWFWb16ZGho+Es2OFeKkcbTgbC6mcH4eNyF/sumh/4XZMcwRtX1i7EiZAYiL9sVxyI6KVwGu254g+0g==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@electron-forge/core-utils\": \"7.8.1\",\n        \"@electron-forge/shared-types\": \"7.8.1\",\n        \"@malept/cross-spawn-promise\": \"^2.0.0\",\n        \"debug\": \"^4.3.1\",\n        \"fs-extra\": \"^10.0.0\",\n        \"username\": \"^5.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 16.4.0\"\n      }\n    },\n    \"node_modules/@electron-forge/template-vite\": {\n      \"version\": \"7.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@electron-forge/template-vite/-/template-vite-7.8.1.tgz\",\n      \"integrity\": \"sha512-qzSlJaBYYqQAbBdLk4DqAE3HCNz4yXbpkb+VC74ddL4JGwPdPU57DjCthr6YetKJ2FsOVy9ipovA8HX5UbXpAg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@electron-forge/shared-types\": \"7.8.1\",\n        \"@electron-forge/template-base\": \"7.8.1\",\n        \"fs-extra\": \"^10.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 16.4.0\"\n      }\n    },\n    \"node_modules/@electron-forge/template-vite-typescript\": {\n      \"version\": \"7.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@electron-forge/template-vite-typescript/-/template-vite-typescript-7.8.1.tgz\",\n      \"integrity\": \"sha512-CccQhwUjZcc6svzuOi3BtbDal591DzyX2J5GPa6mwVutDP8EMtqJL1VyOHdcWO/7XjI6GNAD0fiXySOJiUAECA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@electron-forge/shared-types\": \"7.8.1\",\n        \"@electron-forge/template-base\": \"7.8.1\",\n        \"fs-extra\": \"^10.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 16.4.0\"\n      }\n    },\n    \"node_modules/@electron-forge/template-webpack\": {\n      \"version\": \"7.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-7.8.1.tgz\",\n      \"integrity\": \"sha512-DA77o9kTCHrq+W211pyNP49DyAt0d1mzMp2gisyNz7a+iKvlv2DsMAeRieLoCQ44akb/z8ZsL0YLteSjKLy4AA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@electron-forge/shared-types\": \"7.8.1\",\n        \"@electron-forge/template-base\": \"7.8.1\",\n        \"fs-extra\": \"^10.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 16.4.0\"\n      }\n    },\n    \"node_modules/@electron-forge/template-webpack-typescript\": {\n      \"version\": \"7.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-7.8.1.tgz\",\n      \"integrity\": \"sha512-h922E+6zWwym1RT6WKD79BLTc4H8YxEMJ7wPWkBX59kw/exsTB/KFdiJq6r82ON5jSJ+Q8sDGqSmDWdyCfo+Gg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@electron-forge/shared-types\": \"7.8.1\",\n        \"@electron-forge/template-base\": \"7.8.1\",\n        \"fs-extra\": \"^10.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 16.4.0\"\n      }\n    },\n    \"node_modules/@electron-forge/tracer\": {\n      \"version\": \"7.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@electron-forge/tracer/-/tracer-7.8.1.tgz\",\n      \"integrity\": \"sha512-r2i7aHVp2fylGQSPDw3aTcdNfVX9cpL1iL2MKHrCRNwgrfR+nryGYg434T745GGm1rNQIv5Egdkh5G9xf00oWA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"chrome-trace-event\": \"^1.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 14.17.5\"\n      }\n    },\n    \"node_modules/@electron-forge/web-multi-logger\": {\n      \"version\": \"7.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@electron-forge/web-multi-logger/-/web-multi-logger-7.8.1.tgz\",\n      \"integrity\": \"sha512-Z8oU39sbrVDvyk0yILBqL0CFIysVlxkM5m4RWyeo+GLoc/t4LYAhGLSquFTOD1t20nzqZzgzG8M56zIgYuyX1w==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"express\": \"^4.17.1\",\n        \"express-ws\": \"^5.0.2\",\n        \"xterm\": \"^4.9.0\",\n        \"xterm-addon-fit\": \"^0.5.0\",\n        \"xterm-addon-search\": \"^0.8.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 16.4.0\"\n      }\n    },\n    \"node_modules/@electron/asar\": {\n      \"version\": \"3.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz\",\n      \"integrity\": \"sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"commander\": \"^5.0.0\",\n        \"glob\": \"^7.1.6\",\n        \"minimatch\": \"^3.0.4\"\n      },\n      \"bin\": {\n        \"asar\": \"bin/asar.js\"\n      },\n      \"engines\": {\n        \"node\": \">=10.12.0\"\n      }\n    },\n    \"node_modules/@electron/asar/node_modules/commander\": {\n      \"version\": \"5.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-5.1.0.tgz\",\n      \"integrity\": \"sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/@electron/asar/node_modules/glob\": {\n      \"version\": \"7.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-7.2.3.tgz\",\n      \"integrity\": \"sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"fs.realpath\": \"^1.0.0\",\n        \"inflight\": \"^1.0.4\",\n        \"inherits\": \"2\",\n        \"minimatch\": \"^3.1.1\",\n        \"once\": \"^1.3.0\",\n        \"path-is-absolute\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/@electron/get\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@electron/get/-/get-3.0.0.tgz\",\n      \"integrity\": \"sha512-hLv4BYFiyrNRI+U0Mm2X7RxCCdJLkDUn8GCEp9QJzbLpZRko+UaLlCjOMkj6TEtirNLPyBA7y1SeGfnpOB21aQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"debug\": \"^4.1.1\",\n        \"env-paths\": \"^2.2.0\",\n        \"fs-extra\": \"^8.1.0\",\n        \"got\": \"^11.8.5\",\n        \"progress\": \"^2.0.3\",\n        \"semver\": \"^6.2.0\",\n        \"sumchecker\": \"^3.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"optionalDependencies\": {\n        \"global-agent\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/@electron/get/node_modules/fs-extra\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz\",\n      \"integrity\": \"sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"graceful-fs\": \"^4.2.0\",\n        \"jsonfile\": \"^4.0.0\",\n        \"universalify\": \"^0.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6 <7 || >=8\"\n      }\n    },\n    \"node_modules/@electron/get/node_modules/jsonfile\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz\",\n      \"integrity\": \"sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==\",\n      \"dev\": true,\n      \"optionalDependencies\": {\n        \"graceful-fs\": \"^4.1.6\"\n      }\n    },\n    \"node_modules/@electron/get/node_modules/semver\": {\n      \"version\": \"6.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n      \"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n      \"dev\": true,\n      \"bin\": {\n        \"semver\": \"bin/semver.js\"\n      }\n    },\n    \"node_modules/@electron/get/node_modules/universalify\": {\n      \"version\": \"0.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz\",\n      \"integrity\": \"sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 4.0.0\"\n      }\n    },\n    \"node_modules/@electron/node-gyp\": {\n      \"version\": \"10.2.0-electron.1\",\n      \"resolved\": \"git+ssh://git@github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2\",\n      \"integrity\": \"sha512-CrYo6TntjpoMO1SHjl5Pa/JoUsECNqNdB7Kx49WLQpWzPw53eEITJ2Hs9fh/ryUYDn4pxZz11StaBYBrLFJdqg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"env-paths\": \"^2.2.0\",\n        \"exponential-backoff\": \"^3.1.1\",\n        \"glob\": \"^8.1.0\",\n        \"graceful-fs\": \"^4.2.6\",\n        \"make-fetch-happen\": \"^10.2.1\",\n        \"nopt\": \"^6.0.0\",\n        \"proc-log\": \"^2.0.1\",\n        \"semver\": \"^7.3.5\",\n        \"tar\": \"^6.2.1\",\n        \"which\": \"^2.0.2\"\n      },\n      \"bin\": {\n        \"node-gyp\": \"bin/node-gyp.js\"\n      },\n      \"engines\": {\n        \"node\": \">=12.13.0\"\n      }\n    },\n    \"node_modules/@electron/node-gyp/node_modules/brace-expansion\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz\",\n      \"integrity\": \"sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/@electron/node-gyp/node_modules/glob\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-8.1.0.tgz\",\n      \"integrity\": \"sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==\",\n      \"deprecated\": \"Glob versions prior to v9 are no longer supported\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"fs.realpath\": \"^1.0.0\",\n        \"inflight\": \"^1.0.4\",\n        \"inherits\": \"2\",\n        \"minimatch\": \"^5.0.1\",\n        \"once\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/@electron/node-gyp/node_modules/minimatch\": {\n      \"version\": \"5.1.6\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz\",\n      \"integrity\": \"sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/@electron/notarize\": {\n      \"version\": \"2.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz\",\n      \"integrity\": \"sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"debug\": \"^4.1.1\",\n        \"fs-extra\": \"^9.0.1\",\n        \"promise-retry\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.0.0\"\n      }\n    },\n    \"node_modules/@electron/notarize/node_modules/fs-extra\": {\n      \"version\": \"9.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz\",\n      \"integrity\": \"sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"at-least-node\": \"^1.0.0\",\n        \"graceful-fs\": \"^4.2.0\",\n        \"jsonfile\": \"^6.0.1\",\n        \"universalify\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/@electron/osx-sign\": {\n      \"version\": \"1.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz\",\n      \"integrity\": \"sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==\",\n      \"dev\": true,\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"compare-version\": \"^0.1.2\",\n        \"debug\": \"^4.3.4\",\n        \"fs-extra\": \"^10.0.0\",\n        \"isbinaryfile\": \"^4.0.8\",\n        \"minimist\": \"^1.2.6\",\n        \"plist\": \"^3.0.5\"\n      },\n      \"bin\": {\n        \"electron-osx-flat\": \"bin/electron-osx-flat.js\",\n        \"electron-osx-sign\": \"bin/electron-osx-sign.js\"\n      },\n      \"engines\": {\n        \"node\": \">=12.0.0\"\n      }\n    },\n    \"node_modules/@electron/packager\": {\n      \"version\": \"18.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/@electron/packager/-/packager-18.3.6.tgz\",\n      \"integrity\": \"sha512-1eXHB5t+SQKvUiDpWGpvr90ZSSbXj+isrh3YbjCTjKT4bE4SQrKSBfukEAaBvp67+GXHFtCHjQgN9qSTFIge+Q==\",\n      \"dev\": true,\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"@electron/asar\": \"^3.2.13\",\n        \"@electron/get\": \"^3.0.0\",\n        \"@electron/notarize\": \"^2.1.0\",\n        \"@electron/osx-sign\": \"^1.0.5\",\n        \"@electron/universal\": \"^2.0.1\",\n        \"@electron/windows-sign\": \"^1.0.0\",\n        \"debug\": \"^4.0.1\",\n        \"extract-zip\": \"^2.0.0\",\n        \"filenamify\": \"^4.1.0\",\n        \"fs-extra\": \"^11.1.0\",\n        \"galactus\": \"^1.0.0\",\n        \"get-package-info\": \"^1.0.0\",\n        \"junk\": \"^3.1.0\",\n        \"parse-author\": \"^2.0.0\",\n        \"plist\": \"^3.0.0\",\n        \"resedit\": \"^2.0.0\",\n        \"resolve\": \"^1.1.6\",\n        \"semver\": \"^7.1.3\",\n        \"yargs-parser\": \"^21.1.1\"\n      },\n      \"bin\": {\n        \"electron-packager\": \"bin/electron-packager.js\"\n      },\n      \"engines\": {\n        \"node\": \">= 16.13.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/electron/packager?sponsor=1\"\n      }\n    },\n    \"node_modules/@electron/packager/node_modules/fs-extra\": {\n      \"version\": \"11.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz\",\n      \"integrity\": \"sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"graceful-fs\": \"^4.2.0\",\n        \"jsonfile\": \"^6.0.1\",\n        \"universalify\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14.14\"\n      }\n    },\n    \"node_modules/@electron/rebuild\": {\n      \"version\": \"3.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.7.2.tgz\",\n      \"integrity\": \"sha512-19/KbIR/DAxbsCkiaGMXIdPnMCJLkcf8AvGnduJtWBs/CBwiAjY1apCqOLVxrXg+rtXFCngbXhBanWjxLUt1Mg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@electron/node-gyp\": \"git+https://github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2\",\n        \"@malept/cross-spawn-promise\": \"^2.0.0\",\n        \"chalk\": \"^4.0.0\",\n        \"debug\": \"^4.1.1\",\n        \"detect-libc\": \"^2.0.1\",\n        \"fs-extra\": \"^10.0.0\",\n        \"got\": \"^11.7.0\",\n        \"node-abi\": \"^3.45.0\",\n        \"node-api-version\": \"^0.2.0\",\n        \"ora\": \"^5.1.0\",\n        \"read-binary-file-arch\": \"^1.0.6\",\n        \"semver\": \"^7.3.5\",\n        \"tar\": \"^6.0.5\",\n        \"yargs\": \"^17.0.1\"\n      },\n      \"bin\": {\n        \"electron-rebuild\": \"lib/cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=12.13.0\"\n      }\n    },\n    \"node_modules/@electron/remote\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/@electron/remote/-/remote-2.1.2.tgz\",\n      \"integrity\": \"sha512-EPwNx+nhdrTBxyCqXt/pftoQg/ybtWDW3DUWHafejvnB1ZGGfMpv6e15D8KeempocjXe78T7WreyGGb3mlZxdA==\",\n      \"peerDependencies\": {\n        \"electron\": \">= 13.0.0\"\n      }\n    },\n    \"node_modules/@electron/universal\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz\",\n      \"integrity\": \"sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@electron/asar\": \"^3.3.1\",\n        \"@malept/cross-spawn-promise\": \"^2.0.0\",\n        \"debug\": \"^4.3.1\",\n        \"dir-compare\": \"^4.2.0\",\n        \"fs-extra\": \"^11.1.1\",\n        \"minimatch\": \"^9.0.3\",\n        \"plist\": \"^3.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=16.4\"\n      }\n    },\n    \"node_modules/@electron/universal/node_modules/brace-expansion\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz\",\n      \"integrity\": \"sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/@electron/universal/node_modules/fs-extra\": {\n      \"version\": \"11.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz\",\n      \"integrity\": \"sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"graceful-fs\": \"^4.2.0\",\n        \"jsonfile\": \"^6.0.1\",\n        \"universalify\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14.14\"\n      }\n    },\n    \"node_modules/@electron/universal/node_modules/minimatch\": {\n      \"version\": \"9.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz\",\n      \"integrity\": \"sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/@electron/windows-sign\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.1.2.tgz\",\n      \"integrity\": \"sha512-eXEiZjDtxW3QORCWfRUarANPRTlH9B6At4jqBZJ0NzokSGutXQUVLPA6WmGpIhDW6w2yCMdHW1EJd1HrXtU5sg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"cross-dirname\": \"^0.1.0\",\n        \"debug\": \"^4.3.4\",\n        \"fs-extra\": \"^11.1.1\",\n        \"minimist\": \"^1.2.8\",\n        \"postject\": \"^1.0.0-alpha.6\"\n      },\n      \"bin\": {\n        \"electron-windows-sign\": \"bin/electron-windows-sign.js\"\n      },\n      \"engines\": {\n        \"node\": \">=14.14\"\n      }\n    },\n    \"node_modules/@electron/windows-sign/node_modules/fs-extra\": {\n      \"version\": \"11.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz\",\n      \"integrity\": \"sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"graceful-fs\": \"^4.2.0\",\n        \"jsonfile\": \"^6.0.1\",\n        \"universalify\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14.14\"\n      }\n    },\n    \"node_modules/@emotion/is-prop-valid\": {\n      \"version\": \"1.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz\",\n      \"integrity\": \"sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==\",\n      \"dependencies\": {\n        \"@emotion/memoize\": \"^0.8.1\"\n      }\n    },\n    \"node_modules/@emotion/memoize\": {\n      \"version\": \"0.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz\",\n      \"integrity\": \"sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==\"\n    },\n    \"node_modules/@emotion/stylis\": {\n      \"version\": \"0.8.5\",\n      \"resolved\": \"https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz\",\n      \"integrity\": \"sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==\"\n    },\n    \"node_modules/@emotion/unitless\": {\n      \"version\": \"0.7.5\",\n      \"resolved\": \"https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz\",\n      \"integrity\": \"sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==\"\n    },\n    \"node_modules/@es-joy/jsdoccomment\": {\n      \"version\": \"0.42.0\",\n      \"resolved\": \"https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.42.0.tgz\",\n      \"integrity\": \"sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"comment-parser\": \"1.4.1\",\n        \"esquery\": \"^1.5.0\",\n        \"jsdoc-type-pratt-parser\": \"~4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/@eslint-community/eslint-utils\": {\n      \"version\": \"4.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz\",\n      \"integrity\": \"sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"eslint-visitor-keys\": \"^3.3.0\"\n      },\n      \"engines\": {\n        \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n      },\n      \"peerDependencies\": {\n        \"eslint\": \"^6.0.0 || ^7.0.0 || >=8.0.0\"\n      }\n    },\n    \"node_modules/@eslint-community/regexpp\": {\n      \"version\": \"4.10.0\",\n      \"resolved\": \"https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz\",\n      \"integrity\": \"sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.0.0 || ^14.0.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/@eslint/eslintrc\": {\n      \"version\": \"2.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz\",\n      \"integrity\": \"sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ajv\": \"^6.12.4\",\n        \"debug\": \"^4.3.2\",\n        \"espree\": \"^9.6.0\",\n        \"globals\": \"^13.19.0\",\n        \"ignore\": \"^5.2.0\",\n        \"import-fresh\": \"^3.2.1\",\n        \"js-yaml\": \"^4.1.0\",\n        \"minimatch\": \"^3.1.2\",\n        \"strip-json-comments\": \"^3.1.1\"\n      },\n      \"engines\": {\n        \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/eslint\"\n      }\n    },\n    \"node_modules/@eslint/eslintrc/node_modules/globals\": {\n      \"version\": \"13.24.0\",\n      \"resolved\": \"https://registry.npmjs.org/globals/-/globals-13.24.0.tgz\",\n      \"integrity\": \"sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"type-fest\": \"^0.20.2\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/@eslint/eslintrc/node_modules/type-fest\": {\n      \"version\": \"0.20.2\",\n      \"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz\",\n      \"integrity\": \"sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/@eslint/js\": {\n      \"version\": \"8.57.0\",\n      \"resolved\": \"https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz\",\n      \"integrity\": \"sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/@fortawesome/fontawesome-common-types\": {\n      \"version\": \"6.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz\",\n      \"integrity\": \"sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==\",\n      \"hasInstallScript\": true,\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/@fortawesome/fontawesome-free\": {\n      \"version\": \"6.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.5.2.tgz\",\n      \"integrity\": \"sha512-hRILoInAx8GNT5IMkrtIt9blOdrqHOnPBH+k70aWUAqPZPgopb9G5EQJFpaBx/S8zp2fC+mPW349Bziuk1o28Q==\",\n      \"hasInstallScript\": true,\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/@fortawesome/fontawesome-svg-core\": {\n      \"version\": \"6.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.2.tgz\",\n      \"integrity\": \"sha512-5CdaCBGl8Rh9ohNdxeeTMxIj8oc3KNBgIeLMvJosBMdslK/UnEB8rzyDRrbKdL1kDweqBPo4GT9wvnakHWucZw==\",\n      \"hasInstallScript\": true,\n      \"dependencies\": {\n        \"@fortawesome/fontawesome-common-types\": \"6.5.2\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/@fortawesome/free-regular-svg-icons\": {\n      \"version\": \"6.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.5.2.tgz\",\n      \"integrity\": \"sha512-iabw/f5f8Uy2nTRtJ13XZTS1O5+t+anvlamJ3zJGLEVE2pKsAWhPv2lq01uQlfgCX7VaveT3EVs515cCN9jRbw==\",\n      \"hasInstallScript\": true,\n      \"dependencies\": {\n        \"@fortawesome/fontawesome-common-types\": \"6.5.2\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/@fortawesome/free-solid-svg-icons\": {\n      \"version\": \"6.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.2.tgz\",\n      \"integrity\": \"sha512-QWFZYXFE7O1Gr1dTIp+D6UcFUF0qElOnZptpi7PBUMylJh+vFmIedVe1Ir6RM1t2tEQLLSV1k7bR4o92M+uqlw==\",\n      \"hasInstallScript\": true,\n      \"dependencies\": {\n        \"@fortawesome/fontawesome-common-types\": \"6.5.2\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/@fortawesome/react-fontawesome\": {\n      \"version\": \"0.1.19\",\n      \"resolved\": \"https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz\",\n      \"integrity\": \"sha512-Hyb+lB8T18cvLNX0S3llz7PcSOAJMLwiVKBuuzwM/nI5uoBw+gQjnf9il0fR1C3DKOI5Kc79pkJ4/xB0Uw9aFQ==\",\n      \"dependencies\": {\n        \"prop-types\": \"^15.8.1\"\n      },\n      \"peerDependencies\": {\n        \"@fortawesome/fontawesome-svg-core\": \"~1 || ~6\",\n        \"react\": \">=16.x\"\n      }\n    },\n    \"node_modules/@gar/promisify\": {\n      \"version\": \"1.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz\",\n      \"integrity\": \"sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@googlemaps/js-api-loader\": {\n      \"version\": \"1.16.2\",\n      \"resolved\": \"https://registry.npmjs.org/@googlemaps/js-api-loader/-/js-api-loader-1.16.2.tgz\",\n      \"integrity\": \"sha512-psGw5u0QM6humao48Hn4lrChOM2/rA43ZCm3tKK9qQsEj1/VzqkCqnvGfEOshDbBQflydfaRovbKwZMF4AyqbA==\",\n      \"dependencies\": {\n        \"fast-deep-equal\": \"^3.1.3\"\n      }\n    },\n    \"node_modules/@googlemaps/markerclusterer\": {\n      \"version\": \"2.5.3\",\n      \"resolved\": \"https://registry.npmjs.org/@googlemaps/markerclusterer/-/markerclusterer-2.5.3.tgz\",\n      \"integrity\": \"sha512-x7lX0R5yYOoiNectr10wLgCBasNcXFHiADIBdmn7jQllF2B5ENQw5XtZK+hIw4xnV0Df0xhN4LN98XqA5jaiOw==\",\n      \"dependencies\": {\n        \"fast-deep-equal\": \"^3.1.3\",\n        \"supercluster\": \"^8.0.1\"\n      }\n    },\n    \"node_modules/@humanwhocodes/config-array\": {\n      \"version\": \"0.11.14\",\n      \"resolved\": \"https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz\",\n      \"integrity\": \"sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@humanwhocodes/object-schema\": \"^2.0.2\",\n        \"debug\": \"^4.3.1\",\n        \"minimatch\": \"^3.0.5\"\n      },\n      \"engines\": {\n        \"node\": \">=10.10.0\"\n      }\n    },\n    \"node_modules/@humanwhocodes/module-importer\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz\",\n      \"integrity\": \"sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12.22\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/nzakas\"\n      }\n    },\n    \"node_modules/@humanwhocodes/object-schema\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz\",\n      \"integrity\": \"sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==\",\n      \"dev\": true\n    },\n    \"node_modules/@isaacs/cliui\": {\n      \"version\": \"8.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz\",\n      \"integrity\": \"sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==\",\n      \"dependencies\": {\n        \"string-width\": \"^5.1.2\",\n        \"string-width-cjs\": \"npm:string-width@^4.2.0\",\n        \"strip-ansi\": \"^7.0.1\",\n        \"strip-ansi-cjs\": \"npm:strip-ansi@^6.0.1\",\n        \"wrap-ansi\": \"^8.1.0\",\n        \"wrap-ansi-cjs\": \"npm:wrap-ansi@^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/@isaacs/cliui/node_modules/ansi-styles\": {\n      \"version\": \"6.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz\",\n      \"integrity\": \"sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==\",\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/@isaacs/cliui/node_modules/emoji-regex\": {\n      \"version\": \"9.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz\",\n      \"integrity\": \"sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==\"\n    },\n    \"node_modules/@isaacs/cliui/node_modules/string-width\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz\",\n      \"integrity\": \"sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==\",\n      \"dependencies\": {\n        \"eastasianwidth\": \"^0.2.0\",\n        \"emoji-regex\": \"^9.2.2\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/@isaacs/cliui/node_modules/wrap-ansi\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz\",\n      \"integrity\": \"sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^6.1.0\",\n        \"string-width\": \"^5.0.1\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/@jest/expect-utils\": {\n      \"version\": \"29.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz\",\n      \"integrity\": \"sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"jest-get-type\": \"^29.6.3\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/@jest/schemas\": {\n      \"version\": \"29.6.3\",\n      \"resolved\": \"https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz\",\n      \"integrity\": \"sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@sinclair/typebox\": \"^0.27.8\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/@jest/types\": {\n      \"version\": \"29.6.3\",\n      \"resolved\": \"https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz\",\n      \"integrity\": \"sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jest/schemas\": \"^29.6.3\",\n        \"@types/istanbul-lib-coverage\": \"^2.0.0\",\n        \"@types/istanbul-reports\": \"^3.0.0\",\n        \"@types/node\": \"*\",\n        \"@types/yargs\": \"^17.0.8\",\n        \"chalk\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/@jridgewell/gen-mapping\": {\n      \"version\": \"0.3.5\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz\",\n      \"integrity\": \"sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==\",\n      \"dependencies\": {\n        \"@jridgewell/set-array\": \"^1.2.1\",\n        \"@jridgewell/sourcemap-codec\": \"^1.4.10\",\n        \"@jridgewell/trace-mapping\": \"^0.3.24\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@jridgewell/resolve-uri\": {\n      \"version\": \"3.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz\",\n      \"integrity\": \"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==\",\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@jridgewell/set-array\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz\",\n      \"integrity\": \"sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==\",\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@jridgewell/source-map\": {\n      \"version\": \"0.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz\",\n      \"integrity\": \"sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/gen-mapping\": \"^0.3.5\",\n        \"@jridgewell/trace-mapping\": \"^0.3.25\"\n      }\n    },\n    \"node_modules/@jridgewell/sourcemap-codec\": {\n      \"version\": \"1.4.15\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz\",\n      \"integrity\": \"sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==\"\n    },\n    \"node_modules/@jridgewell/trace-mapping\": {\n      \"version\": \"0.3.25\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz\",\n      \"integrity\": \"sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==\",\n      \"dependencies\": {\n        \"@jridgewell/resolve-uri\": \"^3.1.0\",\n        \"@jridgewell/sourcemap-codec\": \"^1.4.14\"\n      }\n    },\n    \"node_modules/@leichtgewicht/ip-codec\": {\n      \"version\": \"2.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz\",\n      \"integrity\": \"sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==\",\n      \"dev\": true\n    },\n    \"node_modules/@ljharb/through\": {\n      \"version\": \"2.3.13\",\n      \"resolved\": \"https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz\",\n      \"integrity\": \"sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.7\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/@malept/cross-spawn-promise\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz\",\n      \"integrity\": \"sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://github.com/sponsors/malept\"\n        },\n        {\n          \"type\": \"tidelift\",\n          \"url\": \"https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund\"\n        }\n      ],\n      \"dependencies\": {\n        \"cross-spawn\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 12.13.0\"\n      }\n    },\n    \"node_modules/@mapbox/hast-util-table-cell-style\": {\n      \"version\": \"0.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.1.tgz\",\n      \"integrity\": \"sha512-LyQz4XJIdCdY/+temIhD/Ed0x/p4GAOUycpFSEK2Ads1CPKZy6b7V/2ROEtQiLLQ8soIs0xe/QAoR6kwpyW/yw==\",\n      \"dependencies\": {\n        \"unist-util-visit\": \"^1.4.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-is\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz\",\n      \"integrity\": \"sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==\"\n    },\n    \"node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit\": {\n      \"version\": \"1.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz\",\n      \"integrity\": \"sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==\",\n      \"dependencies\": {\n        \"unist-util-visit-parents\": \"^2.0.0\"\n      }\n    },\n    \"node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit-parents\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz\",\n      \"integrity\": \"sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==\",\n      \"dependencies\": {\n        \"unist-util-is\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/@mapbox/rehype-prism\": {\n      \"version\": \"0.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/@mapbox/rehype-prism/-/rehype-prism-0.8.0.tgz\",\n      \"integrity\": \"sha512-bIz4a3oZ8g+pQBHSMMIxNpYOMX4yq4aZdpezoiCl9yJudh1Z9SRmHQqH6f+WtTBNOORzXMEGkvBze4PiH17wtA==\",\n      \"dependencies\": {\n        \"hast-util-to-string\": \"^1.0.4\",\n        \"mrm\": \"^3.0.9\",\n        \"refractor\": \"^3.4.0\",\n        \"unist-util-visit\": \"^2.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/@nodelib/fs.scandir\": {\n      \"version\": \"2.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz\",\n      \"integrity\": \"sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@nodelib/fs.stat\": \"2.0.5\",\n        \"run-parallel\": \"^1.1.9\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/@nodelib/fs.stat\": {\n      \"version\": \"2.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz\",\n      \"integrity\": \"sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/@nodelib/fs.walk\": {\n      \"version\": \"1.2.8\",\n      \"resolved\": \"https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz\",\n      \"integrity\": \"sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@nodelib/fs.scandir\": \"2.1.5\",\n        \"fastq\": \"^1.6.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/@npmcli/fs\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz\",\n      \"integrity\": \"sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"@gar/promisify\": \"^1.1.3\",\n        \"semver\": \"^7.3.5\"\n      },\n      \"engines\": {\n        \"node\": \"^12.13.0 || ^14.15.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/@npmcli/move-file\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz\",\n      \"integrity\": \"sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==\",\n      \"deprecated\": \"This functionality has been moved to @npmcli/fs\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"mkdirp\": \"^1.0.4\",\n        \"rimraf\": \"^3.0.2\"\n      },\n      \"engines\": {\n        \"node\": \"^12.13.0 || ^14.15.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/@pkgjs/parseargs\": {\n      \"version\": \"0.11.0\",\n      \"resolved\": \"https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz\",\n      \"integrity\": \"sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      }\n    },\n    \"node_modules/@promptbook/utils\": {\n      \"version\": \"0.44.0-17\",\n      \"resolved\": \"https://registry.npmjs.org/@promptbook/utils/-/utils-0.44.0-17.tgz\",\n      \"integrity\": \"sha512-OuXA53dX5qUNgPf4uhPZU5jpRRE5Bp++2Su57z2hqEMaT4qvT34SyZbqetx+jaYu4E+wJL/A7UNWl96dAKxkSw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"moment\": \"^2.30.1\",\n        \"prettier\": \"2.8.1\",\n        \"spacetrim\": \"0.11.20\"\n      }\n    },\n    \"node_modules/@promptbook/utils/node_modules/prettier\": {\n      \"version\": \"2.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz\",\n      \"integrity\": \"sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==\",\n      \"dev\": true,\n      \"bin\": {\n        \"prettier\": \"bin-prettier.js\"\n      },\n      \"engines\": {\n        \"node\": \">=10.13.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/prettier/prettier?sponsor=1\"\n      }\n    },\n    \"node_modules/@puppeteer/browsers\": {\n      \"version\": \"1.9.1\",\n      \"resolved\": \"https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.9.1.tgz\",\n      \"integrity\": \"sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"debug\": \"4.3.4\",\n        \"extract-zip\": \"2.0.1\",\n        \"progress\": \"2.0.3\",\n        \"proxy-agent\": \"6.3.1\",\n        \"tar-fs\": \"3.0.4\",\n        \"unbzip2-stream\": \"1.4.3\",\n        \"yargs\": \"17.7.2\"\n      },\n      \"bin\": {\n        \"browsers\": \"lib/cjs/main-cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=16.3.0\"\n      }\n    },\n    \"node_modules/@react-google-maps/api\": {\n      \"version\": \"2.19.3\",\n      \"resolved\": \"https://registry.npmjs.org/@react-google-maps/api/-/api-2.19.3.tgz\",\n      \"integrity\": \"sha512-jiLqvuOt5lOowkLeq7d077AByTyJp+s6hZVlLhlq7SBacBD37aUNpXBz2OsazfeR6Aw4a+9RRhAEjEFvrR1f5A==\",\n      \"dependencies\": {\n        \"@googlemaps/js-api-loader\": \"1.16.2\",\n        \"@googlemaps/markerclusterer\": \"2.5.3\",\n        \"@react-google-maps/infobox\": \"2.19.2\",\n        \"@react-google-maps/marker-clusterer\": \"2.19.2\",\n        \"@types/google.maps\": \"3.55.2\",\n        \"invariant\": \"2.2.4\"\n      },\n      \"peerDependencies\": {\n        \"react\": \"^16.8 || ^17 || ^18\",\n        \"react-dom\": \"^16.8 || ^17 || ^18\"\n      }\n    },\n    \"node_modules/@react-google-maps/infobox\": {\n      \"version\": \"2.19.2\",\n      \"resolved\": \"https://registry.npmjs.org/@react-google-maps/infobox/-/infobox-2.19.2.tgz\",\n      \"integrity\": \"sha512-6wvBqeJsQ/eFSvoxg+9VoncQvNoVCdmxzxRpLvmjPD+nNC6mHM0vJH1xSqaKijkMrfLJT0nfkTGpovrF896jwg==\"\n    },\n    \"node_modules/@react-google-maps/marker-clusterer\": {\n      \"version\": \"2.19.2\",\n      \"resolved\": \"https://registry.npmjs.org/@react-google-maps/marker-clusterer/-/marker-clusterer-2.19.2.tgz\",\n      \"integrity\": \"sha512-x9ibmsP0ZVqzyCo1Pitbw+4b6iEXRw/r1TCy3vOUR3eKrzWLnHYZMR325BkZW2r8fnuWE/V3Fp4QZOP9qYORCw==\"\n    },\n    \"node_modules/@reforged/maker-appimage\": {\n      \"version\": \"3.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/@reforged/maker-appimage/-/maker-appimage-3.3.2.tgz\",\n      \"integrity\": \"sha512-TFuDzNTZfUe9ugwHNYY/xed2S/ec3Az4js8qWXZ9bx3fKa82vq1h+y0uKjkatWnCUotX5pwg/APdqzcm+10Yvg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@electron-forge/maker-base\": \"^6.0.0 || ^7.0.0\",\n        \"@spacingbat3/lss\": \"^1.0.0\",\n        \"node-fetch\": \"^3.2.5\",\n        \"semver\": \"^7.3.8\"\n      },\n      \"engines\": {\n        \"node\": \">=19.0.0 || ^18.11.0 || ^16.1.0\"\n      }\n    },\n    \"node_modules/@reforged/maker-appimage/node_modules/data-uri-to-buffer\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz\",\n      \"integrity\": \"sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 12\"\n      }\n    },\n    \"node_modules/@reforged/maker-appimage/node_modules/node-fetch\": {\n      \"version\": \"3.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz\",\n      \"integrity\": \"sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"data-uri-to-buffer\": \"^4.0.0\",\n        \"fetch-blob\": \"^3.1.4\",\n        \"formdata-polyfill\": \"^4.0.10\"\n      },\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/node-fetch\"\n      }\n    },\n    \"node_modules/@rjsf/core\": {\n      \"version\": \"2.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rjsf/core/-/core-2.5.1.tgz\",\n      \"integrity\": \"sha512-km8NYScXNONaL5BiSLS6wyDj49pOLZtn0iXg7Zxlm921uuf3o2AAX5SuZS5kB4Zj2zlrVMrXESexfX6bxdDYHw==\",\n      \"dependencies\": {\n        \"@babel/runtime-corejs2\": \"^7.8.7\",\n        \"@types/json-schema\": \"^7.0.4\",\n        \"ajv\": \"^6.7.0\",\n        \"core-js\": \"^2.5.7\",\n        \"json-schema-merge-allof\": \"^0.6.0\",\n        \"jsonpointer\": \"^4.0.1\",\n        \"lodash\": \"^4.17.15\",\n        \"prop-types\": \"^15.7.2\",\n        \"react-app-polyfill\": \"^1.0.4\",\n        \"react-is\": \"^16.9.0\",\n        \"shortid\": \"^2.2.14\"\n      },\n      \"engines\": {\n        \"node\": \">=6\",\n        \"npm\": \">=2.14.7\"\n      },\n      \"peerDependencies\": {\n        \"react\": \">=16\"\n      }\n    },\n    \"node_modules/@rjsf/core/node_modules/jsonpointer\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.1.0.tgz\",\n      \"integrity\": \"sha512-CXcRvMyTlnR53xMcKnuMzfCA5i/nfblTnnr74CZb6C4vG39eu6w51t7nKmU5MfLfbTgGItliNyjO/ciNPDqClg==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/@rjsf/core/node_modules/react-is\": {\n      \"version\": \"16.13.1\",\n      \"resolved\": \"https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz\",\n      \"integrity\": \"sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==\"\n    },\n    \"node_modules/@ronomon/direct-io\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/@ronomon/direct-io/-/direct-io-3.0.1.tgz\",\n      \"integrity\": \"sha512-NkKB32bjq7RfMdAMiWayphMlVWzsfPiKelK+btXLqggv1vDVgv2xELqeo0z4uYLLt86fVReLPxQj7qpg0zWvow==\",\n      \"hasInstallScript\": true,\n      \"dependencies\": {\n        \"@ronomon/queue\": \"^3.0.1\"\n      }\n    },\n    \"node_modules/@ronomon/queue\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/@ronomon/queue/-/queue-3.0.1.tgz\",\n      \"integrity\": \"sha512-STcqSvk+c7ArMrZgYxhM92p6O6F7t0SUbGr+zm8s9fJple5EdJAMwP3dXqgdXeF95xWhBpha5kjEqNAIdI0r4w==\"\n    },\n    \"node_modules/@sentry-internal/feedback\": {\n      \"version\": \"7.112.0\",\n      \"resolved\": \"https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.112.0.tgz\",\n      \"integrity\": \"sha512-aqndxnTvZnqo/uUhuWLNWY/0W3zOxNs9FofLYi1SK5+QzMqDIyFY1dc9+ZqQH3/9GIlEGao+zveGAHeUEtpE8g==\",\n      \"dependencies\": {\n        \"@sentry/core\": \"7.112.0\",\n        \"@sentry/types\": \"7.112.0\",\n        \"@sentry/utils\": \"7.112.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/@sentry-internal/replay-canvas\": {\n      \"version\": \"7.112.0\",\n      \"resolved\": \"https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-7.112.0.tgz\",\n      \"integrity\": \"sha512-DwpGY5oZf0ab4Jm9HtM8fB3xqnpAcxBKORqiVHZizz7eo0arrb1n9HCXcxsRNNOAuMRBS8aEHKberfdL6rYpyw==\",\n      \"dependencies\": {\n        \"@sentry/core\": \"7.112.0\",\n        \"@sentry/replay\": \"7.112.0\",\n        \"@sentry/types\": \"7.112.0\",\n        \"@sentry/utils\": \"7.112.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/@sentry-internal/tracing\": {\n      \"version\": \"7.112.0\",\n      \"resolved\": \"https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.112.0.tgz\",\n      \"integrity\": \"sha512-PkA3NaSg4nTWp9pwVsV9x0EBiY0pEAnIboIpMuLGE5MJ/FL10NC5Fn1GPebcxNnOou62dM7P/z7Wtcm8czAn6A==\",\n      \"dependencies\": {\n        \"@sentry/core\": \"7.112.0\",\n        \"@sentry/types\": \"7.112.0\",\n        \"@sentry/utils\": \"7.112.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/@sentry/browser\": {\n      \"version\": \"7.112.0\",\n      \"resolved\": \"https://registry.npmjs.org/@sentry/browser/-/browser-7.112.0.tgz\",\n      \"integrity\": \"sha512-xqxtlQ/GMHxYcJYAhWR0ELO4kCnQV9GuIcBUEHlU/mYbPBDPxNYFzXkoz3514DBKxRVTHDkVle6vLuG0yKvXsg==\",\n      \"dependencies\": {\n        \"@sentry-internal/feedback\": \"7.112.0\",\n        \"@sentry-internal/replay-canvas\": \"7.112.0\",\n        \"@sentry-internal/tracing\": \"7.112.0\",\n        \"@sentry/core\": \"7.112.0\",\n        \"@sentry/integrations\": \"7.112.0\",\n        \"@sentry/replay\": \"7.112.0\",\n        \"@sentry/types\": \"7.112.0\",\n        \"@sentry/utils\": \"7.112.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/@sentry/core\": {\n      \"version\": \"7.112.0\",\n      \"resolved\": \"https://registry.npmjs.org/@sentry/core/-/core-7.112.0.tgz\",\n      \"integrity\": \"sha512-q4K0fTULXMf9vb0Je6qFwQyVjfMvuPiKRRvRHcpWvWudV7oTcfPixlbbIQaj3OiY3nrjk5q86hktqboI/Z6ISw==\",\n      \"dependencies\": {\n        \"@sentry/types\": \"7.112.0\",\n        \"@sentry/utils\": \"7.112.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/@sentry/electron\": {\n      \"version\": \"4.24.0\",\n      \"resolved\": \"https://registry.npmjs.org/@sentry/electron/-/electron-4.24.0.tgz\",\n      \"integrity\": \"sha512-UF+9v5jhVCryEMwQ54/4t8Hec1SfamkdswqlDezwJQkoWVpZ4hhPMziULYTBqSFdXCQGShuNuKjcdowhdTVI3Q==\",\n      \"dependencies\": {\n        \"@sentry/browser\": \"7.112.0\",\n        \"@sentry/core\": \"7.112.0\",\n        \"@sentry/node\": \"7.112.0\",\n        \"@sentry/types\": \"7.112.0\",\n        \"@sentry/utils\": \"7.112.0\",\n        \"deepmerge\": \"4.3.0\",\n        \"tslib\": \"^2.5.0\"\n      }\n    },\n    \"node_modules/@sentry/integrations\": {\n      \"version\": \"7.112.0\",\n      \"resolved\": \"https://registry.npmjs.org/@sentry/integrations/-/integrations-7.112.0.tgz\",\n      \"integrity\": \"sha512-brN6eZkXuz1e/OKhMGJsAZjc0cUU+5G+LQWet+gGXWVGM2v7uY7mKDHr5Yl/c8WxeJBurjJzJn7YmtmR9++ZKQ==\",\n      \"dependencies\": {\n        \"@sentry/core\": \"7.112.0\",\n        \"@sentry/types\": \"7.112.0\",\n        \"@sentry/utils\": \"7.112.0\",\n        \"localforage\": \"^1.8.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/@sentry/node\": {\n      \"version\": \"7.112.0\",\n      \"resolved\": \"https://registry.npmjs.org/@sentry/node/-/node-7.112.0.tgz\",\n      \"integrity\": \"sha512-Me0Um3PbPQADHhm5zJ1EM4/me+i1OMT3w+1ZUgkPGX+2Wtqfp0djHF/SzCOL45X1IR+YLVrcCTpyAWRhPZAdVw==\",\n      \"dependencies\": {\n        \"@sentry-internal/tracing\": \"7.112.0\",\n        \"@sentry/core\": \"7.112.0\",\n        \"@sentry/integrations\": \"7.112.0\",\n        \"@sentry/types\": \"7.112.0\",\n        \"@sentry/utils\": \"7.112.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/@sentry/replay\": {\n      \"version\": \"7.112.0\",\n      \"resolved\": \"https://registry.npmjs.org/@sentry/replay/-/replay-7.112.0.tgz\",\n      \"integrity\": \"sha512-uP38yQpYKdU9onJEl77nSJslajXMbTLp3j+8EK4tNnXDMv+yDnSouODEdHQyX9fajKHsFi/FjjOIrVujR0Qd7w==\",\n      \"dependencies\": {\n        \"@sentry-internal/tracing\": \"7.112.0\",\n        \"@sentry/core\": \"7.112.0\",\n        \"@sentry/types\": \"7.112.0\",\n        \"@sentry/utils\": \"7.112.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/@sentry/types\": {\n      \"version\": \"7.112.0\",\n      \"resolved\": \"https://registry.npmjs.org/@sentry/types/-/types-7.112.0.tgz\",\n      \"integrity\": \"sha512-ASonavVCSrgDjMyWjuNMSytKMGYJq7d/1+IoBJsQFLgLe1gLIXuDNbhfUAM4A+muQUGZepV9iRX4ZYhiROMHVQ==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/@sentry/utils\": {\n      \"version\": \"7.112.0\",\n      \"resolved\": \"https://registry.npmjs.org/@sentry/utils/-/utils-7.112.0.tgz\",\n      \"integrity\": \"sha512-dNGcNWKoJE9VwIAZxQsqC6/7BC+8wn1rT7Km9S8xltcjhRvaK4n3QZwXoNLHjNWT0mS2lZaFyRx2hsHjblQqLg==\",\n      \"dependencies\": {\n        \"@sentry/types\": \"7.112.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/@sinclair/typebox\": {\n      \"version\": \"0.27.8\",\n      \"resolved\": \"https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz\",\n      \"integrity\": \"sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==\",\n      \"dev\": true\n    },\n    \"node_modules/@sindresorhus/is\": {\n      \"version\": \"4.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz\",\n      \"integrity\": \"sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==\",\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sindresorhus/is?sponsor=1\"\n      }\n    },\n    \"node_modules/@sinonjs/commons\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz\",\n      \"integrity\": \"sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"type-detect\": \"4.0.8\"\n      }\n    },\n    \"node_modules/@sinonjs/fake-timers\": {\n      \"version\": \"11.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz\",\n      \"integrity\": \"sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@sinonjs/commons\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/@sinonjs/samsam\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz\",\n      \"integrity\": \"sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@sinonjs/commons\": \"^2.0.0\",\n        \"lodash.get\": \"^4.4.2\",\n        \"type-detect\": \"^4.0.8\"\n      }\n    },\n    \"node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz\",\n      \"integrity\": \"sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"type-detect\": \"4.0.8\"\n      }\n    },\n    \"node_modules/@sinonjs/text-encoding\": {\n      \"version\": \"0.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz\",\n      \"integrity\": \"sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==\",\n      \"dev\": true\n    },\n    \"node_modules/@smithy/abort-controller\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.2.0.tgz\",\n      \"integrity\": \"sha512-wRlta7GuLWpTqtFfGo+nZyOO1vEvewdNR1R4rTxpC8XU6vG/NDyrFBhwLZsqg1NUoR1noVaXJPC/7ZK47QCySw==\",\n      \"dependencies\": {\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/config-resolver\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.2.0.tgz\",\n      \"integrity\": \"sha512-fsiMgd8toyUba6n1WRmr+qACzXltpdDkPTAaDqc8QqPBUzO+/JKwL6bUBseHVi8tu9l+3JOK+tSf7cay+4B3LA==\",\n      \"dependencies\": {\n        \"@smithy/node-config-provider\": \"^2.3.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"@smithy/util-config-provider\": \"^2.3.0\",\n        \"@smithy/util-middleware\": \"^2.2.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/core\": {\n      \"version\": \"1.4.2\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/core/-/core-1.4.2.tgz\",\n      \"integrity\": \"sha512-2fek3I0KZHWJlRLvRTqxTEri+qV0GRHrJIoLFuBMZB4EMg4WgeBGfF0X6abnrNYpq55KJ6R4D6x4f0vLnhzinA==\",\n      \"dependencies\": {\n        \"@smithy/middleware-endpoint\": \"^2.5.1\",\n        \"@smithy/middleware-retry\": \"^2.3.1\",\n        \"@smithy/middleware-serde\": \"^2.3.0\",\n        \"@smithy/protocol-http\": \"^3.3.0\",\n        \"@smithy/smithy-client\": \"^2.5.1\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"@smithy/util-middleware\": \"^2.2.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/credential-provider-imds\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.3.0.tgz\",\n      \"integrity\": \"sha512-BWB9mIukO1wjEOo1Ojgl6LrG4avcaC7T/ZP6ptmAaW4xluhSIPZhY+/PI5YKzlk+jsm+4sQZB45Bt1OfMeQa3w==\",\n      \"dependencies\": {\n        \"@smithy/node-config-provider\": \"^2.3.0\",\n        \"@smithy/property-provider\": \"^2.2.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"@smithy/url-parser\": \"^2.2.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/fetch-http-handler\": {\n      \"version\": \"2.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.5.0.tgz\",\n      \"integrity\": \"sha512-BOWEBeppWhLn/no/JxUL/ghTfANTjT7kg3Ww2rPqTUY9R4yHPXxJ9JhMe3Z03LN3aPwiwlpDIUcVw1xDyHqEhw==\",\n      \"dependencies\": {\n        \"@smithy/protocol-http\": \"^3.3.0\",\n        \"@smithy/querystring-builder\": \"^2.2.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"@smithy/util-base64\": \"^2.3.0\",\n        \"tslib\": \"^2.6.2\"\n      }\n    },\n    \"node_modules/@smithy/hash-node\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.2.0.tgz\",\n      \"integrity\": \"sha512-zLWaC/5aWpMrHKpoDF6nqpNtBhlAYKF/7+9yMN7GpdR8CzohnWfGtMznPybnwSS8saaXBMxIGwJqR4HmRp6b3g==\",\n      \"dependencies\": {\n        \"@smithy/types\": \"^2.12.0\",\n        \"@smithy/util-buffer-from\": \"^2.2.0\",\n        \"@smithy/util-utf8\": \"^2.3.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/invalid-dependency\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.2.0.tgz\",\n      \"integrity\": \"sha512-nEDASdbKFKPXN2O6lOlTgrEEOO9NHIeO+HVvZnkqc8h5U9g3BIhWsvzFo+UcUbliMHvKNPD/zVxDrkP1Sbgp8Q==\",\n      \"dependencies\": {\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      }\n    },\n    \"node_modules/@smithy/is-array-buffer\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz\",\n      \"integrity\": \"sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==\",\n      \"dependencies\": {\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/middleware-content-length\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.2.0.tgz\",\n      \"integrity\": \"sha512-5bl2LG1Ah/7E5cMSC+q+h3IpVHMeOkG0yLRyQT1p2aMJkSrZG7RlXHPuAgb7EyaFeidKEnnd/fNaLLaKlHGzDQ==\",\n      \"dependencies\": {\n        \"@smithy/protocol-http\": \"^3.3.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/middleware-endpoint\": {\n      \"version\": \"2.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.5.1.tgz\",\n      \"integrity\": \"sha512-1/8kFp6Fl4OsSIVTWHnNjLnTL8IqpIb/D3sTSczrKFnrE9VMNWxnrRKNvpUHOJ6zpGD5f62TPm7+17ilTJpiCQ==\",\n      \"dependencies\": {\n        \"@smithy/middleware-serde\": \"^2.3.0\",\n        \"@smithy/node-config-provider\": \"^2.3.0\",\n        \"@smithy/shared-ini-file-loader\": \"^2.4.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"@smithy/url-parser\": \"^2.2.0\",\n        \"@smithy/util-middleware\": \"^2.2.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/middleware-retry\": {\n      \"version\": \"2.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.3.1.tgz\",\n      \"integrity\": \"sha512-P2bGufFpFdYcWvqpyqqmalRtwFUNUA8vHjJR5iGqbfR6mp65qKOLcUd6lTr4S9Gn/enynSrSf3p3FVgVAf6bXA==\",\n      \"dependencies\": {\n        \"@smithy/node-config-provider\": \"^2.3.0\",\n        \"@smithy/protocol-http\": \"^3.3.0\",\n        \"@smithy/service-error-classification\": \"^2.1.5\",\n        \"@smithy/smithy-client\": \"^2.5.1\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"@smithy/util-middleware\": \"^2.2.0\",\n        \"@smithy/util-retry\": \"^2.2.0\",\n        \"tslib\": \"^2.6.2\",\n        \"uuid\": \"^9.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/middleware-serde\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.3.0.tgz\",\n      \"integrity\": \"sha512-sIADe7ojwqTyvEQBe1nc/GXB9wdHhi9UwyX0lTyttmUWDJLP655ZYE1WngnNyXREme8I27KCaUhyhZWRXL0q7Q==\",\n      \"dependencies\": {\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/middleware-stack\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.2.0.tgz\",\n      \"integrity\": \"sha512-Qntc3jrtwwrsAC+X8wms8zhrTr0sFXnyEGhZd9sLtsJ/6gGQKFzNB+wWbOcpJd7BR8ThNCoKt76BuQahfMvpeA==\",\n      \"dependencies\": {\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/node-config-provider\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.3.0.tgz\",\n      \"integrity\": \"sha512-0elK5/03a1JPWMDPaS726Iw6LpQg80gFut1tNpPfxFuChEEklo2yL823V94SpTZTxmKlXFtFgsP55uh3dErnIg==\",\n      \"dependencies\": {\n        \"@smithy/property-provider\": \"^2.2.0\",\n        \"@smithy/shared-ini-file-loader\": \"^2.4.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/node-http-handler\": {\n      \"version\": \"2.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.5.0.tgz\",\n      \"integrity\": \"sha512-mVGyPBzkkGQsPoxQUbxlEfRjrj6FPyA3u3u2VXGr9hT8wilsoQdZdvKpMBFMB8Crfhv5dNkKHIW0Yyuc7eABqA==\",\n      \"dependencies\": {\n        \"@smithy/abort-controller\": \"^2.2.0\",\n        \"@smithy/protocol-http\": \"^3.3.0\",\n        \"@smithy/querystring-builder\": \"^2.2.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/property-provider\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.2.0.tgz\",\n      \"integrity\": \"sha512-+xiil2lFhtTRzXkx8F053AV46QnIw6e7MV8od5Mi68E1ICOjCeCHw2XfLnDEUHnT9WGUIkwcqavXjfwuJbGlpg==\",\n      \"dependencies\": {\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/protocol-http\": {\n      \"version\": \"3.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.3.0.tgz\",\n      \"integrity\": \"sha512-Xy5XK1AFWW2nlY/biWZXu6/krgbaf2dg0q492D8M5qthsnU2H+UgFeZLbM76FnH7s6RO/xhQRkj+T6KBO3JzgQ==\",\n      \"dependencies\": {\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/querystring-builder\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.2.0.tgz\",\n      \"integrity\": \"sha512-L1kSeviUWL+emq3CUVSgdogoM/D9QMFaqxL/dd0X7PCNWmPXqt+ExtrBjqT0V7HLN03Vs9SuiLrG3zy3JGnE5A==\",\n      \"dependencies\": {\n        \"@smithy/types\": \"^2.12.0\",\n        \"@smithy/util-uri-escape\": \"^2.2.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/querystring-parser\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.2.0.tgz\",\n      \"integrity\": \"sha512-BvHCDrKfbG5Yhbpj4vsbuPV2GgcpHiAkLeIlcA1LtfpMz3jrqizP1+OguSNSj1MwBHEiN+jwNisXLGdajGDQJA==\",\n      \"dependencies\": {\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/service-error-classification\": {\n      \"version\": \"2.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.1.5.tgz\",\n      \"integrity\": \"sha512-uBDTIBBEdAQryvHdc5W8sS5YX7RQzF683XrHePVdFmAgKiMofU15FLSM0/HU03hKTnazdNRFa0YHS7+ArwoUSQ==\",\n      \"dependencies\": {\n        \"@smithy/types\": \"^2.12.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/shared-ini-file-loader\": {\n      \"version\": \"2.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.4.0.tgz\",\n      \"integrity\": \"sha512-WyujUJL8e1B6Z4PBfAqC/aGY1+C7T0w20Gih3yrvJSk97gpiVfB+y7c46T4Nunk+ZngLq0rOIdeVeIklk0R3OA==\",\n      \"dependencies\": {\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/signature-v4\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.3.0.tgz\",\n      \"integrity\": \"sha512-ui/NlpILU+6HAQBfJX8BBsDXuKSNrjTSuOYArRblcrErwKFutjrCNb/OExfVRyj9+26F9J+ZmfWT+fKWuDrH3Q==\",\n      \"dependencies\": {\n        \"@smithy/is-array-buffer\": \"^2.2.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"@smithy/util-hex-encoding\": \"^2.2.0\",\n        \"@smithy/util-middleware\": \"^2.2.0\",\n        \"@smithy/util-uri-escape\": \"^2.2.0\",\n        \"@smithy/util-utf8\": \"^2.3.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/smithy-client\": {\n      \"version\": \"2.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.5.1.tgz\",\n      \"integrity\": \"sha512-jrbSQrYCho0yDaaf92qWgd+7nAeap5LtHTI51KXqmpIFCceKU3K9+vIVTUH72bOJngBMqa4kyu1VJhRcSrk/CQ==\",\n      \"dependencies\": {\n        \"@smithy/middleware-endpoint\": \"^2.5.1\",\n        \"@smithy/middleware-stack\": \"^2.2.0\",\n        \"@smithy/protocol-http\": \"^3.3.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"@smithy/util-stream\": \"^2.2.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/types\": {\n      \"version\": \"2.12.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/types/-/types-2.12.0.tgz\",\n      \"integrity\": \"sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==\",\n      \"dependencies\": {\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/url-parser\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.2.0.tgz\",\n      \"integrity\": \"sha512-hoA4zm61q1mNTpksiSWp2nEl1dt3j726HdRhiNgVJQMj7mLp7dprtF57mOB6JvEk/x9d2bsuL5hlqZbBuHQylQ==\",\n      \"dependencies\": {\n        \"@smithy/querystring-parser\": \"^2.2.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      }\n    },\n    \"node_modules/@smithy/util-base64\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.3.0.tgz\",\n      \"integrity\": \"sha512-s3+eVwNeJuXUwuMbusncZNViuhv2LjVJ1nMwTqSA0XAC7gjKhqqxRdJPhR8+YrkoZ9IiIbFk/yK6ACe/xlF+hw==\",\n      \"dependencies\": {\n        \"@smithy/util-buffer-from\": \"^2.2.0\",\n        \"@smithy/util-utf8\": \"^2.3.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/util-body-length-browser\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.2.0.tgz\",\n      \"integrity\": \"sha512-dtpw9uQP7W+n3vOtx0CfBD5EWd7EPdIdsQnWTDoFf77e3VUf05uA7R7TGipIo8e4WL2kuPdnsr3hMQn9ziYj5w==\",\n      \"dependencies\": {\n        \"tslib\": \"^2.6.2\"\n      }\n    },\n    \"node_modules/@smithy/util-body-length-node\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.3.0.tgz\",\n      \"integrity\": \"sha512-ITWT1Wqjubf2CJthb0BuT9+bpzBfXeMokH/AAa5EJQgbv9aPMVfnM76iFIZVFf50hYXGbtiV71BHAthNWd6+dw==\",\n      \"dependencies\": {\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/util-buffer-from\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz\",\n      \"integrity\": \"sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==\",\n      \"dependencies\": {\n        \"@smithy/is-array-buffer\": \"^2.2.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/util-config-provider\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.3.0.tgz\",\n      \"integrity\": \"sha512-HZkzrRcuFN1k70RLqlNK4FnPXKOpkik1+4JaBoHNJn+RnJGYqaa3c5/+XtLOXhlKzlRgNvyaLieHTW2VwGN0VQ==\",\n      \"dependencies\": {\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/util-defaults-mode-browser\": {\n      \"version\": \"2.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.2.1.tgz\",\n      \"integrity\": \"sha512-RtKW+8j8skk17SYowucwRUjeh4mCtnm5odCL0Lm2NtHQBsYKrNW0od9Rhopu9wF1gHMfHeWF7i90NwBz/U22Kw==\",\n      \"dependencies\": {\n        \"@smithy/property-provider\": \"^2.2.0\",\n        \"@smithy/smithy-client\": \"^2.5.1\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"bowser\": \"^2.11.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.0.0\"\n      }\n    },\n    \"node_modules/@smithy/util-defaults-mode-node\": {\n      \"version\": \"2.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.3.1.tgz\",\n      \"integrity\": \"sha512-vkMXHQ0BcLFysBMWgSBLSk3+leMpFSyyFj8zQtv5ZyUBx8/owVh1/pPEkzmW/DR/Gy/5c8vjLDD9gZjXNKbrpA==\",\n      \"dependencies\": {\n        \"@smithy/config-resolver\": \"^2.2.0\",\n        \"@smithy/credential-provider-imds\": \"^2.3.0\",\n        \"@smithy/node-config-provider\": \"^2.3.0\",\n        \"@smithy/property-provider\": \"^2.2.0\",\n        \"@smithy/smithy-client\": \"^2.5.1\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.0.0\"\n      }\n    },\n    \"node_modules/@smithy/util-endpoints\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.2.0.tgz\",\n      \"integrity\": \"sha512-BuDHv8zRjsE5zXd3PxFXFknzBG3owCpjq8G3FcsXW3CykYXuEqM3nTSsmLzw5q+T12ZYuDlVUZKBdpNbhVtlrQ==\",\n      \"dependencies\": {\n        \"@smithy/node-config-provider\": \"^2.3.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/util-hex-encoding\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.2.0.tgz\",\n      \"integrity\": \"sha512-7iKXR+/4TpLK194pVjKiasIyqMtTYJsgKgM242Y9uzt5dhHnUDvMNb+3xIhRJ9QhvqGii/5cRUt4fJn3dtXNHQ==\",\n      \"dependencies\": {\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/util-middleware\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.2.0.tgz\",\n      \"integrity\": \"sha512-L1qpleXf9QD6LwLCJ5jddGkgWyuSvWBkJwWAZ6kFkdifdso+sk3L3O1HdmPvCdnCK3IS4qWyPxev01QMnfHSBw==\",\n      \"dependencies\": {\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/util-retry\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.2.0.tgz\",\n      \"integrity\": \"sha512-q9+pAFPTfftHXRytmZ7GzLFFrEGavqapFc06XxzZFcSIGERXMerXxCitjOG1prVDR9QdjqotF40SWvbqcCpf8g==\",\n      \"dependencies\": {\n        \"@smithy/service-error-classification\": \"^2.1.5\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/util-stream\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.2.0.tgz\",\n      \"integrity\": \"sha512-17faEXbYWIRst1aU9SvPZyMdWmqIrduZjVOqCPMIsWFNxs5yQQgFrJL6b2SdiCzyW9mJoDjFtgi53xx7EH+BXA==\",\n      \"dependencies\": {\n        \"@smithy/fetch-http-handler\": \"^2.5.0\",\n        \"@smithy/node-http-handler\": \"^2.5.0\",\n        \"@smithy/types\": \"^2.12.0\",\n        \"@smithy/util-base64\": \"^2.3.0\",\n        \"@smithy/util-buffer-from\": \"^2.2.0\",\n        \"@smithy/util-hex-encoding\": \"^2.2.0\",\n        \"@smithy/util-utf8\": \"^2.3.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/util-uri-escape\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.2.0.tgz\",\n      \"integrity\": \"sha512-jtmJMyt1xMD/d8OtbVJ2gFZOSKc+ueYJZPW20ULW1GOp/q/YIM0wNh+u8ZFao9UaIGz4WoPW8hC64qlWLIfoDA==\",\n      \"dependencies\": {\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@smithy/util-utf8\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz\",\n      \"integrity\": \"sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==\",\n      \"dependencies\": {\n        \"@smithy/util-buffer-from\": \"^2.2.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@spacingbat3/lss\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@spacingbat3/lss/-/lss-1.2.0.tgz\",\n      \"integrity\": \"sha512-aywhxHNb6l7COooF3m439eT/6QN8E/RSl5IVboSKthMHcp0GlZYMSoS7546rqDLmFRxTD8f1tu/NIS9vtDwYAg==\",\n      \"dev\": true\n    },\n    \"node_modules/@svgr/babel-plugin-add-jsx-attribute\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz\",\n      \"integrity\": \"sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/gregberge\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@svgr/babel-plugin-remove-jsx-attribute\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz\",\n      \"integrity\": \"sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/gregberge\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@svgr/babel-plugin-remove-jsx-empty-expression\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz\",\n      \"integrity\": \"sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/gregberge\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@svgr/babel-plugin-replace-jsx-attribute-value\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz\",\n      \"integrity\": \"sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/gregberge\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@svgr/babel-plugin-svg-dynamic-title\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz\",\n      \"integrity\": \"sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/gregberge\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@svgr/babel-plugin-svg-em-dimensions\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz\",\n      \"integrity\": \"sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/gregberge\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@svgr/babel-plugin-transform-react-native-svg\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz\",\n      \"integrity\": \"sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/gregberge\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@svgr/babel-plugin-transform-svg-component\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz\",\n      \"integrity\": \"sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/gregberge\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@svgr/babel-preset\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz\",\n      \"integrity\": \"sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@svgr/babel-plugin-add-jsx-attribute\": \"8.0.0\",\n        \"@svgr/babel-plugin-remove-jsx-attribute\": \"8.0.0\",\n        \"@svgr/babel-plugin-remove-jsx-empty-expression\": \"8.0.0\",\n        \"@svgr/babel-plugin-replace-jsx-attribute-value\": \"8.0.0\",\n        \"@svgr/babel-plugin-svg-dynamic-title\": \"8.0.0\",\n        \"@svgr/babel-plugin-svg-em-dimensions\": \"8.0.0\",\n        \"@svgr/babel-plugin-transform-react-native-svg\": \"8.1.0\",\n        \"@svgr/babel-plugin-transform-svg-component\": \"8.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/gregberge\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@svgr/core\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz\",\n      \"integrity\": \"sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/core\": \"^7.21.3\",\n        \"@svgr/babel-preset\": \"8.1.0\",\n        \"camelcase\": \"^6.2.0\",\n        \"cosmiconfig\": \"^8.1.3\",\n        \"snake-case\": \"^3.0.4\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/gregberge\"\n      }\n    },\n    \"node_modules/@svgr/hast-util-to-babel-ast\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz\",\n      \"integrity\": \"sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/types\": \"^7.21.3\",\n        \"entities\": \"^4.4.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/gregberge\"\n      }\n    },\n    \"node_modules/@svgr/plugin-jsx\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz\",\n      \"integrity\": \"sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/core\": \"^7.21.3\",\n        \"@svgr/babel-preset\": \"8.1.0\",\n        \"@svgr/hast-util-to-babel-ast\": \"8.0.0\",\n        \"svg-parser\": \"^2.0.4\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/gregberge\"\n      },\n      \"peerDependencies\": {\n        \"@svgr/core\": \"*\"\n      }\n    },\n    \"node_modules/@svgr/plugin-svgo\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz\",\n      \"integrity\": \"sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"cosmiconfig\": \"^8.1.3\",\n        \"deepmerge\": \"^4.3.1\",\n        \"svgo\": \"^3.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/gregberge\"\n      },\n      \"peerDependencies\": {\n        \"@svgr/core\": \"*\"\n      }\n    },\n    \"node_modules/@svgr/plugin-svgo/node_modules/deepmerge\": {\n      \"version\": \"4.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz\",\n      \"integrity\": \"sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/@svgr/webpack\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz\",\n      \"integrity\": \"sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/core\": \"^7.21.3\",\n        \"@babel/plugin-transform-react-constant-elements\": \"^7.21.3\",\n        \"@babel/preset-env\": \"^7.20.2\",\n        \"@babel/preset-react\": \"^7.18.6\",\n        \"@babel/preset-typescript\": \"^7.21.0\",\n        \"@svgr/core\": \"8.1.0\",\n        \"@svgr/plugin-jsx\": \"8.1.0\",\n        \"@svgr/plugin-svgo\": \"8.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/gregberge\"\n      }\n    },\n    \"node_modules/@szmarczak/http-timer\": {\n      \"version\": \"4.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz\",\n      \"integrity\": \"sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==\",\n      \"dependencies\": {\n        \"defer-to-connect\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/@tokenizer/token\": {\n      \"version\": \"0.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz\",\n      \"integrity\": \"sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==\"\n    },\n    \"node_modules/@tootallnate/once\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz\",\n      \"integrity\": \"sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/@tootallnate/quickjs-emscripten\": {\n      \"version\": \"0.23.0\",\n      \"resolved\": \"https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz\",\n      \"integrity\": \"sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==\",\n      \"dev\": true\n    },\n    \"node_modules/@trysound/sax\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz\",\n      \"integrity\": \"sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10.13.0\"\n      }\n    },\n    \"node_modules/@tsconfig/node10\": {\n      \"version\": \"1.0.11\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz\",\n      \"integrity\": \"sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==\",\n      \"dev\": true\n    },\n    \"node_modules/@tsconfig/node12\": {\n      \"version\": \"1.0.11\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz\",\n      \"integrity\": \"sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==\",\n      \"dev\": true\n    },\n    \"node_modules/@tsconfig/node14\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz\",\n      \"integrity\": \"sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==\",\n      \"dev\": true\n    },\n    \"node_modules/@tsconfig/node16\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz\",\n      \"integrity\": \"sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/ajv-keywords\": {\n      \"version\": \"3.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/@types/ajv-keywords/-/ajv-keywords-3.5.0.tgz\",\n      \"integrity\": \"sha512-Kv0qn/2PaC6H334wS2Jmjzs2dXP5OTn7EQdno3TTBLfzqiyRhHpQR1ijv1wEEmDrUawlZ/MTY4xGnaZzdymCkA==\",\n      \"deprecated\": \"This is a stub types definition. ajv-keywords provides its own type definitions, so you do not need this installed.\",\n      \"dependencies\": {\n        \"ajv-keywords\": \"*\"\n      }\n    },\n    \"node_modules/@types/appdmg\": {\n      \"version\": \"0.5.5\",\n      \"resolved\": \"https://registry.npmjs.org/@types/appdmg/-/appdmg-0.5.5.tgz\",\n      \"integrity\": \"sha512-G+n6DgZTZFOteITE30LnWj+HRVIGr7wMlAiLWOO02uJFWVEitaPU9JVXm9wJokkgshBawb2O1OykdcsmkkZfgg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/body-parser\": {\n      \"version\": \"1.19.5\",\n      \"resolved\": \"https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz\",\n      \"integrity\": \"sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/connect\": \"*\",\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/bonjour\": {\n      \"version\": \"3.5.13\",\n      \"resolved\": \"https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz\",\n      \"integrity\": \"sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/cacheable-request\": {\n      \"version\": \"6.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz\",\n      \"integrity\": \"sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==\",\n      \"dependencies\": {\n        \"@types/http-cache-semantics\": \"*\",\n        \"@types/keyv\": \"^3.1.4\",\n        \"@types/node\": \"*\",\n        \"@types/responselike\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/@types/chai\": {\n      \"version\": \"4.3.14\",\n      \"resolved\": \"https://registry.npmjs.org/@types/chai/-/chai-4.3.14.tgz\",\n      \"integrity\": \"sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/codemirror\": {\n      \"version\": \"0.0.88\",\n      \"resolved\": \"https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.88.tgz\",\n      \"integrity\": \"sha512-FI9BvlO+SIEmKoIdrS9uphasiHJ/JbeUsAbVTdklBOcmnr/bQpJ6QaCw540FY98LGdDNl1Nyn7erGxo0eD2gOg==\",\n      \"dependencies\": {\n        \"@types/tern\": \"*\"\n      }\n    },\n    \"node_modules/@types/color\": {\n      \"version\": \"3.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/@types/color/-/color-3.0.6.tgz\",\n      \"integrity\": \"sha512-NMiNcZFRUAiUUCCf7zkAelY8eV3aKqfbzyFQlXpPIEeoNDbsEHGpb854V3gzTsGKYj830I5zPuOwU/TP5/cW6A==\",\n      \"dependencies\": {\n        \"@types/color-convert\": \"*\"\n      }\n    },\n    \"node_modules/@types/color-convert\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@types/color-convert/-/color-convert-2.0.3.tgz\",\n      \"integrity\": \"sha512-2Q6wzrNiuEvYxVQqhh7sXM2mhIhvZR/Paq4FdsQkOMgWsCIkKvSGj8Le1/XalulrmgOzPMqNa0ix+ePY4hTrfg==\",\n      \"dependencies\": {\n        \"@types/color-name\": \"*\"\n      }\n    },\n    \"node_modules/@types/color-name\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/color-name/-/color-name-1.1.4.tgz\",\n      \"integrity\": \"sha512-hulKeREDdLFesGQjl96+4aoJSHY5b2GRjagzzcqCfIrWhe5vkCqIvrLbqzBaI1q94Vg8DNJZZqTR5ocdWmWclg==\"\n    },\n    \"node_modules/@types/connect\": {\n      \"version\": \"3.4.38\",\n      \"resolved\": \"https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz\",\n      \"integrity\": \"sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/connect-history-api-fallback\": {\n      \"version\": \"1.5.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz\",\n      \"integrity\": \"sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/express-serve-static-core\": \"*\",\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/debug\": {\n      \"version\": \"4.1.12\",\n      \"resolved\": \"https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz\",\n      \"integrity\": \"sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/ms\": \"*\"\n      }\n    },\n    \"node_modules/@types/eslint\": {\n      \"version\": \"8.56.10\",\n      \"resolved\": \"https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz\",\n      \"integrity\": \"sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/estree\": \"*\",\n        \"@types/json-schema\": \"*\"\n      }\n    },\n    \"node_modules/@types/eslint-scope\": {\n      \"version\": \"3.7.7\",\n      \"resolved\": \"https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz\",\n      \"integrity\": \"sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/eslint\": \"*\",\n        \"@types/estree\": \"*\"\n      }\n    },\n    \"node_modules/@types/estree\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz\",\n      \"integrity\": \"sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==\"\n    },\n    \"node_modules/@types/express\": {\n      \"version\": \"4.17.21\",\n      \"resolved\": \"https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz\",\n      \"integrity\": \"sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/body-parser\": \"*\",\n        \"@types/express-serve-static-core\": \"^4.17.33\",\n        \"@types/qs\": \"*\",\n        \"@types/serve-static\": \"*\"\n      }\n    },\n    \"node_modules/@types/express-serve-static-core\": {\n      \"version\": \"4.19.0\",\n      \"resolved\": \"https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz\",\n      \"integrity\": \"sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/node\": \"*\",\n        \"@types/qs\": \"*\",\n        \"@types/range-parser\": \"*\",\n        \"@types/send\": \"*\"\n      }\n    },\n    \"node_modules/@types/fs-extra\": {\n      \"version\": \"9.0.13\",\n      \"resolved\": \"https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz\",\n      \"integrity\": \"sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/glob\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz\",\n      \"integrity\": \"sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"@types/minimatch\": \"*\",\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/google.maps\": {\n      \"version\": \"3.55.2\",\n      \"resolved\": \"https://registry.npmjs.org/@types/google.maps/-/google.maps-3.55.2.tgz\",\n      \"integrity\": \"sha512-JcTwzkxskR8DN/nnX96Pie3gGN3WHiPpuxzuQ9z3516o1bB243d8w8DHUJ8BohuzoT1o3HUFta2ns/mkZC8KRw==\"\n    },\n    \"node_modules/@types/hast\": {\n      \"version\": \"2.3.10\",\n      \"resolved\": \"https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz\",\n      \"integrity\": \"sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==\",\n      \"dependencies\": {\n        \"@types/unist\": \"^2\"\n      }\n    },\n    \"node_modules/@types/hoist-non-react-statics\": {\n      \"version\": \"3.3.5\",\n      \"resolved\": \"https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz\",\n      \"integrity\": \"sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==\",\n      \"dependencies\": {\n        \"@types/react\": \"*\",\n        \"hoist-non-react-statics\": \"^3.3.0\"\n      }\n    },\n    \"node_modules/@types/html-minifier-terser\": {\n      \"version\": \"6.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz\",\n      \"integrity\": \"sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/http-cache-semantics\": {\n      \"version\": \"4.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz\",\n      \"integrity\": \"sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==\"\n    },\n    \"node_modules/@types/http-errors\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz\",\n      \"integrity\": \"sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/http-proxy\": {\n      \"version\": \"1.17.14\",\n      \"resolved\": \"https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz\",\n      \"integrity\": \"sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/istanbul-lib-coverage\": {\n      \"version\": \"2.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz\",\n      \"integrity\": \"sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/istanbul-lib-report\": {\n      \"version\": \"3.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz\",\n      \"integrity\": \"sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/istanbul-lib-coverage\": \"*\"\n      }\n    },\n    \"node_modules/@types/istanbul-reports\": {\n      \"version\": \"3.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz\",\n      \"integrity\": \"sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/istanbul-lib-report\": \"*\"\n      }\n    },\n    \"node_modules/@types/json-schema\": {\n      \"version\": \"7.0.15\",\n      \"resolved\": \"https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz\",\n      \"integrity\": \"sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==\"\n    },\n    \"node_modules/@types/keyv\": {\n      \"version\": \"3.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz\",\n      \"integrity\": \"sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==\",\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/lodash\": {\n      \"version\": \"4.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz\",\n      \"integrity\": \"sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==\"\n    },\n    \"node_modules/@types/marked\": {\n      \"version\": \"0.7.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/marked/-/marked-0.7.4.tgz\",\n      \"integrity\": \"sha512-fdg0NO4qpuHWtZk6dASgsrBggY+8N4dWthl1bAQG9ceKUNKFjqpHaDKCAhRUI6y8vavG7hLSJ4YBwJtZyZEXqw==\"\n    },\n    \"node_modules/@types/mdast\": {\n      \"version\": \"3.0.15\",\n      \"resolved\": \"https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz\",\n      \"integrity\": \"sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==\",\n      \"dependencies\": {\n        \"@types/unist\": \"^2\"\n      }\n    },\n    \"node_modules/@types/memoizee\": {\n      \"version\": \"0.4.11\",\n      \"resolved\": \"https://registry.npmjs.org/@types/memoizee/-/memoizee-0.4.11.tgz\",\n      \"integrity\": \"sha512-2gyorIBZu8GoDr9pYjROkxWWcFtHCquF7TVbN2I+/OvgZhnIGQS0vX5KJz4lXNKb8XOSfxFOSG5OLru1ESqLUg==\"\n    },\n    \"node_modules/@types/mime\": {\n      \"version\": \"1.3.5\",\n      \"resolved\": \"https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz\",\n      \"integrity\": \"sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/mime-types\": {\n      \"version\": \"2.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.4.tgz\",\n      \"integrity\": \"sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/minimatch\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz\",\n      \"integrity\": \"sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==\",\n      \"dev\": true,\n      \"optional\": true\n    },\n    \"node_modules/@types/mocha\": {\n      \"version\": \"10.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz\",\n      \"integrity\": \"sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/ms\": {\n      \"version\": \"0.7.34\",\n      \"resolved\": \"https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz\",\n      \"integrity\": \"sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"20.12.7\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz\",\n      \"integrity\": \"sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==\",\n      \"dependencies\": {\n        \"undici-types\": \"~5.26.4\"\n      }\n    },\n    \"node_modules/@types/node-forge\": {\n      \"version\": \"1.3.11\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz\",\n      \"integrity\": \"sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/normalize-package-data\": {\n      \"version\": \"2.4.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz\",\n      \"integrity\": \"sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/parse-json\": {\n      \"version\": \"4.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz\",\n      \"integrity\": \"sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/parse5\": {\n      \"version\": \"5.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz\",\n      \"integrity\": \"sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==\"\n    },\n    \"node_modules/@types/prop-types\": {\n      \"version\": \"15.7.12\",\n      \"resolved\": \"https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz\",\n      \"integrity\": \"sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==\"\n    },\n    \"node_modules/@types/qs\": {\n      \"version\": \"6.9.15\",\n      \"resolved\": \"https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz\",\n      \"integrity\": \"sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/range-parser\": {\n      \"version\": \"1.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz\",\n      \"integrity\": \"sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/react\": {\n      \"version\": \"17.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/@types/react/-/react-17.0.2.tgz\",\n      \"integrity\": \"sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA==\",\n      \"dependencies\": {\n        \"@types/prop-types\": \"*\",\n        \"csstype\": \"^3.0.2\"\n      }\n    },\n    \"node_modules/@types/react-dom\": {\n      \"version\": \"17.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.2.tgz\",\n      \"integrity\": \"sha512-Icd9KEgdnFfJs39KyRyr0jQ7EKhq8U6CcHRMGAS45fp5qgUvxL3ujUCfWFttUK2UErqZNj97t9gsVPNAqcwoCg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/react\": \"*\"\n      }\n    },\n    \"node_modules/@types/react-helmet\": {\n      \"version\": \"6.1.11\",\n      \"resolved\": \"https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.11.tgz\",\n      \"integrity\": \"sha512-0QcdGLddTERotCXo3VFlUSWO3ztraw8nZ6e3zJSgG7apwV5xt+pJUS8ewPBqT4NYB1optGLprNQzFleIY84u/g==\",\n      \"dependencies\": {\n        \"@types/react\": \"*\"\n      }\n    },\n    \"node_modules/@types/responselike\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz\",\n      \"integrity\": \"sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==\",\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/retry\": {\n      \"version\": \"0.12.0\",\n      \"resolved\": \"https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz\",\n      \"integrity\": \"sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/semver\": {\n      \"version\": \"7.5.8\",\n      \"resolved\": \"https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz\",\n      \"integrity\": \"sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/send\": {\n      \"version\": \"0.17.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz\",\n      \"integrity\": \"sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/mime\": \"^1\",\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/serve-index\": {\n      \"version\": \"1.9.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz\",\n      \"integrity\": \"sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/express\": \"*\"\n      }\n    },\n    \"node_modules/@types/serve-static\": {\n      \"version\": \"1.15.7\",\n      \"resolved\": \"https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz\",\n      \"integrity\": \"sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/http-errors\": \"*\",\n        \"@types/node\": \"*\",\n        \"@types/send\": \"*\"\n      }\n    },\n    \"node_modules/@types/sinon\": {\n      \"version\": \"17.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@types/sinon/-/sinon-17.0.3.tgz\",\n      \"integrity\": \"sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/sinonjs__fake-timers\": \"*\"\n      }\n    },\n    \"node_modules/@types/sinonjs__fake-timers\": {\n      \"version\": \"8.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz\",\n      \"integrity\": \"sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/sockjs\": {\n      \"version\": \"0.3.36\",\n      \"resolved\": \"https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz\",\n      \"integrity\": \"sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/stack-utils\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz\",\n      \"integrity\": \"sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/styled-components\": {\n      \"version\": \"5.1.34\",\n      \"resolved\": \"https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.34.tgz\",\n      \"integrity\": \"sha512-mmiVvwpYklFIv9E8qfxuPyIt/OuyIrn6gMOAMOFUO3WJfSrSE+sGUoa4PiZj77Ut7bKZpaa6o1fBKS/4TOEvnA==\",\n      \"dependencies\": {\n        \"@types/hoist-non-react-statics\": \"*\",\n        \"@types/react\": \"*\",\n        \"csstype\": \"^3.0.2\"\n      }\n    },\n    \"node_modules/@types/styled-system\": {\n      \"version\": \"4.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/@types/styled-system/-/styled-system-4.2.2.tgz\",\n      \"integrity\": \"sha512-eULPjWVEaXElIFKBwDVWRvGkHC0Fj63XVRna8RHoaRivNhCI/QkEJpMgyb0uA4WpsHpO5SDXH+DyQwEUkyW3rA==\",\n      \"dependencies\": {\n        \"csstype\": \"^2.6.4\"\n      }\n    },\n    \"node_modules/@types/styled-system/node_modules/csstype\": {\n      \"version\": \"2.6.21\",\n      \"resolved\": \"https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz\",\n      \"integrity\": \"sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==\"\n    },\n    \"node_modules/@types/tern\": {\n      \"version\": \"0.23.9\",\n      \"resolved\": \"https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz\",\n      \"integrity\": \"sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==\",\n      \"dependencies\": {\n        \"@types/estree\": \"*\"\n      }\n    },\n    \"node_modules/@types/tmp\": {\n      \"version\": \"0.2.6\",\n      \"resolved\": \"https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz\",\n      \"integrity\": \"sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/unist\": {\n      \"version\": \"2.0.10\",\n      \"resolved\": \"https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz\",\n      \"integrity\": \"sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==\"\n    },\n    \"node_modules/@types/uuid\": {\n      \"version\": \"3.4.13\",\n      \"resolved\": \"https://registry.npmjs.org/@types/uuid/-/uuid-3.4.13.tgz\",\n      \"integrity\": \"sha512-pAeZeUbLE4Z9Vi9wsWV2bYPTweEHeJJy0G4pEjOA/FSvy1Ad5U5Km8iDV6TKre1mjBiVNfAdVHKruP8bAh4Q5A==\"\n    },\n    \"node_modules/@types/w3c-web-usb\": {\n      \"version\": \"1.0.10\",\n      \"resolved\": \"https://registry.npmjs.org/@types/w3c-web-usb/-/w3c-web-usb-1.0.10.tgz\",\n      \"integrity\": \"sha512-CHgUI5kTc/QLMP8hODUHhge0D4vx+9UiAwIGiT0sTy/B2XpdX1U5rJt6JSISgr6ikRT7vxV9EVAFeYZqUnl1gQ==\"\n    },\n    \"node_modules/@types/which\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/@types/which/-/which-2.0.2.tgz\",\n      \"integrity\": \"sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/ws\": {\n      \"version\": \"8.5.10\",\n      \"resolved\": \"https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz\",\n      \"integrity\": \"sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/yargs\": {\n      \"version\": \"17.0.32\",\n      \"resolved\": \"https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz\",\n      \"integrity\": \"sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/yargs-parser\": \"*\"\n      }\n    },\n    \"node_modules/@types/yargs-parser\": {\n      \"version\": \"21.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz\",\n      \"integrity\": \"sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/yauzl\": {\n      \"version\": \"2.10.3\",\n      \"resolved\": \"https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz\",\n      \"integrity\": \"sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@typescript-eslint/eslint-plugin\": {\n      \"version\": \"7.7.1\",\n      \"resolved\": \"https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.1.tgz\",\n      \"integrity\": \"sha512-KwfdWXJBOviaBVhxO3p5TJiLpNuh2iyXyjmWN0f1nU87pwyvfS0EmjC6ukQVYVFJd/K1+0NWGPDXiyEyQorn0Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@eslint-community/regexpp\": \"^4.10.0\",\n        \"@typescript-eslint/scope-manager\": \"7.7.1\",\n        \"@typescript-eslint/type-utils\": \"7.7.1\",\n        \"@typescript-eslint/utils\": \"7.7.1\",\n        \"@typescript-eslint/visitor-keys\": \"7.7.1\",\n        \"debug\": \"^4.3.4\",\n        \"graphemer\": \"^1.4.0\",\n        \"ignore\": \"^5.3.1\",\n        \"natural-compare\": \"^1.4.0\",\n        \"semver\": \"^7.6.0\",\n        \"ts-api-utils\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \"^18.18.0 || >=20.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/typescript-eslint\"\n      },\n      \"peerDependencies\": {\n        \"@typescript-eslint/parser\": \"^7.0.0\",\n        \"eslint\": \"^8.56.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"typescript\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/@typescript-eslint/parser\": {\n      \"version\": \"7.7.1\",\n      \"resolved\": \"https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.7.1.tgz\",\n      \"integrity\": \"sha512-vmPzBOOtz48F6JAGVS/kZYk4EkXao6iGrD838sp1w3NQQC0W8ry/q641KU4PrG7AKNAf56NOcR8GOpH8l9FPCw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@typescript-eslint/scope-manager\": \"7.7.1\",\n        \"@typescript-eslint/types\": \"7.7.1\",\n        \"@typescript-eslint/typescript-estree\": \"7.7.1\",\n        \"@typescript-eslint/visitor-keys\": \"7.7.1\",\n        \"debug\": \"^4.3.4\"\n      },\n      \"engines\": {\n        \"node\": \"^18.18.0 || >=20.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/typescript-eslint\"\n      },\n      \"peerDependencies\": {\n        \"eslint\": \"^8.56.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"typescript\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/@typescript-eslint/scope-manager\": {\n      \"version\": \"7.7.1\",\n      \"resolved\": \"https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.1.tgz\",\n      \"integrity\": \"sha512-PytBif2SF+9SpEUKynYn5g1RHFddJUcyynGpztX3l/ik7KmZEv19WCMhUBkHXPU9es/VWGD3/zg3wg90+Dh2rA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@typescript-eslint/types\": \"7.7.1\",\n        \"@typescript-eslint/visitor-keys\": \"7.7.1\"\n      },\n      \"engines\": {\n        \"node\": \"^18.18.0 || >=20.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/typescript-eslint\"\n      }\n    },\n    \"node_modules/@typescript-eslint/type-utils\": {\n      \"version\": \"7.7.1\",\n      \"resolved\": \"https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.7.1.tgz\",\n      \"integrity\": \"sha512-ZksJLW3WF7o75zaBPScdW1Gbkwhd/lyeXGf1kQCxJaOeITscoSl0MjynVvCzuV5boUz/3fOI06Lz8La55mu29Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@typescript-eslint/typescript-estree\": \"7.7.1\",\n        \"@typescript-eslint/utils\": \"7.7.1\",\n        \"debug\": \"^4.3.4\",\n        \"ts-api-utils\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \"^18.18.0 || >=20.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/typescript-eslint\"\n      },\n      \"peerDependencies\": {\n        \"eslint\": \"^8.56.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"typescript\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/@typescript-eslint/types\": {\n      \"version\": \"7.7.1\",\n      \"resolved\": \"https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.1.tgz\",\n      \"integrity\": \"sha512-AmPmnGW1ZLTpWa+/2omPrPfR7BcbUU4oha5VIbSbS1a1Tv966bklvLNXxp3mrbc+P2j4MNOTfDffNsk4o0c6/w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^18.18.0 || >=20.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/typescript-eslint\"\n      }\n    },\n    \"node_modules/@typescript-eslint/typescript-estree\": {\n      \"version\": \"7.7.1\",\n      \"resolved\": \"https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.1.tgz\",\n      \"integrity\": \"sha512-CXe0JHCXru8Fa36dteXqmH2YxngKJjkQLjxzoj6LYwzZ7qZvgsLSc+eqItCrqIop8Vl2UKoAi0StVWu97FQZIQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@typescript-eslint/types\": \"7.7.1\",\n        \"@typescript-eslint/visitor-keys\": \"7.7.1\",\n        \"debug\": \"^4.3.4\",\n        \"globby\": \"^11.1.0\",\n        \"is-glob\": \"^4.0.3\",\n        \"minimatch\": \"^9.0.4\",\n        \"semver\": \"^7.6.0\",\n        \"ts-api-utils\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \"^18.18.0 || >=20.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/typescript-eslint\"\n      },\n      \"peerDependenciesMeta\": {\n        \"typescript\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz\",\n      \"integrity\": \"sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch\": {\n      \"version\": \"9.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz\",\n      \"integrity\": \"sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/@typescript-eslint/utils\": {\n      \"version\": \"7.7.1\",\n      \"resolved\": \"https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.7.1.tgz\",\n      \"integrity\": \"sha512-QUvBxPEaBXf41ZBbaidKICgVL8Hin0p6prQDu6bbetWo39BKbWJxRsErOzMNT1rXvTll+J7ChrbmMCXM9rsvOQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@eslint-community/eslint-utils\": \"^4.4.0\",\n        \"@types/json-schema\": \"^7.0.15\",\n        \"@types/semver\": \"^7.5.8\",\n        \"@typescript-eslint/scope-manager\": \"7.7.1\",\n        \"@typescript-eslint/types\": \"7.7.1\",\n        \"@typescript-eslint/typescript-estree\": \"7.7.1\",\n        \"semver\": \"^7.6.0\"\n      },\n      \"engines\": {\n        \"node\": \"^18.18.0 || >=20.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/typescript-eslint\"\n      },\n      \"peerDependencies\": {\n        \"eslint\": \"^8.56.0\"\n      }\n    },\n    \"node_modules/@typescript-eslint/visitor-keys\": {\n      \"version\": \"7.7.1\",\n      \"resolved\": \"https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.1.tgz\",\n      \"integrity\": \"sha512-gBL3Eq25uADw1LQ9kVpf3hRM+DWzs0uZknHYK3hq4jcTPqVCClHGDnB6UUUV2SFeBeA4KWHWbbLqmbGcZ4FYbw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@typescript-eslint/types\": \"7.7.1\",\n        \"eslint-visitor-keys\": \"^3.4.3\"\n      },\n      \"engines\": {\n        \"node\": \"^18.18.0 || >=20.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/typescript-eslint\"\n      }\n    },\n    \"node_modules/@ungap/structured-clone\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz\",\n      \"integrity\": \"sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==\",\n      \"dev\": true\n    },\n    \"node_modules/@vercel/webpack-asset-relocator-loader\": {\n      \"version\": \"1.7.3\",\n      \"resolved\": \"https://registry.npmjs.org/@vercel/webpack-asset-relocator-loader/-/webpack-asset-relocator-loader-1.7.3.tgz\",\n      \"integrity\": \"sha512-vizrI18v8Lcb1PmNNUBz7yxPxxXoOeuaVEjTG9MjvDrphjiSxFZrRJ5tIghk+qdLFRCXI5HBCshgobftbmrC5g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"resolve\": \"^1.10.0\"\n      }\n    },\n    \"node_modules/@vitest/snapshot\": {\n      \"version\": \"1.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.5.2.tgz\",\n      \"integrity\": \"sha512-CTEp/lTYos8fuCc9+Z55Ga5NVPKUgExritjF5VY7heRFUfheoAqBneUlvXSUJHUZPjnPmyZA96yLRJDP1QATFQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"magic-string\": \"^0.30.5\",\n        \"pathe\": \"^1.1.1\",\n        \"pretty-format\": \"^29.7.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/vitest\"\n      }\n    },\n    \"node_modules/@vitest/spy\": {\n      \"version\": \"1.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/@vitest/spy/-/spy-1.5.2.tgz\",\n      \"integrity\": \"sha512-xCcPvI8JpCtgikT9nLpHPL1/81AYqZy1GCy4+MCHBE7xi8jgsYkULpW5hrx5PGLgOQjUpb6fd15lqcriJ40tfQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"tinyspy\": \"^2.2.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/vitest\"\n      }\n    },\n    \"node_modules/@vue/compiler-core\": {\n      \"version\": \"3.4.25\",\n      \"resolved\": \"https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.25.tgz\",\n      \"integrity\": \"sha512-Y2pLLopaElgWnMNolgG8w3C5nNUVev80L7hdQ5iIKPtMJvhVpG0zhnBG/g3UajJmZdvW0fktyZTotEHD1Srhbg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/parser\": \"^7.24.4\",\n        \"@vue/shared\": \"3.4.25\",\n        \"entities\": \"^4.5.0\",\n        \"estree-walker\": \"^2.0.2\",\n        \"source-map-js\": \"^1.2.0\"\n      }\n    },\n    \"node_modules/@vue/compiler-dom\": {\n      \"version\": \"3.4.25\",\n      \"resolved\": \"https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.25.tgz\",\n      \"integrity\": \"sha512-Ugz5DusW57+HjllAugLci19NsDK+VyjGvmbB2TXaTcSlQxwL++2PETHx/+Qv6qFwNLzSt7HKepPe4DcTE3pBWg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@vue/compiler-core\": \"3.4.25\",\n        \"@vue/shared\": \"3.4.25\"\n      }\n    },\n    \"node_modules/@vue/compiler-sfc\": {\n      \"version\": \"3.4.25\",\n      \"resolved\": \"https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.25.tgz\",\n      \"integrity\": \"sha512-m7rryuqzIoQpOBZ18wKyq05IwL6qEpZxFZfRxlNYuIPDqywrXQxgUwLXIvoU72gs6cRdY6wHD0WVZIFE4OEaAQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/parser\": \"^7.24.4\",\n        \"@vue/compiler-core\": \"3.4.25\",\n        \"@vue/compiler-dom\": \"3.4.25\",\n        \"@vue/compiler-ssr\": \"3.4.25\",\n        \"@vue/shared\": \"3.4.25\",\n        \"estree-walker\": \"^2.0.2\",\n        \"magic-string\": \"^0.30.10\",\n        \"postcss\": \"^8.4.38\",\n        \"source-map-js\": \"^1.2.0\"\n      }\n    },\n    \"node_modules/@vue/compiler-ssr\": {\n      \"version\": \"3.4.25\",\n      \"resolved\": \"https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.25.tgz\",\n      \"integrity\": \"sha512-H2ohvM/Pf6LelGxDBnfbbXFPyM4NE3hrw0e/EpwuSiYu8c819wx+SVGdJ65p/sFrYDd6OnSDxN1MB2mN07hRSQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@vue/compiler-dom\": \"3.4.25\",\n        \"@vue/shared\": \"3.4.25\"\n      }\n    },\n    \"node_modules/@vue/shared\": {\n      \"version\": \"3.4.25\",\n      \"resolved\": \"https://registry.npmjs.org/@vue/shared/-/shared-3.4.25.tgz\",\n      \"integrity\": \"sha512-k0yappJ77g2+KNrIaF0FFnzwLvUBLUYr8VOwz+/6vLsmItFp51AcxLL7Ey3iPd7BIRyWPOcqUjMnm7OkahXllA==\",\n      \"dev\": true\n    },\n    \"node_modules/@wdio/cli\": {\n      \"version\": \"8.36.1\",\n      \"resolved\": \"https://registry.npmjs.org/@wdio/cli/-/cli-8.36.1.tgz\",\n      \"integrity\": \"sha512-LZBZiwcvvv5P0HuRXt8IV09UiFT5dnDr1Ag5u2roJL2D7l8wDHHa70PXw9MmlbrnyFCUN3hO7FQVUi9MAsDbDQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/node\": \"^20.1.1\",\n        \"@vitest/snapshot\": \"^1.2.1\",\n        \"@wdio/config\": \"8.36.1\",\n        \"@wdio/globals\": \"8.36.1\",\n        \"@wdio/logger\": \"8.28.0\",\n        \"@wdio/protocols\": \"8.32.0\",\n        \"@wdio/types\": \"8.36.1\",\n        \"@wdio/utils\": \"8.36.1\",\n        \"async-exit-hook\": \"^2.0.1\",\n        \"chalk\": \"^5.2.0\",\n        \"chokidar\": \"^3.5.3\",\n        \"cli-spinners\": \"^2.9.0\",\n        \"dotenv\": \"^16.3.1\",\n        \"ejs\": \"^3.1.9\",\n        \"execa\": \"^8.0.1\",\n        \"import-meta-resolve\": \"^4.0.0\",\n        \"inquirer\": \"9.2.12\",\n        \"lodash.flattendeep\": \"^4.4.0\",\n        \"lodash.pickby\": \"^4.6.0\",\n        \"lodash.union\": \"^4.6.0\",\n        \"read-pkg-up\": \"10.0.0\",\n        \"recursive-readdir\": \"^2.2.3\",\n        \"webdriverio\": \"8.36.1\",\n        \"yargs\": \"^17.7.2\"\n      },\n      \"bin\": {\n        \"wdio\": \"bin/wdio.js\"\n      },\n      \"engines\": {\n        \"node\": \"^16.13 || >=18\"\n      }\n    },\n    \"node_modules/@wdio/cli/node_modules/chalk\": {\n      \"version\": \"5.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz\",\n      \"integrity\": \"sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.17.0 || ^14.13 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/chalk?sponsor=1\"\n      }\n    },\n    \"node_modules/@wdio/config\": {\n      \"version\": \"8.36.1\",\n      \"resolved\": \"https://registry.npmjs.org/@wdio/config/-/config-8.36.1.tgz\",\n      \"integrity\": \"sha512-yCENnym0CrYuLKMJ3fv00WkjCR8QpPqVohGBkq5FvZOZpVJEpoG86Q8l4HtyRnd6ggMTKCA1vTQ/myhbPmZmaQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@wdio/logger\": \"8.28.0\",\n        \"@wdio/types\": \"8.36.1\",\n        \"@wdio/utils\": \"8.36.1\",\n        \"decamelize\": \"^6.0.0\",\n        \"deepmerge-ts\": \"^5.0.0\",\n        \"glob\": \"^10.2.2\",\n        \"import-meta-resolve\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^16.13 || >=18\"\n      }\n    },\n    \"node_modules/@wdio/globals\": {\n      \"version\": \"8.36.1\",\n      \"resolved\": \"https://registry.npmjs.org/@wdio/globals/-/globals-8.36.1.tgz\",\n      \"integrity\": \"sha512-Qpj6gZCRNxqdVkTwYyi4JdeYO4tLSUj3Ti6yxO0v9A4IRaKW1tS29KUcGgjL9CFSBKAOi2zRY8vvFz1u6ewxtQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^16.13 || >=18\"\n      },\n      \"optionalDependencies\": {\n        \"expect-webdriverio\": \"^4.11.2\",\n        \"webdriverio\": \"8.36.1\"\n      }\n    },\n    \"node_modules/@wdio/local-runner\": {\n      \"version\": \"8.36.1\",\n      \"resolved\": \"https://registry.npmjs.org/@wdio/local-runner/-/local-runner-8.36.1.tgz\",\n      \"integrity\": \"sha512-FYsTzbNGRnrniOsLWrZO7+DLecAS9W75AIzFZQVQxruiDFkGmKY5OV6gsuvMlasaqAQXW1s+w29bqrLY4DxdEw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/node\": \"^20.1.0\",\n        \"@wdio/logger\": \"8.28.0\",\n        \"@wdio/repl\": \"8.24.12\",\n        \"@wdio/runner\": \"8.36.1\",\n        \"@wdio/types\": \"8.36.1\",\n        \"async-exit-hook\": \"^2.0.1\",\n        \"split2\": \"^4.1.0\",\n        \"stream-buffers\": \"^3.0.2\"\n      },\n      \"engines\": {\n        \"node\": \"^16.13 || >=18\"\n      }\n    },\n    \"node_modules/@wdio/logger\": {\n      \"version\": \"8.28.0\",\n      \"resolved\": \"https://registry.npmjs.org/@wdio/logger/-/logger-8.28.0.tgz\",\n      \"integrity\": \"sha512-/s6zNCqwy1hoc+K4SJypis0Ud0dlJ+urOelJFO1x0G0rwDRWyFiUP6ijTaCcFxAm29jYEcEPWijl2xkVIHwOyA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"chalk\": \"^5.1.2\",\n        \"loglevel\": \"^1.6.0\",\n        \"loglevel-plugin-prefix\": \"^0.8.4\",\n        \"strip-ansi\": \"^7.1.0\"\n      },\n      \"engines\": {\n        \"node\": \"^16.13 || >=18\"\n      }\n    },\n    \"node_modules/@wdio/logger/node_modules/chalk\": {\n      \"version\": \"5.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz\",\n      \"integrity\": \"sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.17.0 || ^14.13 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/chalk?sponsor=1\"\n      }\n    },\n    \"node_modules/@wdio/mocha-framework\": {\n      \"version\": \"8.36.1\",\n      \"resolved\": \"https://registry.npmjs.org/@wdio/mocha-framework/-/mocha-framework-8.36.1.tgz\",\n      \"integrity\": \"sha512-G0h5AeneMNtoh9CcVQ82OCKj0axxUOEotEcInDu8V6UJbUywNJVL/bdTMKdaq5i84Hnc+s1LUKmLvN95F+lHGA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/mocha\": \"^10.0.0\",\n        \"@types/node\": \"^20.1.0\",\n        \"@wdio/logger\": \"8.28.0\",\n        \"@wdio/types\": \"8.36.1\",\n        \"@wdio/utils\": \"8.36.1\",\n        \"mocha\": \"^10.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^16.13 || >=18\"\n      }\n    },\n    \"node_modules/@wdio/protocols\": {\n      \"version\": \"8.32.0\",\n      \"resolved\": \"https://registry.npmjs.org/@wdio/protocols/-/protocols-8.32.0.tgz\",\n      \"integrity\": \"sha512-inLJRrtIGdTz/YPbcsvpSvPlYQFTVtF3OYBwAXhG2FiP1ZwE1CQNLP/xgRGye1ymdGCypGkexRqIx3KBGm801Q==\",\n      \"dev\": true\n    },\n    \"node_modules/@wdio/repl\": {\n      \"version\": \"8.24.12\",\n      \"resolved\": \"https://registry.npmjs.org/@wdio/repl/-/repl-8.24.12.tgz\",\n      \"integrity\": \"sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/node\": \"^20.1.0\"\n      },\n      \"engines\": {\n        \"node\": \"^16.13 || >=18\"\n      }\n    },\n    \"node_modules/@wdio/reporter\": {\n      \"version\": \"8.36.1\",\n      \"resolved\": \"https://registry.npmjs.org/@wdio/reporter/-/reporter-8.36.1.tgz\",\n      \"integrity\": \"sha512-HcXr9XKq/6kPC9nexMRXIc/ft3Lvp0yCaW5tps01Axus9wbi5ysLHi2z5sB84F2YdpM+aRf7Lac56xkc4Jldeg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/node\": \"^20.1.0\",\n        \"@wdio/logger\": \"8.28.0\",\n        \"@wdio/types\": \"8.36.1\",\n        \"diff\": \"^5.0.0\",\n        \"object-inspect\": \"^1.12.0\"\n      },\n      \"engines\": {\n        \"node\": \"^16.13 || >=18\"\n      }\n    },\n    \"node_modules/@wdio/runner\": {\n      \"version\": \"8.36.1\",\n      \"resolved\": \"https://registry.npmjs.org/@wdio/runner/-/runner-8.36.1.tgz\",\n      \"integrity\": \"sha512-bLkxQ46MLEbzIf30adl2nyz8kxED/V0IjcQASm0VKfNmsG8LOf7iOIz+udOF4GkMoF++5JuONA5abUsyLvwatg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/node\": \"^20.11.28\",\n        \"@wdio/config\": \"8.36.1\",\n        \"@wdio/globals\": \"8.36.1\",\n        \"@wdio/logger\": \"8.28.0\",\n        \"@wdio/types\": \"8.36.1\",\n        \"@wdio/utils\": \"8.36.1\",\n        \"deepmerge-ts\": \"^5.1.0\",\n        \"expect-webdriverio\": \"^4.12.0\",\n        \"gaze\": \"^1.1.3\",\n        \"webdriver\": \"8.36.1\",\n        \"webdriverio\": \"8.36.1\"\n      },\n      \"engines\": {\n        \"node\": \"^16.13 || >=18\"\n      }\n    },\n    \"node_modules/@wdio/spec-reporter\": {\n      \"version\": \"8.36.1\",\n      \"resolved\": \"https://registry.npmjs.org/@wdio/spec-reporter/-/spec-reporter-8.36.1.tgz\",\n      \"integrity\": \"sha512-VgAd8VQCfwKYz4A3BPDUYNIQxXhRSTaVNbmDzSlYfo5Jekygk7fz0LRFYBpJ69l7eQH0P5nzEyF92oW/rvE3VA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@wdio/reporter\": \"8.36.1\",\n        \"@wdio/types\": \"8.36.1\",\n        \"chalk\": \"^5.1.2\",\n        \"easy-table\": \"^1.2.0\",\n        \"pretty-ms\": \"^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^16.13 || >=18\"\n      }\n    },\n    \"node_modules/@wdio/spec-reporter/node_modules/chalk\": {\n      \"version\": \"5.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz\",\n      \"integrity\": \"sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.17.0 || ^14.13 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/chalk?sponsor=1\"\n      }\n    },\n    \"node_modules/@wdio/types\": {\n      \"version\": \"8.36.1\",\n      \"resolved\": \"https://registry.npmjs.org/@wdio/types/-/types-8.36.1.tgz\",\n      \"integrity\": \"sha512-kKtyJbypasKo/VQuJ6dTQQwFtHE9qoygjoCZjrQCLGraRSjOEiqZHPR0497wbeCvcgHIYyImbmcylqZNGUE0CQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/node\": \"^20.1.0\"\n      },\n      \"engines\": {\n        \"node\": \"^16.13 || >=18\"\n      }\n    },\n    \"node_modules/@wdio/utils\": {\n      \"version\": \"8.36.1\",\n      \"resolved\": \"https://registry.npmjs.org/@wdio/utils/-/utils-8.36.1.tgz\",\n      \"integrity\": \"sha512-xmgPHU11/o9n2FeRmDFkPRC0okiwA1i2xOcR2c3aSpuk99XkAm9RaMn/6u9LFaqsCpgaVxazcYEGSceO7U4hZA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@puppeteer/browsers\": \"^1.6.0\",\n        \"@wdio/logger\": \"8.28.0\",\n        \"@wdio/types\": \"8.36.1\",\n        \"decamelize\": \"^6.0.0\",\n        \"deepmerge-ts\": \"^5.1.0\",\n        \"edgedriver\": \"^5.3.5\",\n        \"geckodriver\": \"^4.3.1\",\n        \"get-port\": \"^7.0.0\",\n        \"import-meta-resolve\": \"^4.0.0\",\n        \"locate-app\": \"^2.1.0\",\n        \"safaridriver\": \"^0.1.0\",\n        \"split2\": \"^4.2.0\",\n        \"wait-port\": \"^1.0.4\"\n      },\n      \"engines\": {\n        \"node\": \"^16.13 || >=18\"\n      }\n    },\n    \"node_modules/@webassemblyjs/ast\": {\n      \"version\": \"1.12.1\",\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz\",\n      \"integrity\": \"sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@webassemblyjs/helper-numbers\": \"1.11.6\",\n        \"@webassemblyjs/helper-wasm-bytecode\": \"1.11.6\"\n      }\n    },\n    \"node_modules/@webassemblyjs/floating-point-hex-parser\": {\n      \"version\": \"1.11.6\",\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz\",\n      \"integrity\": \"sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==\",\n      \"dev\": true\n    },\n    \"node_modules/@webassemblyjs/helper-api-error\": {\n      \"version\": \"1.11.6\",\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz\",\n      \"integrity\": \"sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==\",\n      \"dev\": true\n    },\n    \"node_modules/@webassemblyjs/helper-buffer\": {\n      \"version\": \"1.12.1\",\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz\",\n      \"integrity\": \"sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==\",\n      \"dev\": true\n    },\n    \"node_modules/@webassemblyjs/helper-numbers\": {\n      \"version\": \"1.11.6\",\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz\",\n      \"integrity\": \"sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@webassemblyjs/floating-point-hex-parser\": \"1.11.6\",\n        \"@webassemblyjs/helper-api-error\": \"1.11.6\",\n        \"@xtuc/long\": \"4.2.2\"\n      }\n    },\n    \"node_modules/@webassemblyjs/helper-wasm-bytecode\": {\n      \"version\": \"1.11.6\",\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz\",\n      \"integrity\": \"sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==\",\n      \"dev\": true\n    },\n    \"node_modules/@webassemblyjs/helper-wasm-section\": {\n      \"version\": \"1.12.1\",\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz\",\n      \"integrity\": \"sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@webassemblyjs/ast\": \"1.12.1\",\n        \"@webassemblyjs/helper-buffer\": \"1.12.1\",\n        \"@webassemblyjs/helper-wasm-bytecode\": \"1.11.6\",\n        \"@webassemblyjs/wasm-gen\": \"1.12.1\"\n      }\n    },\n    \"node_modules/@webassemblyjs/ieee754\": {\n      \"version\": \"1.11.6\",\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz\",\n      \"integrity\": \"sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@xtuc/ieee754\": \"^1.2.0\"\n      }\n    },\n    \"node_modules/@webassemblyjs/leb128\": {\n      \"version\": \"1.11.6\",\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz\",\n      \"integrity\": \"sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@xtuc/long\": \"4.2.2\"\n      }\n    },\n    \"node_modules/@webassemblyjs/utf8\": {\n      \"version\": \"1.11.6\",\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz\",\n      \"integrity\": \"sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==\",\n      \"dev\": true\n    },\n    \"node_modules/@webassemblyjs/wasm-edit\": {\n      \"version\": \"1.12.1\",\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz\",\n      \"integrity\": \"sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@webassemblyjs/ast\": \"1.12.1\",\n        \"@webassemblyjs/helper-buffer\": \"1.12.1\",\n        \"@webassemblyjs/helper-wasm-bytecode\": \"1.11.6\",\n        \"@webassemblyjs/helper-wasm-section\": \"1.12.1\",\n        \"@webassemblyjs/wasm-gen\": \"1.12.1\",\n        \"@webassemblyjs/wasm-opt\": \"1.12.1\",\n        \"@webassemblyjs/wasm-parser\": \"1.12.1\",\n        \"@webassemblyjs/wast-printer\": \"1.12.1\"\n      }\n    },\n    \"node_modules/@webassemblyjs/wasm-gen\": {\n      \"version\": \"1.12.1\",\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz\",\n      \"integrity\": \"sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@webassemblyjs/ast\": \"1.12.1\",\n        \"@webassemblyjs/helper-wasm-bytecode\": \"1.11.6\",\n        \"@webassemblyjs/ieee754\": \"1.11.6\",\n        \"@webassemblyjs/leb128\": \"1.11.6\",\n        \"@webassemblyjs/utf8\": \"1.11.6\"\n      }\n    },\n    \"node_modules/@webassemblyjs/wasm-opt\": {\n      \"version\": \"1.12.1\",\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz\",\n      \"integrity\": \"sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@webassemblyjs/ast\": \"1.12.1\",\n        \"@webassemblyjs/helper-buffer\": \"1.12.1\",\n        \"@webassemblyjs/wasm-gen\": \"1.12.1\",\n        \"@webassemblyjs/wasm-parser\": \"1.12.1\"\n      }\n    },\n    \"node_modules/@webassemblyjs/wasm-parser\": {\n      \"version\": \"1.12.1\",\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz\",\n      \"integrity\": \"sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@webassemblyjs/ast\": \"1.12.1\",\n        \"@webassemblyjs/helper-api-error\": \"1.11.6\",\n        \"@webassemblyjs/helper-wasm-bytecode\": \"1.11.6\",\n        \"@webassemblyjs/ieee754\": \"1.11.6\",\n        \"@webassemblyjs/leb128\": \"1.11.6\",\n        \"@webassemblyjs/utf8\": \"1.11.6\"\n      }\n    },\n    \"node_modules/@webassemblyjs/wast-printer\": {\n      \"version\": \"1.12.1\",\n      \"resolved\": \"https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz\",\n      \"integrity\": \"sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@webassemblyjs/ast\": \"1.12.1\",\n        \"@xtuc/long\": \"4.2.2\"\n      }\n    },\n    \"node_modules/@xmldom/xmldom\": {\n      \"version\": \"0.8.10\",\n      \"resolved\": \"https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz\",\n      \"integrity\": \"sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=10.0.0\"\n      }\n    },\n    \"node_modules/@xtuc/ieee754\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz\",\n      \"integrity\": \"sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==\",\n      \"dev\": true\n    },\n    \"node_modules/@xtuc/long\": {\n      \"version\": \"4.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz\",\n      \"integrity\": \"sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==\",\n      \"dev\": true\n    },\n    \"node_modules/@yao-pkg/pkg\": {\n      \"version\": \"5.11.5\",\n      \"resolved\": \"https://registry.npmjs.org/@yao-pkg/pkg/-/pkg-5.11.5.tgz\",\n      \"integrity\": \"sha512-NPFXCn+5bAYZKej7jI92+mXiWG/LA6pEIJCXgI4MM3aYhUFrQOPrYKYr3cGXGs9lkgKGovlnMcKGDjwJ3B7rCQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/generator\": \"7.23.0\",\n        \"@babel/parser\": \"7.23.0\",\n        \"@babel/types\": \"7.23.0\",\n        \"@yao-pkg/pkg-fetch\": \"3.5.9\",\n        \"chalk\": \"^4.1.2\",\n        \"fs-extra\": \"^9.1.0\",\n        \"globby\": \"^11.1.0\",\n        \"into-stream\": \"^6.0.0\",\n        \"is-core-module\": \"2.9.0\",\n        \"minimist\": \"^1.2.6\",\n        \"multistream\": \"^4.1.0\",\n        \"prebuild-install\": \"7.1.1\",\n        \"resolve\": \"^1.22.0\",\n        \"stream-meter\": \"^1.0.4\"\n      },\n      \"bin\": {\n        \"pkg\": \"lib-es5/bin.js\"\n      }\n    },\n    \"node_modules/@yao-pkg/pkg-fetch\": {\n      \"version\": \"3.5.9\",\n      \"resolved\": \"https://registry.npmjs.org/@yao-pkg/pkg-fetch/-/pkg-fetch-3.5.9.tgz\",\n      \"integrity\": \"sha512-usMwwqFCd2B7k+V87u6kiTesyDSlw+3LpiuYBWe+UgryvSOk/NXjx3XVCub8hQoi0bCREbdQ6NDBqminyHJJrg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"chalk\": \"^4.1.2\",\n        \"fs-extra\": \"^9.1.0\",\n        \"https-proxy-agent\": \"^5.0.0\",\n        \"node-fetch\": \"^2.6.6\",\n        \"progress\": \"^2.0.3\",\n        \"semver\": \"^7.3.5\",\n        \"tar-fs\": \"^2.1.1\",\n        \"yargs\": \"^16.2.0\"\n      },\n      \"bin\": {\n        \"pkg-fetch\": \"lib-es5/bin.js\"\n      }\n    },\n    \"node_modules/@yao-pkg/pkg-fetch/node_modules/chownr\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz\",\n      \"integrity\": \"sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==\",\n      \"dev\": true\n    },\n    \"node_modules/@yao-pkg/pkg-fetch/node_modules/cliui\": {\n      \"version\": \"7.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz\",\n      \"integrity\": \"sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"string-width\": \"^4.2.0\",\n        \"strip-ansi\": \"^6.0.0\",\n        \"wrap-ansi\": \"^7.0.0\"\n      }\n    },\n    \"node_modules/@yao-pkg/pkg-fetch/node_modules/fs-extra\": {\n      \"version\": \"9.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz\",\n      \"integrity\": \"sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"at-least-node\": \"^1.0.0\",\n        \"graceful-fs\": \"^4.2.0\",\n        \"jsonfile\": \"^6.0.1\",\n        \"universalify\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/@yao-pkg/pkg-fetch/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/@yao-pkg/pkg-fetch/node_modules/tar-fs\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz\",\n      \"integrity\": \"sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"chownr\": \"^1.1.1\",\n        \"mkdirp-classic\": \"^0.5.2\",\n        \"pump\": \"^3.0.0\",\n        \"tar-stream\": \"^2.1.4\"\n      }\n    },\n    \"node_modules/@yao-pkg/pkg-fetch/node_modules/tar-stream\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz\",\n      \"integrity\": \"sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"bl\": \"^4.0.3\",\n        \"end-of-stream\": \"^1.4.1\",\n        \"fs-constants\": \"^1.0.0\",\n        \"inherits\": \"^2.0.3\",\n        \"readable-stream\": \"^3.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/@yao-pkg/pkg-fetch/node_modules/wrap-ansi\": {\n      \"version\": \"7.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n      \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.0.0\",\n        \"string-width\": \"^4.1.0\",\n        \"strip-ansi\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/@yao-pkg/pkg-fetch/node_modules/y18n\": {\n      \"version\": \"5.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz\",\n      \"integrity\": \"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/@yao-pkg/pkg-fetch/node_modules/yargs\": {\n      \"version\": \"16.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz\",\n      \"integrity\": \"sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"cliui\": \"^7.0.2\",\n        \"escalade\": \"^3.1.1\",\n        \"get-caller-file\": \"^2.0.5\",\n        \"require-directory\": \"^2.1.1\",\n        \"string-width\": \"^4.2.0\",\n        \"y18n\": \"^5.0.5\",\n        \"yargs-parser\": \"^20.2.2\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/@yao-pkg/pkg-fetch/node_modules/yargs-parser\": {\n      \"version\": \"20.2.9\",\n      \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz\",\n      \"integrity\": \"sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/@yao-pkg/pkg/node_modules/@babel/generator\": {\n      \"version\": \"7.23.0\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz\",\n      \"integrity\": \"sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/types\": \"^7.23.0\",\n        \"@jridgewell/gen-mapping\": \"^0.3.2\",\n        \"@jridgewell/trace-mapping\": \"^0.3.17\",\n        \"jsesc\": \"^2.5.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@yao-pkg/pkg/node_modules/@babel/parser\": {\n      \"version\": \"7.23.0\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz\",\n      \"integrity\": \"sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==\",\n      \"dev\": true,\n      \"bin\": {\n        \"parser\": \"bin/babel-parser.js\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@yao-pkg/pkg/node_modules/@babel/types\": {\n      \"version\": \"7.23.0\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz\",\n      \"integrity\": \"sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-string-parser\": \"^7.22.5\",\n        \"@babel/helper-validator-identifier\": \"^7.22.20\",\n        \"to-fast-properties\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@yao-pkg/pkg/node_modules/fs-extra\": {\n      \"version\": \"9.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz\",\n      \"integrity\": \"sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"at-least-node\": \"^1.0.0\",\n        \"graceful-fs\": \"^4.2.0\",\n        \"jsonfile\": \"^6.0.1\",\n        \"universalify\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/abbrev\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz\",\n      \"integrity\": \"sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==\",\n      \"dev\": true,\n      \"license\": \"ISC\"\n    },\n    \"node_modules/abort-controller\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz\",\n      \"integrity\": \"sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"event-target-shim\": \"^5.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.5\"\n      }\n    },\n    \"node_modules/accepts\": {\n      \"version\": \"1.3.8\",\n      \"resolved\": \"https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz\",\n      \"integrity\": \"sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"mime-types\": \"~2.1.34\",\n        \"negotiator\": \"0.6.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/acorn\": {\n      \"version\": \"8.11.3\",\n      \"resolved\": \"https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz\",\n      \"integrity\": \"sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==\",\n      \"dev\": true,\n      \"bin\": {\n        \"acorn\": \"bin/acorn\"\n      },\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/acorn-import-assertions\": {\n      \"version\": \"1.9.0\",\n      \"resolved\": \"https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz\",\n      \"integrity\": \"sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==\",\n      \"dev\": true,\n      \"peerDependencies\": {\n        \"acorn\": \"^8\"\n      }\n    },\n    \"node_modules/acorn-jsx\": {\n      \"version\": \"5.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz\",\n      \"integrity\": \"sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==\",\n      \"dev\": true,\n      \"peerDependencies\": {\n        \"acorn\": \"^6.0.0 || ^7.0.0 || ^8.0.0\"\n      }\n    },\n    \"node_modules/acorn-walk\": {\n      \"version\": \"8.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz\",\n      \"integrity\": \"sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/agent-base\": {\n      \"version\": \"7.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz\",\n      \"integrity\": \"sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"debug\": \"^4.3.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/agentkeepalive\": {\n      \"version\": \"4.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz\",\n      \"integrity\": \"sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"humanize-ms\": \"^1.2.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 8.0.0\"\n      }\n    },\n    \"node_modules/aggregate-error\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz\",\n      \"integrity\": \"sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"clean-stack\": \"^2.0.0\",\n        \"indent-string\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/ajv\": {\n      \"version\": \"6.12.6\",\n      \"resolved\": \"https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz\",\n      \"integrity\": \"sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==\",\n      \"dependencies\": {\n        \"fast-deep-equal\": \"^3.1.1\",\n        \"fast-json-stable-stringify\": \"^2.0.0\",\n        \"json-schema-traverse\": \"^0.4.1\",\n        \"uri-js\": \"^4.2.2\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/epoberezkin\"\n      }\n    },\n    \"node_modules/ajv-formats\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz\",\n      \"integrity\": \"sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ajv\": \"^8.0.0\"\n      },\n      \"peerDependencies\": {\n        \"ajv\": \"^8.0.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"ajv\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/ajv-formats/node_modules/ajv\": {\n      \"version\": \"8.12.0\",\n      \"resolved\": \"https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz\",\n      \"integrity\": \"sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"fast-deep-equal\": \"^3.1.1\",\n        \"json-schema-traverse\": \"^1.0.0\",\n        \"require-from-string\": \"^2.0.2\",\n        \"uri-js\": \"^4.2.2\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/epoberezkin\"\n      }\n    },\n    \"node_modules/ajv-formats/node_modules/json-schema-traverse\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz\",\n      \"integrity\": \"sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==\",\n      \"dev\": true\n    },\n    \"node_modules/ajv-keywords\": {\n      \"version\": \"3.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz\",\n      \"integrity\": \"sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==\",\n      \"peerDependencies\": {\n        \"ajv\": \"^6.9.1\"\n      }\n    },\n    \"node_modules/ansi-align\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz\",\n      \"integrity\": \"sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==\",\n      \"dependencies\": {\n        \"string-width\": \"^4.1.0\"\n      }\n    },\n    \"node_modules/ansi-colors\": {\n      \"version\": \"4.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz\",\n      \"integrity\": \"sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/ansi-escapes\": {\n      \"version\": \"4.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz\",\n      \"integrity\": \"sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==\",\n      \"dependencies\": {\n        \"type-fest\": \"^0.21.3\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/ansi-html-community\": {\n      \"version\": \"0.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz\",\n      \"integrity\": \"sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==\",\n      \"dev\": true,\n      \"engines\": [\n        \"node >= 0.8.0\"\n      ],\n      \"bin\": {\n        \"ansi-html\": \"bin/ansi-html\"\n      }\n    },\n    \"node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/ansi-styles\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n      \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n      \"dependencies\": {\n        \"color-convert\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/anymatch\": {\n      \"version\": \"3.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz\",\n      \"integrity\": \"sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"normalize-path\": \"^3.0.0\",\n        \"picomatch\": \"^2.0.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/appdmg\": {\n      \"version\": \"0.6.6\",\n      \"resolved\": \"https://registry.npmjs.org/appdmg/-/appdmg-0.6.6.tgz\",\n      \"integrity\": \"sha512-GRmFKlCG+PWbcYF4LUNonTYmy0GjguDy6Jh9WP8mpd0T6j80XIJyXBiWlD0U+MLNhqV9Nhx49Gl9GpVToulpLg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"dependencies\": {\n        \"async\": \"^1.4.2\",\n        \"ds-store\": \"^0.1.5\",\n        \"execa\": \"^1.0.0\",\n        \"fs-temp\": \"^1.0.0\",\n        \"fs-xattr\": \"^0.3.0\",\n        \"image-size\": \"^0.7.4\",\n        \"is-my-json-valid\": \"^2.20.0\",\n        \"minimist\": \"^1.1.3\",\n        \"parse-color\": \"^1.0.0\",\n        \"path-exists\": \"^4.0.0\",\n        \"repeat-string\": \"^1.5.4\"\n      },\n      \"bin\": {\n        \"appdmg\": \"bin/appdmg.js\"\n      },\n      \"engines\": {\n        \"node\": \">=8.5\"\n      }\n    },\n    \"node_modules/appdmg/node_modules/cross-spawn\": {\n      \"version\": \"6.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz\",\n      \"integrity\": \"sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"nice-try\": \"^1.0.4\",\n        \"path-key\": \"^2.0.1\",\n        \"semver\": \"^5.5.0\",\n        \"shebang-command\": \"^1.2.0\",\n        \"which\": \"^1.2.9\"\n      },\n      \"engines\": {\n        \"node\": \">=4.8\"\n      }\n    },\n    \"node_modules/appdmg/node_modules/execa\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/execa/-/execa-1.0.0.tgz\",\n      \"integrity\": \"sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"cross-spawn\": \"^6.0.0\",\n        \"get-stream\": \"^4.0.0\",\n        \"is-stream\": \"^1.1.0\",\n        \"npm-run-path\": \"^2.0.0\",\n        \"p-finally\": \"^1.0.0\",\n        \"signal-exit\": \"^3.0.0\",\n        \"strip-eof\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/appdmg/node_modules/get-stream\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz\",\n      \"integrity\": \"sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"pump\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/appdmg/node_modules/is-stream\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz\",\n      \"integrity\": \"sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/appdmg/node_modules/npm-run-path\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz\",\n      \"integrity\": \"sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"path-key\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/appdmg/node_modules/path-key\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz\",\n      \"integrity\": \"sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/appdmg/node_modules/semver\": {\n      \"version\": \"5.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-5.7.2.tgz\",\n      \"integrity\": \"sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"optional\": true,\n      \"bin\": {\n        \"semver\": \"bin/semver\"\n      }\n    },\n    \"node_modules/appdmg/node_modules/shebang-command\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz\",\n      \"integrity\": \"sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"shebang-regex\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/appdmg/node_modules/shebang-regex\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz\",\n      \"integrity\": \"sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/appdmg/node_modules/signal-exit\": {\n      \"version\": \"3.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz\",\n      \"integrity\": \"sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"optional\": true\n    },\n    \"node_modules/appdmg/node_modules/which\": {\n      \"version\": \"1.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/which/-/which-1.3.1.tgz\",\n      \"integrity\": \"sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"isexe\": \"^2.0.0\"\n      },\n      \"bin\": {\n        \"which\": \"bin/which\"\n      }\n    },\n    \"node_modules/apple-data-compression\": {\n      \"version\": \"0.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/apple-data-compression/-/apple-data-compression-0.4.1.tgz\",\n      \"integrity\": \"sha512-wKooMJvyyqLT9NZ8839aE4jUU6FX/RxbipBwdPXPZ5bXHJCrvrxGoBV0grEy//laq1ZMAhVM8k2OTk9nsGOtqw==\",\n      \"dependencies\": {\n        \"bloodline\": \"^1.0.1\"\n      }\n    },\n    \"node_modules/archiver\": {\n      \"version\": \"7.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz\",\n      \"integrity\": \"sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"archiver-utils\": \"^5.0.2\",\n        \"async\": \"^3.2.4\",\n        \"buffer-crc32\": \"^1.0.0\",\n        \"readable-stream\": \"^4.0.0\",\n        \"readdir-glob\": \"^1.1.2\",\n        \"tar-stream\": \"^3.0.0\",\n        \"zip-stream\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/archiver-utils\": {\n      \"version\": \"5.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz\",\n      \"integrity\": \"sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"glob\": \"^10.0.0\",\n        \"graceful-fs\": \"^4.2.0\",\n        \"is-stream\": \"^2.0.1\",\n        \"lazystream\": \"^1.0.0\",\n        \"lodash\": \"^4.17.15\",\n        \"normalize-path\": \"^3.0.0\",\n        \"readable-stream\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/archiver-utils/node_modules/buffer\": {\n      \"version\": \"6.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz\",\n      \"integrity\": \"sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"dependencies\": {\n        \"base64-js\": \"^1.3.1\",\n        \"ieee754\": \"^1.2.1\"\n      }\n    },\n    \"node_modules/archiver-utils/node_modules/is-stream\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz\",\n      \"integrity\": \"sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/archiver-utils/node_modules/readable-stream\": {\n      \"version\": \"4.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz\",\n      \"integrity\": \"sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"abort-controller\": \"^3.0.0\",\n        \"buffer\": \"^6.0.3\",\n        \"events\": \"^3.3.0\",\n        \"process\": \"^0.11.10\",\n        \"string_decoder\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/archiver/node_modules/async\": {\n      \"version\": \"3.2.5\",\n      \"resolved\": \"https://registry.npmjs.org/async/-/async-3.2.5.tgz\",\n      \"integrity\": \"sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==\",\n      \"dev\": true\n    },\n    \"node_modules/archiver/node_modules/buffer\": {\n      \"version\": \"6.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz\",\n      \"integrity\": \"sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"dependencies\": {\n        \"base64-js\": \"^1.3.1\",\n        \"ieee754\": \"^1.2.1\"\n      }\n    },\n    \"node_modules/archiver/node_modules/readable-stream\": {\n      \"version\": \"4.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz\",\n      \"integrity\": \"sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"abort-controller\": \"^3.0.0\",\n        \"buffer\": \"^6.0.3\",\n        \"events\": \"^3.3.0\",\n        \"process\": \"^0.11.10\",\n        \"string_decoder\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/are-docs-informative\": {\n      \"version\": \"0.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz\",\n      \"integrity\": \"sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      }\n    },\n    \"node_modules/arg\": {\n      \"version\": \"4.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/arg/-/arg-4.1.3.tgz\",\n      \"integrity\": \"sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==\",\n      \"dev\": true\n    },\n    \"node_modules/argparse\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz\",\n      \"integrity\": \"sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==\"\n    },\n    \"node_modules/aria-query\": {\n      \"version\": \"5.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz\",\n      \"integrity\": \"sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"dequal\": \"^2.0.3\"\n      }\n    },\n    \"node_modules/array-buffer-byte-length\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz\",\n      \"integrity\": \"sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.5\",\n        \"is-array-buffer\": \"^3.0.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/array-differ\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz\",\n      \"integrity\": \"sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/array-flatten\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz\",\n      \"integrity\": \"sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==\",\n      \"dev\": true\n    },\n    \"node_modules/array-includes\": {\n      \"version\": \"3.1.8\",\n      \"resolved\": \"https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz\",\n      \"integrity\": \"sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.7\",\n        \"define-properties\": \"^1.2.1\",\n        \"es-abstract\": \"^1.23.2\",\n        \"es-object-atoms\": \"^1.0.0\",\n        \"get-intrinsic\": \"^1.2.4\",\n        \"is-string\": \"^1.0.7\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/array-union\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz\",\n      \"integrity\": \"sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/array.prototype.findlast\": {\n      \"version\": \"1.2.5\",\n      \"resolved\": \"https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz\",\n      \"integrity\": \"sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.7\",\n        \"define-properties\": \"^1.2.1\",\n        \"es-abstract\": \"^1.23.2\",\n        \"es-errors\": \"^1.3.0\",\n        \"es-object-atoms\": \"^1.0.0\",\n        \"es-shim-unscopables\": \"^1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/array.prototype.flat\": {\n      \"version\": \"1.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz\",\n      \"integrity\": \"sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.2\",\n        \"define-properties\": \"^1.2.0\",\n        \"es-abstract\": \"^1.22.1\",\n        \"es-shim-unscopables\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/array.prototype.flatmap\": {\n      \"version\": \"1.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz\",\n      \"integrity\": \"sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.2\",\n        \"define-properties\": \"^1.2.0\",\n        \"es-abstract\": \"^1.22.1\",\n        \"es-shim-unscopables\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/array.prototype.toreversed\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz\",\n      \"integrity\": \"sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.2\",\n        \"define-properties\": \"^1.2.0\",\n        \"es-abstract\": \"^1.22.1\",\n        \"es-shim-unscopables\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/array.prototype.tosorted\": {\n      \"version\": \"1.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz\",\n      \"integrity\": \"sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.5\",\n        \"define-properties\": \"^1.2.1\",\n        \"es-abstract\": \"^1.22.3\",\n        \"es-errors\": \"^1.1.0\",\n        \"es-shim-unscopables\": \"^1.0.2\"\n      }\n    },\n    \"node_modules/arraybuffer.prototype.slice\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz\",\n      \"integrity\": \"sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"array-buffer-byte-length\": \"^1.0.1\",\n        \"call-bind\": \"^1.0.5\",\n        \"define-properties\": \"^1.2.1\",\n        \"es-abstract\": \"^1.22.3\",\n        \"es-errors\": \"^1.2.1\",\n        \"get-intrinsic\": \"^1.2.3\",\n        \"is-array-buffer\": \"^3.0.4\",\n        \"is-shared-array-buffer\": \"^1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/arrify\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz\",\n      \"integrity\": \"sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/asap\": {\n      \"version\": \"2.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/asap/-/asap-2.0.6.tgz\",\n      \"integrity\": \"sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==\"\n    },\n    \"node_modules/asar\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/asar/-/asar-3.2.0.tgz\",\n      \"integrity\": \"sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg==\",\n      \"deprecated\": \"Please use @electron/asar moving forward.  There is no API change, just a package name change\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"chromium-pickle-js\": \"^0.2.0\",\n        \"commander\": \"^5.0.0\",\n        \"glob\": \"^7.1.6\",\n        \"minimatch\": \"^3.0.4\"\n      },\n      \"bin\": {\n        \"asar\": \"bin/asar.js\"\n      },\n      \"engines\": {\n        \"node\": \">=10.12.0\"\n      },\n      \"optionalDependencies\": {\n        \"@types/glob\": \"^7.1.1\"\n      }\n    },\n    \"node_modules/asar/node_modules/commander\": {\n      \"version\": \"5.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-5.1.0.tgz\",\n      \"integrity\": \"sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/asar/node_modules/glob\": {\n      \"version\": \"7.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-7.2.3.tgz\",\n      \"integrity\": \"sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"fs.realpath\": \"^1.0.0\",\n        \"inflight\": \"^1.0.4\",\n        \"inherits\": \"2\",\n        \"minimatch\": \"^3.1.1\",\n        \"once\": \"^1.3.0\",\n        \"path-is-absolute\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/assertion-error\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz\",\n      \"integrity\": \"sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/ast-types\": {\n      \"version\": \"0.13.4\",\n      \"resolved\": \"https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz\",\n      \"integrity\": \"sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"tslib\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/async\": {\n      \"version\": \"1.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/async/-/async-1.5.2.tgz\",\n      \"integrity\": \"sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/async-exit-hook\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz\",\n      \"integrity\": \"sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.12.0\"\n      }\n    },\n    \"node_modules/asynckit\": {\n      \"version\": \"0.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz\",\n      \"integrity\": \"sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/at-least-node\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz\",\n      \"integrity\": \"sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 4.0.0\"\n      }\n    },\n    \"node_modules/author-regex\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz\",\n      \"integrity\": \"sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.8\"\n      }\n    },\n    \"node_modules/available-typed-arrays\": {\n      \"version\": \"1.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz\",\n      \"integrity\": \"sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"possible-typed-array-names\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/aws4\": {\n      \"version\": \"1.12.0\",\n      \"resolved\": \"https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz\",\n      \"integrity\": \"sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==\"\n    },\n    \"node_modules/aws4-axios\": {\n      \"version\": \"3.3.4\",\n      \"resolved\": \"https://registry.npmjs.org/aws4-axios/-/aws4-axios-3.3.4.tgz\",\n      \"integrity\": \"sha512-pcyliHZ1G6DqWvP1ITHX/LH+yc2vDzx6epB+/XDPA1oBZeIFyh71MlwjHcGemHRxcVq8pW5tzNln4S6GgZ1BFw==\",\n      \"workspaces\": [\n        \"infra\"\n      ],\n      \"dependencies\": {\n        \"@aws-sdk/client-sts\": \"^3.4.1\",\n        \"aws4\": \"^1.12.0\"\n      },\n      \"engines\": {\n        \"node\": \">=16\"\n      },\n      \"peerDependencies\": {\n        \"axios\": \">=1.6.0\"\n      }\n    },\n    \"node_modules/axios\": {\n      \"version\": \"1.11.0\",\n      \"resolved\": \"https://registry.npmjs.org/axios/-/axios-1.11.0.tgz\",\n      \"integrity\": \"sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"follow-redirects\": \"^1.15.6\",\n        \"form-data\": \"^4.0.4\",\n        \"proxy-from-env\": \"^1.1.0\"\n      }\n    },\n    \"node_modules/axios-http2-adapter\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/axios-http2-adapter/-/axios-http2-adapter-1.0.3.tgz\",\n      \"integrity\": \"sha512-KKVrRqTOrVNmmw924KZMD0k+jxJOgypzJxHSe9eX6szpgiBfo51/3uHvBLh3LsXvxfzvhc7o6jL6xRhKkEP2AQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"follow-redirects\": \"~1.15\",\n        \"http2-wrapper\": \"~2.2\"\n      },\n      \"peerDependencies\": {\n        \"axios\": \"^1.9\"\n      }\n    },\n    \"node_modules/b4a\": {\n      \"version\": \"1.6.6\",\n      \"resolved\": \"https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz\",\n      \"integrity\": \"sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==\",\n      \"dev\": true\n    },\n    \"node_modules/babel-code-frame\": {\n      \"version\": \"6.26.0\",\n      \"resolved\": \"https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz\",\n      \"integrity\": \"sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==\",\n      \"dependencies\": {\n        \"chalk\": \"^1.1.3\",\n        \"esutils\": \"^2.0.2\",\n        \"js-tokens\": \"^3.0.2\"\n      }\n    },\n    \"node_modules/babel-code-frame/node_modules/ansi-regex\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz\",\n      \"integrity\": \"sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/babel-code-frame/node_modules/ansi-styles\": {\n      \"version\": \"2.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz\",\n      \"integrity\": \"sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/babel-code-frame/node_modules/chalk\": {\n      \"version\": \"1.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz\",\n      \"integrity\": \"sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^2.2.1\",\n        \"escape-string-regexp\": \"^1.0.2\",\n        \"has-ansi\": \"^2.0.0\",\n        \"strip-ansi\": \"^3.0.0\",\n        \"supports-color\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/babel-code-frame/node_modules/escape-string-regexp\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz\",\n      \"integrity\": \"sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==\",\n      \"engines\": {\n        \"node\": \">=0.8.0\"\n      }\n    },\n    \"node_modules/babel-code-frame/node_modules/js-tokens\": {\n      \"version\": \"3.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz\",\n      \"integrity\": \"sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==\"\n    },\n    \"node_modules/babel-code-frame/node_modules/strip-ansi\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz\",\n      \"integrity\": \"sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/babel-code-frame/node_modules/supports-color\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz\",\n      \"integrity\": \"sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==\",\n      \"engines\": {\n        \"node\": \">=0.8.0\"\n      }\n    },\n    \"node_modules/babel-plugin-polyfill-corejs2\": {\n      \"version\": \"0.4.11\",\n      \"resolved\": \"https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz\",\n      \"integrity\": \"sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/compat-data\": \"^7.22.6\",\n        \"@babel/helper-define-polyfill-provider\": \"^0.6.2\",\n        \"semver\": \"^6.3.1\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.4.0 || ^8.0.0-0 <8.0.0\"\n      }\n    },\n    \"node_modules/babel-plugin-polyfill-corejs2/node_modules/semver\": {\n      \"version\": \"6.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n      \"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n      \"dev\": true,\n      \"bin\": {\n        \"semver\": \"bin/semver.js\"\n      }\n    },\n    \"node_modules/babel-plugin-polyfill-corejs3\": {\n      \"version\": \"0.10.4\",\n      \"resolved\": \"https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz\",\n      \"integrity\": \"sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-define-polyfill-provider\": \"^0.6.1\",\n        \"core-js-compat\": \"^3.36.1\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.4.0 || ^8.0.0-0 <8.0.0\"\n      }\n    },\n    \"node_modules/babel-plugin-polyfill-regenerator\": {\n      \"version\": \"0.6.2\",\n      \"resolved\": \"https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz\",\n      \"integrity\": \"sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-define-polyfill-provider\": \"^0.6.2\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.4.0 || ^8.0.0-0 <8.0.0\"\n      }\n    },\n    \"node_modules/babel-plugin-styled-components\": {\n      \"version\": \"2.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz\",\n      \"integrity\": \"sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==\",\n      \"dependencies\": {\n        \"@babel/helper-annotate-as-pure\": \"^7.22.5\",\n        \"@babel/helper-module-imports\": \"^7.22.5\",\n        \"@babel/plugin-syntax-jsx\": \"^7.22.5\",\n        \"lodash\": \"^4.17.21\",\n        \"picomatch\": \"^2.3.1\"\n      },\n      \"peerDependencies\": {\n        \"styled-components\": \">= 2\"\n      }\n    },\n    \"node_modules/bail\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/bail/-/bail-1.0.5.tgz\",\n      \"integrity\": \"sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/balanced-match\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz\",\n      \"integrity\": \"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==\"\n    },\n    \"node_modules/balena-image-fs\": {\n      \"version\": \"7.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/balena-image-fs/-/balena-image-fs-7.2.2.tgz\",\n      \"integrity\": \"sha512-/ZzchTuDmPbuzNc3Ct+JJ5UEbRO19Ebgpo6jMORBz/2E/jVIUgfnwW35c4OxXPiDMYTpOpQMMvBZkoayDRHiXQ==\",\n      \"dependencies\": {\n        \"ext2fs\": \"^4.2.1\",\n        \"fatfs\": \"^0.10.8\",\n        \"file-disk\": \"^8.0.1\",\n        \"partitioninfo\": \"^6.0.3\",\n        \"typed-error\": \"^3.2.1\"\n      },\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/bare-events\": {\n      \"version\": \"2.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/bare-events/-/bare-events-2.2.2.tgz\",\n      \"integrity\": \"sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==\",\n      \"dev\": true,\n      \"optional\": true\n    },\n    \"node_modules/bare-fs\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.0.tgz\",\n      \"integrity\": \"sha512-TNFqa1B4N99pds2a5NYHR15o0ZpdNKbAeKTE/+G6ED/UeOavv8RY3dr/Fu99HW3zU3pXpo2kDNO8Sjsm2esfOw==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"bare-events\": \"^2.0.0\",\n        \"bare-path\": \"^2.0.0\",\n        \"bare-stream\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/bare-os\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/bare-os/-/bare-os-2.3.0.tgz\",\n      \"integrity\": \"sha512-oPb8oMM1xZbhRQBngTgpcQ5gXw6kjOaRsSWsIeNyRxGed2w/ARyP7ScBYpWR1qfX2E5rS3gBw6OWcSQo+s+kUg==\",\n      \"dev\": true,\n      \"optional\": true\n    },\n    \"node_modules/bare-path\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/bare-path/-/bare-path-2.1.2.tgz\",\n      \"integrity\": \"sha512-o7KSt4prEphWUHa3QUwCxUI00R86VdjiuxmJK0iNVDHYPGo+HsDaVCnqCmPbf/MiW1ok8F4p3m8RTHlWk8K2ig==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"bare-os\": \"^2.1.0\"\n      }\n    },\n    \"node_modules/bare-stream\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/bare-stream/-/bare-stream-1.0.0.tgz\",\n      \"integrity\": \"sha512-KhNUoDL40iP4gFaLSsoGE479t0jHijfYdIcxRn/XtezA2BaUD0NRf/JGRpsMq6dMNM+SrCrB0YSSo/5wBY4rOQ==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"streamx\": \"^2.16.1\"\n      }\n    },\n    \"node_modules/base32-encode\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/base32-encode/-/base32-encode-1.2.0.tgz\",\n      \"integrity\": \"sha512-cHFU8XeRyx0GgmoWi5qHMCVRiqU6J3MHWxVgun7jggCBUpVzm1Ir7M9dYr2whjSNc3tFeXfQ/oZjQu/4u55h9A==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"to-data-view\": \"^1.1.0\"\n      }\n    },\n    \"node_modules/base64-js\": {\n      \"version\": \"1.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz\",\n      \"integrity\": \"sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ]\n    },\n    \"node_modules/basic-ftp\": {\n      \"version\": \"5.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz\",\n      \"integrity\": \"sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10.0.0\"\n      }\n    },\n    \"node_modules/batch\": {\n      \"version\": \"0.6.1\",\n      \"resolved\": \"https://registry.npmjs.org/batch/-/batch-0.6.1.tgz\",\n      \"integrity\": \"sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==\",\n      \"dev\": true\n    },\n    \"node_modules/big-integer\": {\n      \"version\": \"1.6.52\",\n      \"resolved\": \"https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz\",\n      \"integrity\": \"sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.6\"\n      }\n    },\n    \"node_modules/big.js\": {\n      \"version\": \"5.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz\",\n      \"integrity\": \"sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/binary\": {\n      \"version\": \"0.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/binary/-/binary-0.3.0.tgz\",\n      \"integrity\": \"sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==\",\n      \"dependencies\": {\n        \"buffers\": \"~0.1.1\",\n        \"chainsaw\": \"~0.1.0\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/binary-extensions\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz\",\n      \"integrity\": \"sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/binary-parser-encoder\": {\n      \"version\": \"1.5.3\",\n      \"resolved\": \"https://registry.npmjs.org/binary-parser-encoder/-/binary-parser-encoder-1.5.3.tgz\",\n      \"integrity\": \"sha512-yu3tdLBYqPIwGRaXyswLoLrhaffkuZkNuXveq/jYoyBHQbFMjamHCWPFOmI2Qz+Go0Rh6wE9f6tt0EAvsgDD0g==\",\n      \"dependencies\": {\n        \"smart-buffer\": \"^4.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8.9.0\"\n      }\n    },\n    \"node_modules/bindings\": {\n      \"version\": \"1.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz\",\n      \"integrity\": \"sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==\",\n      \"dependencies\": {\n        \"file-uri-to-path\": \"1.0.0\"\n      }\n    },\n    \"node_modules/bl\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/bl/-/bl-4.1.0.tgz\",\n      \"integrity\": \"sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==\",\n      \"dependencies\": {\n        \"buffer\": \"^5.5.0\",\n        \"inherits\": \"^2.0.4\",\n        \"readable-stream\": \"^3.4.0\"\n      }\n    },\n    \"node_modules/blockmap\": {\n      \"version\": \"4.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/blockmap/-/blockmap-4.0.3.tgz\",\n      \"integrity\": \"sha512-FNNohgfxiRKSSwxwbxYoT7qS2g6tTLevlQbLUm72Bzd31yAu+++ZJAV7lwN2MOwtiEC20lNqcsprxqdW5KTZug==\",\n      \"dependencies\": {\n        \"debug\": \"^4.1.1\",\n        \"tslib\": \"^2.0.0\",\n        \"xml-js\": \"^1.6.11\"\n      }\n    },\n    \"node_modules/bloodline\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/bloodline/-/bloodline-1.0.1.tgz\",\n      \"integrity\": \"sha512-wfNQZgzQHlE0qz9Qg+qiW3dxiwWMssYiqISXjZfZ//Wn1ReI3ddMcQSEmdeLDgziT2BxDZQHi88XZmhyTxPA4w==\"\n    },\n    \"node_modules/bluebird\": {\n      \"version\": \"3.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz\",\n      \"integrity\": \"sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/body-parser\": {\n      \"version\": \"1.20.2\",\n      \"resolved\": \"https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz\",\n      \"integrity\": \"sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"bytes\": \"3.1.2\",\n        \"content-type\": \"~1.0.5\",\n        \"debug\": \"2.6.9\",\n        \"depd\": \"2.0.0\",\n        \"destroy\": \"1.2.0\",\n        \"http-errors\": \"2.0.0\",\n        \"iconv-lite\": \"0.4.24\",\n        \"on-finished\": \"2.4.1\",\n        \"qs\": \"6.11.0\",\n        \"raw-body\": \"2.5.2\",\n        \"type-is\": \"~1.6.18\",\n        \"unpipe\": \"1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\",\n        \"npm\": \"1.2.8000 || >= 1.4.16\"\n      }\n    },\n    \"node_modules/body-parser/node_modules/debug\": {\n      \"version\": \"2.6.9\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-2.6.9.tgz\",\n      \"integrity\": \"sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ms\": \"2.0.0\"\n      }\n    },\n    \"node_modules/body-parser/node_modules/ms\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz\",\n      \"integrity\": \"sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==\",\n      \"dev\": true\n    },\n    \"node_modules/bonjour-service\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz\",\n      \"integrity\": \"sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"fast-deep-equal\": \"^3.1.3\",\n        \"multicast-dns\": \"^7.2.5\"\n      }\n    },\n    \"node_modules/boolbase\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz\",\n      \"integrity\": \"sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==\",\n      \"dev\": true\n    },\n    \"node_modules/boolean\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz\",\n      \"integrity\": \"sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==\",\n      \"optional\": true\n    },\n    \"node_modules/bowser\": {\n      \"version\": \"2.11.0\",\n      \"resolved\": \"https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz\",\n      \"integrity\": \"sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==\"\n    },\n    \"node_modules/boxen\": {\n      \"version\": \"4.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz\",\n      \"integrity\": \"sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==\",\n      \"dependencies\": {\n        \"ansi-align\": \"^3.0.0\",\n        \"camelcase\": \"^5.3.1\",\n        \"chalk\": \"^3.0.0\",\n        \"cli-boxes\": \"^2.2.0\",\n        \"string-width\": \"^4.1.0\",\n        \"term-size\": \"^2.1.0\",\n        \"type-fest\": \"^0.8.1\",\n        \"widest-line\": \"^3.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/boxen/node_modules/camelcase\": {\n      \"version\": \"5.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz\",\n      \"integrity\": \"sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/boxen/node_modules/chalk\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz\",\n      \"integrity\": \"sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.1.0\",\n        \"supports-color\": \"^7.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/boxen/node_modules/type-fest\": {\n      \"version\": \"0.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz\",\n      \"integrity\": \"sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/bplist-creator\": {\n      \"version\": \"0.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz\",\n      \"integrity\": \"sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"stream-buffers\": \"~2.2.0\"\n      }\n    },\n    \"node_modules/bplist-creator/node_modules/stream-buffers\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz\",\n      \"integrity\": \"sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==\",\n      \"dev\": true,\n      \"license\": \"Unlicense\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">= 0.10.0\"\n      }\n    },\n    \"node_modules/brace-expansion\": {\n      \"version\": \"1.1.11\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz\",\n      \"integrity\": \"sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==\",\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\",\n        \"concat-map\": \"0.0.1\"\n      }\n    },\n    \"node_modules/braces\": {\n      \"version\": \"3.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/braces/-/braces-3.0.2.tgz\",\n      \"integrity\": \"sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"fill-range\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/browser-stdout\": {\n      \"version\": \"1.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz\",\n      \"integrity\": \"sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==\",\n      \"dev\": true\n    },\n    \"node_modules/browserslist\": {\n      \"version\": \"4.23.0\",\n      \"resolved\": \"https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz\",\n      \"integrity\": \"sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==\",\n      \"funding\": [\n        {\n          \"type\": \"opencollective\",\n          \"url\": \"https://opencollective.com/browserslist\"\n        },\n        {\n          \"type\": \"tidelift\",\n          \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n        },\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/ai\"\n        }\n      ],\n      \"dependencies\": {\n        \"caniuse-lite\": \"^1.0.30001587\",\n        \"electron-to-chromium\": \"^1.4.668\",\n        \"node-releases\": \"^2.0.14\",\n        \"update-browserslist-db\": \"^1.0.13\"\n      },\n      \"bin\": {\n        \"browserslist\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \"^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7\"\n      }\n    },\n    \"node_modules/buffer\": {\n      \"version\": \"5.7.1\",\n      \"resolved\": \"https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz\",\n      \"integrity\": \"sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"dependencies\": {\n        \"base64-js\": \"^1.3.1\",\n        \"ieee754\": \"^1.1.13\"\n      }\n    },\n    \"node_modules/buffer-crc32\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz\",\n      \"integrity\": \"sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8.0.0\"\n      }\n    },\n    \"node_modules/buffer-from\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz\",\n      \"integrity\": \"sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==\",\n      \"dev\": true\n    },\n    \"node_modules/buffer-indexof-polyfill\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz\",\n      \"integrity\": \"sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.10\"\n      }\n    },\n    \"node_modules/buffers\": {\n      \"version\": \"0.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz\",\n      \"integrity\": \"sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==\",\n      \"engines\": {\n        \"node\": \">=0.2.0\"\n      }\n    },\n    \"node_modules/bufferutil\": {\n      \"version\": \"4.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz\",\n      \"integrity\": \"sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==\",\n      \"hasInstallScript\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"node-gyp-build\": \"^4.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.14.2\"\n      }\n    },\n    \"node_modules/builder-util-runtime\": {\n      \"version\": \"9.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.3.tgz\",\n      \"integrity\": \"sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw==\",\n      \"dependencies\": {\n        \"debug\": \"^4.3.4\",\n        \"sax\": \"^1.2.4\"\n      },\n      \"engines\": {\n        \"node\": \">=12.0.0\"\n      }\n    },\n    \"node_modules/builtin-modules\": {\n      \"version\": \"3.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz\",\n      \"integrity\": \"sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/builtins\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz\",\n      \"integrity\": \"sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==\"\n    },\n    \"node_modules/bytes\": {\n      \"version\": \"3.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz\",\n      \"integrity\": \"sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/cacache\": {\n      \"version\": \"16.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz\",\n      \"integrity\": \"sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"@npmcli/fs\": \"^2.1.0\",\n        \"@npmcli/move-file\": \"^2.0.0\",\n        \"chownr\": \"^2.0.0\",\n        \"fs-minipass\": \"^2.1.0\",\n        \"glob\": \"^8.0.1\",\n        \"infer-owner\": \"^1.0.4\",\n        \"lru-cache\": \"^7.7.1\",\n        \"minipass\": \"^3.1.6\",\n        \"minipass-collect\": \"^1.0.2\",\n        \"minipass-flush\": \"^1.0.5\",\n        \"minipass-pipeline\": \"^1.2.4\",\n        \"mkdirp\": \"^1.0.4\",\n        \"p-map\": \"^4.0.0\",\n        \"promise-inflight\": \"^1.0.1\",\n        \"rimraf\": \"^3.0.2\",\n        \"ssri\": \"^9.0.0\",\n        \"tar\": \"^6.1.11\",\n        \"unique-filename\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^12.13.0 || ^14.15.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/cacache/node_modules/brace-expansion\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz\",\n      \"integrity\": \"sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/cacache/node_modules/glob\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-8.1.0.tgz\",\n      \"integrity\": \"sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==\",\n      \"deprecated\": \"Glob versions prior to v9 are no longer supported\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"fs.realpath\": \"^1.0.0\",\n        \"inflight\": \"^1.0.4\",\n        \"inherits\": \"2\",\n        \"minimatch\": \"^5.0.1\",\n        \"once\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/cacache/node_modules/lru-cache\": {\n      \"version\": \"7.18.3\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz\",\n      \"integrity\": \"sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/cacache/node_modules/minimatch\": {\n      \"version\": \"5.1.6\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz\",\n      \"integrity\": \"sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/cacache/node_modules/minipass\": {\n      \"version\": \"3.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz\",\n      \"integrity\": \"sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"yallist\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/cacache/node_modules/yallist\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz\",\n      \"integrity\": \"sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==\",\n      \"dev\": true,\n      \"license\": \"ISC\"\n    },\n    \"node_modules/cacheable-lookup\": {\n      \"version\": \"5.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz\",\n      \"integrity\": \"sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==\",\n      \"engines\": {\n        \"node\": \">=10.6.0\"\n      }\n    },\n    \"node_modules/cacheable-request\": {\n      \"version\": \"7.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz\",\n      \"integrity\": \"sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==\",\n      \"dependencies\": {\n        \"clone-response\": \"^1.0.2\",\n        \"get-stream\": \"^5.1.0\",\n        \"http-cache-semantics\": \"^4.0.0\",\n        \"keyv\": \"^4.0.0\",\n        \"lowercase-keys\": \"^2.0.0\",\n        \"normalize-url\": \"^6.0.1\",\n        \"responselike\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/cacheable-request/node_modules/get-stream\": {\n      \"version\": \"5.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz\",\n      \"integrity\": \"sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==\",\n      \"dependencies\": {\n        \"pump\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/call-bind\": {\n      \"version\": \"1.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz\",\n      \"integrity\": \"sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==\",\n      \"dependencies\": {\n        \"es-define-property\": \"^1.0.0\",\n        \"es-errors\": \"^1.3.0\",\n        \"function-bind\": \"^1.1.2\",\n        \"get-intrinsic\": \"^1.2.4\",\n        \"set-function-length\": \"^1.2.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/call-bind-apply-helpers\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz\",\n      \"integrity\": \"sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/call-me-maybe\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz\",\n      \"integrity\": \"sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==\"\n    },\n    \"node_modules/callsite\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz\",\n      \"integrity\": \"sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/callsites\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz\",\n      \"integrity\": \"sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/camel-case\": {\n      \"version\": \"4.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz\",\n      \"integrity\": \"sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"pascal-case\": \"^3.1.2\",\n        \"tslib\": \"^2.0.3\"\n      }\n    },\n    \"node_modules/camelcase\": {\n      \"version\": \"6.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz\",\n      \"integrity\": \"sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/camelize\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz\",\n      \"integrity\": \"sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==\",\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/caniuse-lite\": {\n      \"version\": \"1.0.30001612\",\n      \"resolved\": \"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz\",\n      \"integrity\": \"sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==\",\n      \"funding\": [\n        {\n          \"type\": \"opencollective\",\n          \"url\": \"https://opencollective.com/browserslist\"\n        },\n        {\n          \"type\": \"tidelift\",\n          \"url\": \"https://tidelift.com/funding/github/npm/caniuse-lite\"\n        },\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/ai\"\n        }\n      ]\n    },\n    \"node_modules/capture-stack-trace\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz\",\n      \"integrity\": \"sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/catch-uncommitted\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/catch-uncommitted/-/catch-uncommitted-2.0.0.tgz\",\n      \"integrity\": \"sha512-AUYUPe6TVZFpTUp6fAR0Wz4NjKMx532ZWpuIbKMkNr7Ec7Co7TJAUgeV4aqRnsMLi2nmNpDNUD5iH9ir/28c5A==\",\n      \"dev\": true,\n      \"bin\": {\n        \"catch-uncommitted\": \"catch-uncommitted.js\"\n      },\n      \"engines\": {\n        \"node\": \">=10.0.0\"\n      }\n    },\n    \"node_modules/ccount\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz\",\n      \"integrity\": \"sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/chai\": {\n      \"version\": \"4.3.10\",\n      \"resolved\": \"https://registry.npmjs.org/chai/-/chai-4.3.10.tgz\",\n      \"integrity\": \"sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"assertion-error\": \"^1.1.0\",\n        \"check-error\": \"^1.0.3\",\n        \"deep-eql\": \"^4.1.3\",\n        \"get-func-name\": \"^2.0.2\",\n        \"loupe\": \"^2.3.6\",\n        \"pathval\": \"^1.1.1\",\n        \"type-detect\": \"^4.0.8\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/chainsaw\": {\n      \"version\": \"0.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz\",\n      \"integrity\": \"sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==\",\n      \"dependencies\": {\n        \"traverse\": \">=0.3.0 <0.4\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/chalk\": {\n      \"version\": \"4.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz\",\n      \"integrity\": \"sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.1.0\",\n        \"supports-color\": \"^7.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/chalk?sponsor=1\"\n      }\n    },\n    \"node_modules/character-entities\": {\n      \"version\": \"1.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz\",\n      \"integrity\": \"sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/character-entities-legacy\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz\",\n      \"integrity\": \"sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/character-reference-invalid\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz\",\n      \"integrity\": \"sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/chardet\": {\n      \"version\": \"0.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz\",\n      \"integrity\": \"sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==\"\n    },\n    \"node_modules/check-disk-space\": {\n      \"version\": \"3.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/check-disk-space/-/check-disk-space-3.4.0.tgz\",\n      \"integrity\": \"sha512-drVkSqfwA+TvuEhFipiR1OC9boEGZL5RrWvVsOthdcvQNXyCCuKkEiTOTXZ7qxSf/GLwq4GvzfrQD/Wz325hgw==\",\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/check-error\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz\",\n      \"integrity\": \"sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"get-func-name\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/chokidar\": {\n      \"version\": \"3.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz\",\n      \"integrity\": \"sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"anymatch\": \"~3.1.2\",\n        \"braces\": \"~3.0.2\",\n        \"glob-parent\": \"~5.1.2\",\n        \"is-binary-path\": \"~2.1.0\",\n        \"is-glob\": \"~4.0.1\",\n        \"normalize-path\": \"~3.0.0\",\n        \"readdirp\": \"~3.6.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 8.10.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      },\n      \"optionalDependencies\": {\n        \"fsevents\": \"~2.3.2\"\n      }\n    },\n    \"node_modules/chownr\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz\",\n      \"integrity\": \"sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/chrome-trace-event\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz\",\n      \"integrity\": \"sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6.0\"\n      }\n    },\n    \"node_modules/chromium-bidi\": {\n      \"version\": \"0.4.16\",\n      \"resolved\": \"https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz\",\n      \"integrity\": \"sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"mitt\": \"3.0.0\"\n      },\n      \"peerDependencies\": {\n        \"devtools-protocol\": \"*\"\n      }\n    },\n    \"node_modules/chromium-pickle-js\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz\",\n      \"integrity\": \"sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==\",\n      \"dev\": true,\n      \"optional\": true\n    },\n    \"node_modules/chs\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/chs/-/chs-1.1.0.tgz\",\n      \"integrity\": \"sha512-XPNir/V/SuHCyqz8+PRyq8OkNacS1RCSVBC+uEcFFZ5V4ZVtgQtpkEHx0kJYwiicaSFaIdka3HrVoYL7NHVR/w==\"\n    },\n    \"node_modules/ci-info\": {\n      \"version\": \"3.9.0\",\n      \"resolved\": \"https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz\",\n      \"integrity\": \"sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/sibiraj-s\"\n        }\n      ],\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/clean-css\": {\n      \"version\": \"5.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz\",\n      \"integrity\": \"sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"source-map\": \"~0.6.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.0\"\n      }\n    },\n    \"node_modules/clean-stack\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz\",\n      \"integrity\": \"sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/cli-boxes\": {\n      \"version\": \"2.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz\",\n      \"integrity\": \"sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/cli-cursor\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz\",\n      \"integrity\": \"sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==\",\n      \"dependencies\": {\n        \"restore-cursor\": \"^3.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/cli-spinners\": {\n      \"version\": \"2.9.2\",\n      \"resolved\": \"https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz\",\n      \"integrity\": \"sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/cli-truncate\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz\",\n      \"integrity\": \"sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"slice-ansi\": \"^5.0.0\",\n        \"string-width\": \"^5.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/cli-truncate/node_modules/emoji-regex\": {\n      \"version\": \"9.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz\",\n      \"integrity\": \"sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==\",\n      \"dev\": true\n    },\n    \"node_modules/cli-truncate/node_modules/string-width\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz\",\n      \"integrity\": \"sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"eastasianwidth\": \"^0.2.0\",\n        \"emoji-regex\": \"^9.2.2\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/cli-width\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz\",\n      \"integrity\": \"sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 12\"\n      }\n    },\n    \"node_modules/cliui\": {\n      \"version\": \"8.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz\",\n      \"integrity\": \"sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"string-width\": \"^4.2.0\",\n        \"strip-ansi\": \"^6.0.1\",\n        \"wrap-ansi\": \"^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/cliui/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/cliui/node_modules/wrap-ansi\": {\n      \"version\": \"7.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n      \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.0.0\",\n        \"string-width\": \"^4.1.0\",\n        \"strip-ansi\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/clone\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/clone/-/clone-1.0.4.tgz\",\n      \"integrity\": \"sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.8\"\n      }\n    },\n    \"node_modules/clone-deep\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz\",\n      \"integrity\": \"sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"is-plain-object\": \"^2.0.4\",\n        \"kind-of\": \"^6.0.2\",\n        \"shallow-clone\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/clone-response\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz\",\n      \"integrity\": \"sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==\",\n      \"dependencies\": {\n        \"mimic-response\": \"^1.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/codemirror\": {\n      \"version\": \"5.65.16\",\n      \"resolved\": \"https://registry.npmjs.org/codemirror/-/codemirror-5.65.16.tgz\",\n      \"integrity\": \"sha512-br21LjYmSlVL0vFCPWPfhzUCT34FM/pAdK7rRIZwa0rrtrIdotvP4Oh4GUHsu2E3IrQMCfRkL/fN3ytMNxVQvg==\"\n    },\n    \"node_modules/codemirror-spell-checker\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/codemirror-spell-checker/-/codemirror-spell-checker-1.1.2.tgz\",\n      \"integrity\": \"sha512-2Tl6n0v+GJRsC9K3MLCdLaMOmvWL0uukajNJseorZJsslaxZyZMgENocPU8R0DyoTAiKsyqiemSOZo7kjGV0LQ==\",\n      \"dependencies\": {\n        \"typo-js\": \"*\"\n      }\n    },\n    \"node_modules/collapse-white-space\": {\n      \"version\": \"1.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz\",\n      \"integrity\": \"sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/color\": {\n      \"version\": \"3.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/color/-/color-3.2.1.tgz\",\n      \"integrity\": \"sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==\",\n      \"dependencies\": {\n        \"color-convert\": \"^1.9.3\",\n        \"color-string\": \"^1.6.0\"\n      }\n    },\n    \"node_modules/color-convert\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n      \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n      \"dependencies\": {\n        \"color-name\": \"~1.1.4\"\n      },\n      \"engines\": {\n        \"node\": \">=7.0.0\"\n      }\n    },\n    \"node_modules/color-hash\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/color-hash/-/color-hash-1.1.1.tgz\",\n      \"integrity\": \"sha512-OOZ2pKPuon1H7/77G0+xzSRDgITsik/kYzfJxmCBEI4ozM6UFhZ1aaZ6OhASbDwolHUq5PTRnhDle9FR72tqbw==\"\n    },\n    \"node_modules/color-name\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n      \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\"\n    },\n    \"node_modules/color-string\": {\n      \"version\": \"1.9.1\",\n      \"resolved\": \"https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz\",\n      \"integrity\": \"sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==\",\n      \"dependencies\": {\n        \"color-name\": \"^1.0.0\",\n        \"simple-swizzle\": \"^0.2.2\"\n      }\n    },\n    \"node_modules/color/node_modules/color-convert\": {\n      \"version\": \"1.9.3\",\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz\",\n      \"integrity\": \"sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==\",\n      \"dependencies\": {\n        \"color-name\": \"1.1.3\"\n      }\n    },\n    \"node_modules/color/node_modules/color-name\": {\n      \"version\": \"1.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz\",\n      \"integrity\": \"sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==\"\n    },\n    \"node_modules/colorette\": {\n      \"version\": \"2.0.20\",\n      \"resolved\": \"https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz\",\n      \"integrity\": \"sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==\",\n      \"dev\": true\n    },\n    \"node_modules/combined-stream\": {\n      \"version\": \"1.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz\",\n      \"integrity\": \"sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==\",\n      \"dependencies\": {\n        \"delayed-stream\": \"~1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/comma-separated-tokens\": {\n      \"version\": \"1.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz\",\n      \"integrity\": \"sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/commander\": {\n      \"version\": \"11.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-11.1.0.tgz\",\n      \"integrity\": \"sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/comment-json\": {\n      \"version\": \"2.4.2\",\n      \"resolved\": \"https://registry.npmjs.org/comment-json/-/comment-json-2.4.2.tgz\",\n      \"integrity\": \"sha512-T+iXox779qsqneMYx/x5BZyz4xjCeQRmuNVzz8tko7qZUs3MlzpA3RAs+O1XsgcKToNBMIvfVzafGOeiU7RggA==\",\n      \"dependencies\": {\n        \"core-util-is\": \"^1.0.2\",\n        \"esprima\": \"^4.0.1\",\n        \"has-own-prop\": \"^2.0.0\",\n        \"repeat-string\": \"^1.6.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/comment-parser\": {\n      \"version\": \"1.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz\",\n      \"integrity\": \"sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 12.0.0\"\n      }\n    },\n    \"node_modules/compare-version\": {\n      \"version\": \"0.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz\",\n      \"integrity\": \"sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/compare-versions\": {\n      \"version\": \"6.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz\",\n      \"integrity\": \"sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==\",\n      \"dev\": true\n    },\n    \"node_modules/compress-commons\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz\",\n      \"integrity\": \"sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"crc-32\": \"^1.2.0\",\n        \"crc32-stream\": \"^6.0.0\",\n        \"is-stream\": \"^2.0.1\",\n        \"normalize-path\": \"^3.0.0\",\n        \"readable-stream\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/compress-commons/node_modules/buffer\": {\n      \"version\": \"6.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz\",\n      \"integrity\": \"sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"dependencies\": {\n        \"base64-js\": \"^1.3.1\",\n        \"ieee754\": \"^1.2.1\"\n      }\n    },\n    \"node_modules/compress-commons/node_modules/crc32-stream\": {\n      \"version\": \"6.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz\",\n      \"integrity\": \"sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"crc-32\": \"^1.2.0\",\n        \"readable-stream\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/compress-commons/node_modules/is-stream\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz\",\n      \"integrity\": \"sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/compress-commons/node_modules/readable-stream\": {\n      \"version\": \"4.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz\",\n      \"integrity\": \"sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"abort-controller\": \"^3.0.0\",\n        \"buffer\": \"^6.0.3\",\n        \"events\": \"^3.3.0\",\n        \"process\": \"^0.11.10\",\n        \"string_decoder\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/compressible\": {\n      \"version\": \"2.0.18\",\n      \"resolved\": \"https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz\",\n      \"integrity\": \"sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"mime-db\": \">= 1.43.0 < 2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/compression\": {\n      \"version\": \"1.7.4\",\n      \"resolved\": \"https://registry.npmjs.org/compression/-/compression-1.7.4.tgz\",\n      \"integrity\": \"sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"accepts\": \"~1.3.5\",\n        \"bytes\": \"3.0.0\",\n        \"compressible\": \"~2.0.16\",\n        \"debug\": \"2.6.9\",\n        \"on-headers\": \"~1.0.2\",\n        \"safe-buffer\": \"5.1.2\",\n        \"vary\": \"~1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/compression/node_modules/bytes\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz\",\n      \"integrity\": \"sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/compression/node_modules/debug\": {\n      \"version\": \"2.6.9\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-2.6.9.tgz\",\n      \"integrity\": \"sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ms\": \"2.0.0\"\n      }\n    },\n    \"node_modules/compression/node_modules/ms\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz\",\n      \"integrity\": \"sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==\",\n      \"dev\": true\n    },\n    \"node_modules/compression/node_modules/safe-buffer\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz\",\n      \"integrity\": \"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==\",\n      \"dev\": true\n    },\n    \"node_modules/compute-gcd\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz\",\n      \"integrity\": \"sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==\",\n      \"dependencies\": {\n        \"validate.io-array\": \"^1.0.3\",\n        \"validate.io-function\": \"^1.0.2\",\n        \"validate.io-integer-array\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/compute-lcm\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz\",\n      \"integrity\": \"sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==\",\n      \"dependencies\": {\n        \"compute-gcd\": \"^1.2.1\",\n        \"validate.io-array\": \"^1.0.3\",\n        \"validate.io-function\": \"^1.0.2\",\n        \"validate.io-integer-array\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/concat-map\": {\n      \"version\": \"0.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz\",\n      \"integrity\": \"sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==\"\n    },\n    \"node_modules/configstore\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz\",\n      \"integrity\": \"sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==\",\n      \"dependencies\": {\n        \"dot-prop\": \"^5.2.0\",\n        \"graceful-fs\": \"^4.1.2\",\n        \"make-dir\": \"^3.0.0\",\n        \"unique-string\": \"^2.0.0\",\n        \"write-file-atomic\": \"^3.0.0\",\n        \"xdg-basedir\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/connect-history-api-fallback\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz\",\n      \"integrity\": \"sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.8\"\n      }\n    },\n    \"node_modules/content-disposition\": {\n      \"version\": \"0.5.4\",\n      \"resolved\": \"https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz\",\n      \"integrity\": \"sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"safe-buffer\": \"5.2.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/content-type\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz\",\n      \"integrity\": \"sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/convert-source-map\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz\",\n      \"integrity\": \"sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==\"\n    },\n    \"node_modules/cookie\": {\n      \"version\": \"0.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz\",\n      \"integrity\": \"sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/cookie-signature\": {\n      \"version\": \"1.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz\",\n      \"integrity\": \"sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==\",\n      \"dev\": true\n    },\n    \"node_modules/copy-to-clipboard\": {\n      \"version\": \"3.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz\",\n      \"integrity\": \"sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==\",\n      \"dependencies\": {\n        \"toggle-selection\": \"^1.0.6\"\n      }\n    },\n    \"node_modules/core-js\": {\n      \"version\": \"2.6.12\",\n      \"resolved\": \"https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz\",\n      \"integrity\": \"sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==\",\n      \"deprecated\": \"core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.\",\n      \"hasInstallScript\": true\n    },\n    \"node_modules/core-js-compat\": {\n      \"version\": \"3.37.0\",\n      \"resolved\": \"https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz\",\n      \"integrity\": \"sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"browserslist\": \"^4.23.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/core-js\"\n      }\n    },\n    \"node_modules/core-util-is\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz\",\n      \"integrity\": \"sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==\"\n    },\n    \"node_modules/cosmiconfig\": {\n      \"version\": \"8.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz\",\n      \"integrity\": \"sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"import-fresh\": \"^3.3.0\",\n        \"js-yaml\": \"^4.1.0\",\n        \"parse-json\": \"^5.2.0\",\n        \"path-type\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/d-fischer\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=4.9.5\"\n      },\n      \"peerDependenciesMeta\": {\n        \"typescript\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/crc-32\": {\n      \"version\": \"1.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz\",\n      \"integrity\": \"sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==\",\n      \"bin\": {\n        \"crc32\": \"bin/crc32.njs\"\n      },\n      \"engines\": {\n        \"node\": \">=0.8\"\n      }\n    },\n    \"node_modules/crc32-stream\": {\n      \"version\": \"4.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz\",\n      \"integrity\": \"sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==\",\n      \"dependencies\": {\n        \"crc-32\": \"^1.2.0\",\n        \"readable-stream\": \"^3.4.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/create-error-class\": {\n      \"version\": \"3.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz\",\n      \"integrity\": \"sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==\",\n      \"dependencies\": {\n        \"capture-stack-trace\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/create-require\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz\",\n      \"integrity\": \"sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==\",\n      \"dev\": true\n    },\n    \"node_modules/cross-dirname\": {\n      \"version\": \"0.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz\",\n      \"integrity\": \"sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==\",\n      \"dev\": true\n    },\n    \"node_modules/cross-fetch\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz\",\n      \"integrity\": \"sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"node-fetch\": \"^2.6.12\"\n      }\n    },\n    \"node_modules/cross-spawn\": {\n      \"version\": \"7.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz\",\n      \"integrity\": \"sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==\",\n      \"dependencies\": {\n        \"path-key\": \"^3.1.0\",\n        \"shebang-command\": \"^2.0.0\",\n        \"which\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/cross-zip\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/cross-zip/-/cross-zip-4.0.1.tgz\",\n      \"integrity\": \"sha512-n63i0lZ0rvQ6FXiGQ+/JFCKAUyPFhLQYJIqKaa+tSJtfKeULF/IDNDAbdnSIxgS4NTuw2b0+lj8LzfITuq+ZxQ==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"engines\": {\n        \"node\": \">=12.10\"\n      }\n    },\n    \"node_modules/crypto-random-string\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz\",\n      \"integrity\": \"sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/css-color-keywords\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz\",\n      \"integrity\": \"sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/css-loader\": {\n      \"version\": \"5.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz\",\n      \"integrity\": \"sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"icss-utils\": \"^5.1.0\",\n        \"loader-utils\": \"^2.0.0\",\n        \"postcss\": \"^8.2.15\",\n        \"postcss-modules-extract-imports\": \"^3.0.0\",\n        \"postcss-modules-local-by-default\": \"^4.0.0\",\n        \"postcss-modules-scope\": \"^3.0.0\",\n        \"postcss-modules-values\": \"^4.0.0\",\n        \"postcss-value-parser\": \"^4.1.0\",\n        \"schema-utils\": \"^3.0.0\",\n        \"semver\": \"^7.3.5\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.13.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/webpack\"\n      },\n      \"peerDependencies\": {\n        \"webpack\": \"^4.27.0 || ^5.0.0\"\n      }\n    },\n    \"node_modules/css-select\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz\",\n      \"integrity\": \"sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"boolbase\": \"^1.0.0\",\n        \"css-what\": \"^6.0.1\",\n        \"domhandler\": \"^4.3.1\",\n        \"domutils\": \"^2.8.0\",\n        \"nth-check\": \"^2.0.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/fb55\"\n      }\n    },\n    \"node_modules/css-shorthand-properties\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz\",\n      \"integrity\": \"sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==\",\n      \"dev\": true\n    },\n    \"node_modules/css-to-react-native\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz\",\n      \"integrity\": \"sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==\",\n      \"dependencies\": {\n        \"camelize\": \"^1.0.0\",\n        \"css-color-keywords\": \"^1.0.0\",\n        \"postcss-value-parser\": \"^4.0.2\"\n      }\n    },\n    \"node_modules/css-tree\": {\n      \"version\": \"2.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz\",\n      \"integrity\": \"sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"mdn-data\": \"2.0.30\",\n        \"source-map-js\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \"^10 || ^12.20.0 || ^14.13.0 || >=15.0.0\"\n      }\n    },\n    \"node_modules/css-value\": {\n      \"version\": \"0.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz\",\n      \"integrity\": \"sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==\",\n      \"dev\": true\n    },\n    \"node_modules/css-what\": {\n      \"version\": \"6.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz\",\n      \"integrity\": \"sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/fb55\"\n      }\n    },\n    \"node_modules/cssesc\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz\",\n      \"integrity\": \"sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==\",\n      \"dev\": true,\n      \"bin\": {\n        \"cssesc\": \"bin/cssesc\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/csso\": {\n      \"version\": \"5.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/csso/-/csso-5.0.5.tgz\",\n      \"integrity\": \"sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"css-tree\": \"~2.2.0\"\n      },\n      \"engines\": {\n        \"node\": \"^10 || ^12.20.0 || ^14.13.0 || >=15.0.0\",\n        \"npm\": \">=7.0.0\"\n      }\n    },\n    \"node_modules/csso/node_modules/css-tree\": {\n      \"version\": \"2.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz\",\n      \"integrity\": \"sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"mdn-data\": \"2.0.28\",\n        \"source-map-js\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \"^10 || ^12.20.0 || ^14.13.0 || >=15.0.0\",\n        \"npm\": \">=7.0.0\"\n      }\n    },\n    \"node_modules/csso/node_modules/mdn-data\": {\n      \"version\": \"2.0.28\",\n      \"resolved\": \"https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz\",\n      \"integrity\": \"sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==\",\n      \"dev\": true\n    },\n    \"node_modules/csstype\": {\n      \"version\": \"3.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz\",\n      \"integrity\": \"sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==\"\n    },\n    \"node_modules/cyclic-32\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/cyclic-32/-/cyclic-32-1.2.0.tgz\",\n      \"integrity\": \"sha512-lHmTMKGQtbsdFy+S1byzblPY0R2WNhkI8/NIKWvYD0UjYPXRxgJ8S8JqhEnrkj/X98CwgGcWz7muecM5xfQziw==\",\n      \"bin\": {\n        \"crc32\": \"bin/crc32.js\"\n      }\n    },\n    \"node_modules/d\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/d/-/d-1.0.2.tgz\",\n      \"integrity\": \"sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==\",\n      \"dependencies\": {\n        \"es5-ext\": \"^0.10.64\",\n        \"type\": \"^2.7.2\"\n      },\n      \"engines\": {\n        \"node\": \">=0.12\"\n      }\n    },\n    \"node_modules/d3\": {\n      \"version\": \"7.9.0\",\n      \"resolved\": \"https://registry.npmjs.org/d3/-/d3-7.9.0.tgz\",\n      \"integrity\": \"sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==\",\n      \"dependencies\": {\n        \"d3-array\": \"3\",\n        \"d3-axis\": \"3\",\n        \"d3-brush\": \"3\",\n        \"d3-chord\": \"3\",\n        \"d3-color\": \"3\",\n        \"d3-contour\": \"4\",\n        \"d3-delaunay\": \"6\",\n        \"d3-dispatch\": \"3\",\n        \"d3-drag\": \"3\",\n        \"d3-dsv\": \"3\",\n        \"d3-ease\": \"3\",\n        \"d3-fetch\": \"3\",\n        \"d3-force\": \"3\",\n        \"d3-format\": \"3\",\n        \"d3-geo\": \"3\",\n        \"d3-hierarchy\": \"3\",\n        \"d3-interpolate\": \"3\",\n        \"d3-path\": \"3\",\n        \"d3-polygon\": \"3\",\n        \"d3-quadtree\": \"3\",\n        \"d3-random\": \"3\",\n        \"d3-scale\": \"4\",\n        \"d3-scale-chromatic\": \"3\",\n        \"d3-selection\": \"3\",\n        \"d3-shape\": \"3\",\n        \"d3-time\": \"3\",\n        \"d3-time-format\": \"4\",\n        \"d3-timer\": \"3\",\n        \"d3-transition\": \"3\",\n        \"d3-zoom\": \"3\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-array\": {\n      \"version\": \"3.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz\",\n      \"integrity\": \"sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==\",\n      \"dependencies\": {\n        \"internmap\": \"1 - 2\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-axis\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz\",\n      \"integrity\": \"sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==\",\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-brush\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz\",\n      \"integrity\": \"sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==\",\n      \"dependencies\": {\n        \"d3-dispatch\": \"1 - 3\",\n        \"d3-drag\": \"2 - 3\",\n        \"d3-interpolate\": \"1 - 3\",\n        \"d3-selection\": \"3\",\n        \"d3-transition\": \"3\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-chord\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz\",\n      \"integrity\": \"sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==\",\n      \"dependencies\": {\n        \"d3-path\": \"1 - 3\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-collection\": {\n      \"version\": \"1.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz\",\n      \"integrity\": \"sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==\"\n    },\n    \"node_modules/d3-color\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz\",\n      \"integrity\": \"sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==\",\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-contour\": {\n      \"version\": \"4.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz\",\n      \"integrity\": \"sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==\",\n      \"dependencies\": {\n        \"d3-array\": \"^3.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-delaunay\": {\n      \"version\": \"6.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz\",\n      \"integrity\": \"sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==\",\n      \"dependencies\": {\n        \"delaunator\": \"5\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-dispatch\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz\",\n      \"integrity\": \"sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==\",\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-drag\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz\",\n      \"integrity\": \"sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==\",\n      \"dependencies\": {\n        \"d3-dispatch\": \"1 - 3\",\n        \"d3-selection\": \"3\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-dsv\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz\",\n      \"integrity\": \"sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==\",\n      \"dependencies\": {\n        \"commander\": \"7\",\n        \"iconv-lite\": \"0.6\",\n        \"rw\": \"1\"\n      },\n      \"bin\": {\n        \"csv2json\": \"bin/dsv2json.js\",\n        \"csv2tsv\": \"bin/dsv2dsv.js\",\n        \"dsv2dsv\": \"bin/dsv2dsv.js\",\n        \"dsv2json\": \"bin/dsv2json.js\",\n        \"json2csv\": \"bin/json2dsv.js\",\n        \"json2dsv\": \"bin/json2dsv.js\",\n        \"json2tsv\": \"bin/json2dsv.js\",\n        \"tsv2csv\": \"bin/dsv2dsv.js\",\n        \"tsv2json\": \"bin/dsv2json.js\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-dsv/node_modules/commander\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-7.2.0.tgz\",\n      \"integrity\": \"sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==\",\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/d3-dsv/node_modules/iconv-lite\": {\n      \"version\": \"0.6.3\",\n      \"resolved\": \"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz\",\n      \"integrity\": \"sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==\",\n      \"dependencies\": {\n        \"safer-buffer\": \">= 2.1.2 < 3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/d3-ease\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz\",\n      \"integrity\": \"sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==\",\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-fetch\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz\",\n      \"integrity\": \"sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==\",\n      \"dependencies\": {\n        \"d3-dsv\": \"1 - 3\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-force\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz\",\n      \"integrity\": \"sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==\",\n      \"dependencies\": {\n        \"d3-dispatch\": \"1 - 3\",\n        \"d3-quadtree\": \"1 - 3\",\n        \"d3-timer\": \"1 - 3\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-format\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz\",\n      \"integrity\": \"sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==\",\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-geo\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz\",\n      \"integrity\": \"sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==\",\n      \"dependencies\": {\n        \"d3-array\": \"2.5.0 - 3\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-hierarchy\": {\n      \"version\": \"3.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz\",\n      \"integrity\": \"sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==\",\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-interpolate\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz\",\n      \"integrity\": \"sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==\",\n      \"dependencies\": {\n        \"d3-color\": \"1 - 3\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-path\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz\",\n      \"integrity\": \"sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==\",\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-polygon\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz\",\n      \"integrity\": \"sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==\",\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-quadtree\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz\",\n      \"integrity\": \"sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==\",\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-random\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz\",\n      \"integrity\": \"sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==\",\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-scale\": {\n      \"version\": \"4.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz\",\n      \"integrity\": \"sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==\",\n      \"dependencies\": {\n        \"d3-array\": \"2.10.0 - 3\",\n        \"d3-format\": \"1 - 3\",\n        \"d3-interpolate\": \"1.2.0 - 3\",\n        \"d3-time\": \"2.1.1 - 3\",\n        \"d3-time-format\": \"2 - 4\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-scale-chromatic\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz\",\n      \"integrity\": \"sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==\",\n      \"dependencies\": {\n        \"d3-color\": \"1 - 3\",\n        \"d3-interpolate\": \"1 - 3\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-selection\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz\",\n      \"integrity\": \"sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==\",\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-shape\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz\",\n      \"integrity\": \"sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==\",\n      \"dependencies\": {\n        \"d3-path\": \"^3.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-time\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz\",\n      \"integrity\": \"sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==\",\n      \"dependencies\": {\n        \"d3-array\": \"2 - 3\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-time-format\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz\",\n      \"integrity\": \"sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==\",\n      \"dependencies\": {\n        \"d3-time\": \"1 - 3\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-timer\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz\",\n      \"integrity\": \"sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==\",\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/d3-transition\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz\",\n      \"integrity\": \"sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==\",\n      \"dependencies\": {\n        \"d3-color\": \"1 - 3\",\n        \"d3-dispatch\": \"1 - 3\",\n        \"d3-ease\": \"1 - 3\",\n        \"d3-interpolate\": \"1 - 3\",\n        \"d3-timer\": \"1 - 3\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"peerDependencies\": {\n        \"d3-selection\": \"2 - 3\"\n      }\n    },\n    \"node_modules/d3-voronoi\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz\",\n      \"integrity\": \"sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==\"\n    },\n    \"node_modules/d3-zoom\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz\",\n      \"integrity\": \"sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==\",\n      \"dependencies\": {\n        \"d3-dispatch\": \"1 - 3\",\n        \"d3-drag\": \"2 - 3\",\n        \"d3-interpolate\": \"1 - 3\",\n        \"d3-selection\": \"2 - 3\",\n        \"d3-transition\": \"2 - 3\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/dagre\": {\n      \"version\": \"0.8.5\",\n      \"resolved\": \"https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz\",\n      \"integrity\": \"sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==\",\n      \"dependencies\": {\n        \"graphlib\": \"^2.1.8\",\n        \"lodash\": \"^4.17.15\"\n      }\n    },\n    \"node_modules/dagre-d3\": {\n      \"version\": \"0.6.4\",\n      \"resolved\": \"https://registry.npmjs.org/dagre-d3/-/dagre-d3-0.6.4.tgz\",\n      \"integrity\": \"sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==\",\n      \"dependencies\": {\n        \"d3\": \"^5.14\",\n        \"dagre\": \"^0.8.5\",\n        \"graphlib\": \"^2.1.8\",\n        \"lodash\": \"^4.17.15\"\n      }\n    },\n    \"node_modules/dagre-d3/node_modules/commander\": {\n      \"version\": \"2.20.3\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-2.20.3.tgz\",\n      \"integrity\": \"sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==\"\n    },\n    \"node_modules/dagre-d3/node_modules/d3\": {\n      \"version\": \"5.16.0\",\n      \"resolved\": \"https://registry.npmjs.org/d3/-/d3-5.16.0.tgz\",\n      \"integrity\": \"sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==\",\n      \"dependencies\": {\n        \"d3-array\": \"1\",\n        \"d3-axis\": \"1\",\n        \"d3-brush\": \"1\",\n        \"d3-chord\": \"1\",\n        \"d3-collection\": \"1\",\n        \"d3-color\": \"1\",\n        \"d3-contour\": \"1\",\n        \"d3-dispatch\": \"1\",\n        \"d3-drag\": \"1\",\n        \"d3-dsv\": \"1\",\n        \"d3-ease\": \"1\",\n        \"d3-fetch\": \"1\",\n        \"d3-force\": \"1\",\n        \"d3-format\": \"1\",\n        \"d3-geo\": \"1\",\n        \"d3-hierarchy\": \"1\",\n        \"d3-interpolate\": \"1\",\n        \"d3-path\": \"1\",\n        \"d3-polygon\": \"1\",\n        \"d3-quadtree\": \"1\",\n        \"d3-random\": \"1\",\n        \"d3-scale\": \"2\",\n        \"d3-scale-chromatic\": \"1\",\n        \"d3-selection\": \"1\",\n        \"d3-shape\": \"1\",\n        \"d3-time\": \"1\",\n        \"d3-time-format\": \"2\",\n        \"d3-timer\": \"1\",\n        \"d3-transition\": \"1\",\n        \"d3-voronoi\": \"1\",\n        \"d3-zoom\": \"1\"\n      }\n    },\n    \"node_modules/dagre-d3/node_modules/d3-array\": {\n      \"version\": \"1.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz\",\n      \"integrity\": \"sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==\"\n    },\n    \"node_modules/dagre-d3/node_modules/d3-axis\": {\n      \"version\": \"1.0.12\",\n      \"resolved\": \"https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz\",\n      \"integrity\": \"sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==\"\n    },\n    \"node_modules/dagre-d3/node_modules/d3-brush\": {\n      \"version\": \"1.1.6\",\n      \"resolved\": \"https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz\",\n      \"integrity\": \"sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==\",\n      \"dependencies\": {\n        \"d3-dispatch\": \"1\",\n        \"d3-drag\": \"1\",\n        \"d3-interpolate\": \"1\",\n        \"d3-selection\": \"1\",\n        \"d3-transition\": \"1\"\n      }\n    },\n    \"node_modules/dagre-d3/node_modules/d3-chord\": {\n      \"version\": \"1.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz\",\n      \"integrity\": \"sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==\",\n      \"dependencies\": {\n        \"d3-array\": \"1\",\n        \"d3-path\": \"1\"\n      }\n    },\n    \"node_modules/dagre-d3/node_modules/d3-color\": {\n      \"version\": \"1.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz\",\n      \"integrity\": \"sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==\"\n    },\n    \"node_modules/dagre-d3/node_modules/d3-contour\": {\n      \"version\": \"1.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz\",\n      \"integrity\": \"sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==\",\n      \"dependencies\": {\n        \"d3-array\": \"^1.1.1\"\n      }\n    },\n    \"node_modules/dagre-d3/node_modules/d3-dispatch\": {\n      \"version\": \"1.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz\",\n      \"integrity\": \"sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==\"\n    },\n    \"node_modules/dagre-d3/node_modules/d3-drag\": {\n      \"version\": \"1.2.5\",\n      \"resolved\": \"https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz\",\n      \"integrity\": \"sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==\",\n      \"dependencies\": {\n        \"d3-dispatch\": \"1\",\n        \"d3-selection\": \"1\"\n      }\n    },\n    \"node_modules/dagre-d3/node_modules/d3-dsv\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz\",\n      \"integrity\": \"sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==\",\n      \"dependencies\": {\n        \"commander\": \"2\",\n        \"iconv-lite\": \"0.4\",\n        \"rw\": \"1\"\n      },\n      \"bin\": {\n        \"csv2json\": \"bin/dsv2json\",\n        \"csv2tsv\": \"bin/dsv2dsv\",\n        \"dsv2dsv\": \"bin/dsv2dsv\",\n        \"dsv2json\": \"bin/dsv2json\",\n        \"json2csv\": \"bin/json2dsv\",\n        \"json2dsv\": \"bin/json2dsv\",\n        \"json2tsv\": \"bin/json2dsv\",\n        \"tsv2csv\": \"bin/dsv2dsv\",\n        \"tsv2json\": \"bin/dsv2json\"\n      }\n    },\n    \"node_modules/dagre-d3/node_modules/d3-ease\": {\n      \"version\": \"1.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz\",\n      \"integrity\": \"sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==\"\n    },\n    \"node_modules/dagre-d3/node_modules/d3-fetch\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz\",\n      \"integrity\": \"sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==\",\n      \"dependencies\": {\n        \"d3-dsv\": \"1\"\n      }\n    },\n    \"node_modules/dagre-d3/node_modules/d3-force\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz\",\n      \"integrity\": \"sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==\",\n      \"dependencies\": {\n        \"d3-collection\": \"1\",\n        \"d3-dispatch\": \"1\",\n        \"d3-quadtree\": \"1\",\n        \"d3-timer\": \"1\"\n      }\n    },\n    \"node_modules/dagre-d3/node_modules/d3-format\": {\n      \"version\": \"1.4.5\",\n      \"resolved\": \"https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz\",\n      \"integrity\": \"sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==\"\n    },\n    \"node_modules/dagre-d3/node_modules/d3-geo\": {\n      \"version\": \"1.12.1\",\n      \"resolved\": \"https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz\",\n      \"integrity\": \"sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==\",\n      \"dependencies\": {\n        \"d3-array\": \"1\"\n      }\n    },\n    \"node_modules/dagre-d3/node_modules/d3-hierarchy\": {\n      \"version\": \"1.1.9\",\n      \"resolved\": \"https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz\",\n      \"integrity\": \"sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==\"\n    },\n    \"node_modules/dagre-d3/node_modules/d3-interpolate\": {\n      \"version\": \"1.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz\",\n      \"integrity\": \"sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==\",\n      \"dependencies\": {\n        \"d3-color\": \"1\"\n      }\n    },\n    \"node_modules/dagre-d3/node_modules/d3-path\": {\n      \"version\": \"1.0.9\",\n      \"resolved\": \"https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz\",\n      \"integrity\": \"sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==\"\n    },\n    \"node_modules/dagre-d3/node_modules/d3-polygon\": {\n      \"version\": \"1.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz\",\n      \"integrity\": \"sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==\"\n    },\n    \"node_modules/dagre-d3/node_modules/d3-quadtree\": {\n      \"version\": \"1.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz\",\n      \"integrity\": \"sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==\"\n    },\n    \"node_modules/dagre-d3/node_modules/d3-random\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz\",\n      \"integrity\": \"sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==\"\n    },\n    \"node_modules/dagre-d3/node_modules/d3-scale\": {\n      \"version\": \"2.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz\",\n      \"integrity\": \"sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==\",\n      \"dependencies\": {\n        \"d3-array\": \"^1.2.0\",\n        \"d3-collection\": \"1\",\n        \"d3-format\": \"1\",\n        \"d3-interpolate\": \"1\",\n        \"d3-time\": \"1\",\n        \"d3-time-format\": \"2\"\n      }\n    },\n    \"node_modules/dagre-d3/node_modules/d3-scale-chromatic\": {\n      \"version\": \"1.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz\",\n      \"integrity\": \"sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==\",\n      \"dependencies\": {\n        \"d3-color\": \"1\",\n        \"d3-interpolate\": \"1\"\n      }\n    },\n    \"node_modules/dagre-d3/node_modules/d3-selection\": {\n      \"version\": \"1.4.2\",\n      \"resolved\": \"https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz\",\n      \"integrity\": \"sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==\"\n    },\n    \"node_modules/dagre-d3/node_modules/d3-shape\": {\n      \"version\": \"1.3.7\",\n      \"resolved\": \"https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz\",\n      \"integrity\": \"sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==\",\n      \"dependencies\": {\n        \"d3-path\": \"1\"\n      }\n    },\n    \"node_modules/dagre-d3/node_modules/d3-time\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz\",\n      \"integrity\": \"sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==\"\n    },\n    \"node_modules/dagre-d3/node_modules/d3-time-format\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz\",\n      \"integrity\": \"sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==\",\n      \"dependencies\": {\n        \"d3-time\": \"1\"\n      }\n    },\n    \"node_modules/dagre-d3/node_modules/d3-timer\": {\n      \"version\": \"1.0.10\",\n      \"resolved\": \"https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz\",\n      \"integrity\": \"sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==\"\n    },\n    \"node_modules/dagre-d3/node_modules/d3-transition\": {\n      \"version\": \"1.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz\",\n      \"integrity\": \"sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==\",\n      \"dependencies\": {\n        \"d3-color\": \"1\",\n        \"d3-dispatch\": \"1\",\n        \"d3-ease\": \"1\",\n        \"d3-interpolate\": \"1\",\n        \"d3-selection\": \"^1.1.0\",\n        \"d3-timer\": \"1\"\n      }\n    },\n    \"node_modules/dagre-d3/node_modules/d3-zoom\": {\n      \"version\": \"1.8.3\",\n      \"resolved\": \"https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz\",\n      \"integrity\": \"sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==\",\n      \"dependencies\": {\n        \"d3-dispatch\": \"1\",\n        \"d3-drag\": \"1\",\n        \"d3-interpolate\": \"1\",\n        \"d3-selection\": \"1\",\n        \"d3-transition\": \"1\"\n      }\n    },\n    \"node_modules/data-uri-to-buffer\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz\",\n      \"integrity\": \"sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/data-view-buffer\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz\",\n      \"integrity\": \"sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.6\",\n        \"es-errors\": \"^1.3.0\",\n        \"is-data-view\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/data-view-byte-length\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz\",\n      \"integrity\": \"sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.7\",\n        \"es-errors\": \"^1.3.0\",\n        \"is-data-view\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/data-view-byte-offset\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz\",\n      \"integrity\": \"sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.6\",\n        \"es-errors\": \"^1.3.0\",\n        \"is-data-view\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/date-fns\": {\n      \"version\": \"3.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz\",\n      \"integrity\": \"sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/kossnocorp\"\n      }\n    },\n    \"node_modules/debug\": {\n      \"version\": \"4.3.4\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.3.4.tgz\",\n      \"integrity\": \"sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==\",\n      \"dependencies\": {\n        \"ms\": \"2.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"supports-color\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/decamelize\": {\n      \"version\": \"6.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz\",\n      \"integrity\": \"sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/decompress-response\": {\n      \"version\": \"6.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz\",\n      \"integrity\": \"sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==\",\n      \"dependencies\": {\n        \"mimic-response\": \"^3.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/decompress-response/node_modules/mimic-response\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz\",\n      \"integrity\": \"sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==\",\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/deep-copy\": {\n      \"version\": \"1.4.2\",\n      \"resolved\": \"https://registry.npmjs.org/deep-copy/-/deep-copy-1.4.2.tgz\",\n      \"integrity\": \"sha512-VxZwQ/1+WGQPl5nE67uLhh7OqdrmqI1OazrraO9Bbw/M8Bt6Mol/RxzDA6N6ZgRXpsG/W9PgUj8E1LHHBEq2GQ==\",\n      \"engines\": {\n        \"node\": \">=4.0.0\"\n      }\n    },\n    \"node_modules/deep-eql\": {\n      \"version\": \"4.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz\",\n      \"integrity\": \"sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"type-detect\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/deep-extend\": {\n      \"version\": \"0.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz\",\n      \"integrity\": \"sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==\",\n      \"engines\": {\n        \"node\": \">=4.0.0\"\n      }\n    },\n    \"node_modules/deep-is\": {\n      \"version\": \"0.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz\",\n      \"integrity\": \"sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==\",\n      \"dev\": true\n    },\n    \"node_modules/deepmerge\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz\",\n      \"integrity\": \"sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/deepmerge-ts\": {\n      \"version\": \"5.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-5.1.0.tgz\",\n      \"integrity\": \"sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=16.0.0\"\n      }\n    },\n    \"node_modules/default-gateway\": {\n      \"version\": \"6.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz\",\n      \"integrity\": \"sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"execa\": \"^5.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/default-gateway/node_modules/execa\": {\n      \"version\": \"5.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/execa/-/execa-5.1.1.tgz\",\n      \"integrity\": \"sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"cross-spawn\": \"^7.0.3\",\n        \"get-stream\": \"^6.0.0\",\n        \"human-signals\": \"^2.1.0\",\n        \"is-stream\": \"^2.0.0\",\n        \"merge-stream\": \"^2.0.0\",\n        \"npm-run-path\": \"^4.0.1\",\n        \"onetime\": \"^5.1.2\",\n        \"signal-exit\": \"^3.0.3\",\n        \"strip-final-newline\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sindresorhus/execa?sponsor=1\"\n      }\n    },\n    \"node_modules/default-gateway/node_modules/get-stream\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz\",\n      \"integrity\": \"sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/default-gateway/node_modules/human-signals\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz\",\n      \"integrity\": \"sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10.17.0\"\n      }\n    },\n    \"node_modules/default-gateway/node_modules/is-stream\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz\",\n      \"integrity\": \"sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/default-gateway/node_modules/mimic-fn\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz\",\n      \"integrity\": \"sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/default-gateway/node_modules/npm-run-path\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz\",\n      \"integrity\": \"sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"path-key\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/default-gateway/node_modules/onetime\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz\",\n      \"integrity\": \"sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"mimic-fn\": \"^2.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/default-gateway/node_modules/signal-exit\": {\n      \"version\": \"3.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz\",\n      \"integrity\": \"sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==\",\n      \"dev\": true\n    },\n    \"node_modules/default-gateway/node_modules/strip-final-newline\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz\",\n      \"integrity\": \"sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/defaults\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz\",\n      \"integrity\": \"sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"clone\": \"^1.0.2\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/defer-to-connect\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz\",\n      \"integrity\": \"sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==\",\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/define-data-property\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz\",\n      \"integrity\": \"sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==\",\n      \"dependencies\": {\n        \"es-define-property\": \"^1.0.0\",\n        \"es-errors\": \"^1.3.0\",\n        \"gopd\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/define-lazy-prop\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz\",\n      \"integrity\": \"sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/define-properties\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz\",\n      \"integrity\": \"sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==\",\n      \"devOptional\": true,\n      \"dependencies\": {\n        \"define-data-property\": \"^1.0.1\",\n        \"has-property-descriptors\": \"^1.0.0\",\n        \"object-keys\": \"^1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/degenerator\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz\",\n      \"integrity\": \"sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ast-types\": \"^0.13.4\",\n        \"escodegen\": \"^2.1.0\",\n        \"esprima\": \"^4.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/delaunator\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz\",\n      \"integrity\": \"sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==\",\n      \"dependencies\": {\n        \"robust-predicates\": \"^3.0.2\"\n      }\n    },\n    \"node_modules/delayed-stream\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz\",\n      \"integrity\": \"sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==\",\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/depcheck\": {\n      \"version\": \"1.4.7\",\n      \"resolved\": \"https://registry.npmjs.org/depcheck/-/depcheck-1.4.7.tgz\",\n      \"integrity\": \"sha512-1lklS/bV5chOxwNKA/2XUUk/hPORp8zihZsXflr8x0kLwmcZ9Y9BsS6Hs3ssvA+2wUVbG0U2Ciqvm1SokNjPkA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/parser\": \"^7.23.0\",\n        \"@babel/traverse\": \"^7.23.2\",\n        \"@vue/compiler-sfc\": \"^3.3.4\",\n        \"callsite\": \"^1.0.0\",\n        \"camelcase\": \"^6.3.0\",\n        \"cosmiconfig\": \"^7.1.0\",\n        \"debug\": \"^4.3.4\",\n        \"deps-regex\": \"^0.2.0\",\n        \"findup-sync\": \"^5.0.0\",\n        \"ignore\": \"^5.2.4\",\n        \"is-core-module\": \"^2.12.0\",\n        \"js-yaml\": \"^3.14.1\",\n        \"json5\": \"^2.2.3\",\n        \"lodash\": \"^4.17.21\",\n        \"minimatch\": \"^7.4.6\",\n        \"multimatch\": \"^5.0.0\",\n        \"please-upgrade-node\": \"^3.2.0\",\n        \"readdirp\": \"^3.6.0\",\n        \"require-package-name\": \"^2.0.1\",\n        \"resolve\": \"^1.22.3\",\n        \"resolve-from\": \"^5.0.0\",\n        \"semver\": \"^7.5.4\",\n        \"yargs\": \"^16.2.0\"\n      },\n      \"bin\": {\n        \"depcheck\": \"bin/depcheck.js\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/depcheck/node_modules/argparse\": {\n      \"version\": \"1.0.10\",\n      \"resolved\": \"https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz\",\n      \"integrity\": \"sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"sprintf-js\": \"~1.0.2\"\n      }\n    },\n    \"node_modules/depcheck/node_modules/brace-expansion\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz\",\n      \"integrity\": \"sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/depcheck/node_modules/cliui\": {\n      \"version\": \"7.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz\",\n      \"integrity\": \"sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"string-width\": \"^4.2.0\",\n        \"strip-ansi\": \"^6.0.0\",\n        \"wrap-ansi\": \"^7.0.0\"\n      }\n    },\n    \"node_modules/depcheck/node_modules/cosmiconfig\": {\n      \"version\": \"7.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz\",\n      \"integrity\": \"sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/parse-json\": \"^4.0.0\",\n        \"import-fresh\": \"^3.2.1\",\n        \"parse-json\": \"^5.0.0\",\n        \"path-type\": \"^4.0.0\",\n        \"yaml\": \"^1.10.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/depcheck/node_modules/is-core-module\": {\n      \"version\": \"2.13.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz\",\n      \"integrity\": \"sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"hasown\": \"^2.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/depcheck/node_modules/js-yaml\": {\n      \"version\": \"3.14.1\",\n      \"resolved\": \"https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz\",\n      \"integrity\": \"sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"argparse\": \"^1.0.7\",\n        \"esprima\": \"^4.0.0\"\n      },\n      \"bin\": {\n        \"js-yaml\": \"bin/js-yaml.js\"\n      }\n    },\n    \"node_modules/depcheck/node_modules/minimatch\": {\n      \"version\": \"7.4.6\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz\",\n      \"integrity\": \"sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/depcheck/node_modules/sprintf-js\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz\",\n      \"integrity\": \"sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==\",\n      \"dev\": true\n    },\n    \"node_modules/depcheck/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/depcheck/node_modules/wrap-ansi\": {\n      \"version\": \"7.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n      \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.0.0\",\n        \"string-width\": \"^4.1.0\",\n        \"strip-ansi\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/depcheck/node_modules/y18n\": {\n      \"version\": \"5.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz\",\n      \"integrity\": \"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/depcheck/node_modules/yaml\": {\n      \"version\": \"1.10.2\",\n      \"resolved\": \"https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz\",\n      \"integrity\": \"sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/depcheck/node_modules/yargs\": {\n      \"version\": \"16.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz\",\n      \"integrity\": \"sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"cliui\": \"^7.0.2\",\n        \"escalade\": \"^3.1.1\",\n        \"get-caller-file\": \"^2.0.5\",\n        \"require-directory\": \"^2.1.1\",\n        \"string-width\": \"^4.2.0\",\n        \"y18n\": \"^5.0.5\",\n        \"yargs-parser\": \"^20.2.2\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/depcheck/node_modules/yargs-parser\": {\n      \"version\": \"20.2.9\",\n      \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz\",\n      \"integrity\": \"sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/depd\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/depd/-/depd-2.0.0.tgz\",\n      \"integrity\": \"sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/deps-regex\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/deps-regex/-/deps-regex-0.2.0.tgz\",\n      \"integrity\": \"sha512-PwuBojGMQAYbWkMXOY9Pd/NWCDNHVH12pnS7WHqZkTSeMESe4hwnKKRp0yR87g37113x4JPbo/oIvXY+s/f56Q==\",\n      \"dev\": true\n    },\n    \"node_modules/dequal\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz\",\n      \"integrity\": \"sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/destroy\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz\",\n      \"integrity\": \"sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.8\",\n        \"npm\": \"1.2.8000 || >= 1.4.16\"\n      }\n    },\n    \"node_modules/detect-file\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz\",\n      \"integrity\": \"sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/detect-indent\": {\n      \"version\": \"6.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz\",\n      \"integrity\": \"sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/detect-libc\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz\",\n      \"integrity\": \"sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/detect-node\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz\",\n      \"integrity\": \"sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==\",\n      \"devOptional\": true\n    },\n    \"node_modules/devtools-protocol\": {\n      \"version\": \"0.0.1282316\",\n      \"resolved\": \"https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1282316.tgz\",\n      \"integrity\": \"sha512-i7eIqWdVxeXBY/M+v83yRkOV1sTHnr3XYiC0YNBivLIE6hBfE2H0c2o8VC5ynT44yjy+Ei0kLrBQFK/RUKaAHQ==\",\n      \"dev\": true\n    },\n    \"node_modules/diff\": {\n      \"version\": \"5.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/diff/-/diff-5.2.0.tgz\",\n      \"integrity\": \"sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.3.1\"\n      }\n    },\n    \"node_modules/diff-sequences\": {\n      \"version\": \"29.6.3\",\n      \"resolved\": \"https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz\",\n      \"integrity\": \"sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/dir-compare\": {\n      \"version\": \"4.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz\",\n      \"integrity\": \"sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"minimatch\": \"^3.0.5\",\n        \"p-limit\": \"^3.1.0 \"\n      }\n    },\n    \"node_modules/dir-glob\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz\",\n      \"integrity\": \"sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"path-type\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/dns-packet\": {\n      \"version\": \"5.6.1\",\n      \"resolved\": \"https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz\",\n      \"integrity\": \"sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@leichtgewicht/ip-codec\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/doctrine\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz\",\n      \"integrity\": \"sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"esutils\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/dom-converter\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz\",\n      \"integrity\": \"sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"utila\": \"~0.4\"\n      }\n    },\n    \"node_modules/dom-serializer\": {\n      \"version\": \"1.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz\",\n      \"integrity\": \"sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"domelementtype\": \"^2.0.1\",\n        \"domhandler\": \"^4.2.0\",\n        \"entities\": \"^2.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/cheeriojs/dom-serializer?sponsor=1\"\n      }\n    },\n    \"node_modules/dom-serializer/node_modules/entities\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-2.2.0.tgz\",\n      \"integrity\": \"sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==\",\n      \"dev\": true,\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/domelementtype\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz\",\n      \"integrity\": \"sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/fb55\"\n        }\n      ]\n    },\n    \"node_modules/domhandler\": {\n      \"version\": \"4.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz\",\n      \"integrity\": \"sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"domelementtype\": \"^2.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/domhandler?sponsor=1\"\n      }\n    },\n    \"node_modules/dompurify\": {\n      \"version\": \"2.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/dompurify/-/dompurify-2.4.0.tgz\",\n      \"integrity\": \"sha512-Be9tbQMZds4a3C6xTmz68NlMfeONA//4dOavl/1rNw50E+/QO0KVpbcU0PcaW0nsQxurXls9ZocqFxk8R2mWEA==\"\n    },\n    \"node_modules/domutils\": {\n      \"version\": \"2.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz\",\n      \"integrity\": \"sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"dom-serializer\": \"^1.0.1\",\n        \"domelementtype\": \"^2.2.0\",\n        \"domhandler\": \"^4.2.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/domutils?sponsor=1\"\n      }\n    },\n    \"node_modules/dot-case\": {\n      \"version\": \"3.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz\",\n      \"integrity\": \"sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"no-case\": \"^3.0.4\",\n        \"tslib\": \"^2.0.3\"\n      }\n    },\n    \"node_modules/dot-prop\": {\n      \"version\": \"5.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz\",\n      \"integrity\": \"sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==\",\n      \"dependencies\": {\n        \"is-obj\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/dotenv\": {\n      \"version\": \"16.4.5\",\n      \"resolved\": \"https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz\",\n      \"integrity\": \"sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://dotenvx.com\"\n      }\n    },\n    \"node_modules/drivelist\": {\n      \"version\": \"12.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/drivelist/-/drivelist-12.0.2.tgz\",\n      \"integrity\": \"sha512-Nps4pc1ukIqDj7v00wGgBkS7P3VVEZZKcaTPVcE1Yl+dLojXuEv76BuSg6HgmhjeOFIIMz8q7Y+2tux6gYqCvg==\",\n      \"hasInstallScript\": true,\n      \"dependencies\": {\n        \"bindings\": \"^1.5.0\",\n        \"debug\": \"^4.3.4\",\n        \"node-addon-api\": \"^8.0.0\",\n        \"prebuild-install\": \"^7.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/ds-store\": {\n      \"version\": \"0.1.6\",\n      \"resolved\": \"https://registry.npmjs.org/ds-store/-/ds-store-0.1.6.tgz\",\n      \"integrity\": \"sha512-kY21M6Lz+76OS3bnCzjdsJSF7LBpLYGCVfavW8TgQD2XkcqIZ86W0y9qUDZu6fp7SIZzqosMDW2zi7zVFfv4hw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"bplist-creator\": \"~0.0.3\",\n        \"macos-alias\": \"~0.2.5\",\n        \"tn1150\": \"^0.1.0\"\n      }\n    },\n    \"node_modules/dunder-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"gopd\": \"^1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/duplexer2\": {\n      \"version\": \"0.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz\",\n      \"integrity\": \"sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"readable-stream\": \"^2.0.2\"\n      }\n    },\n    \"node_modules/duplexer2/node_modules/isarray\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz\",\n      \"integrity\": \"sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==\",\n      \"dev\": true\n    },\n    \"node_modules/duplexer2/node_modules/readable-stream\": {\n      \"version\": \"2.3.8\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz\",\n      \"integrity\": \"sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"core-util-is\": \"~1.0.0\",\n        \"inherits\": \"~2.0.3\",\n        \"isarray\": \"~1.0.0\",\n        \"process-nextick-args\": \"~2.0.0\",\n        \"safe-buffer\": \"~5.1.1\",\n        \"string_decoder\": \"~1.1.1\",\n        \"util-deprecate\": \"~1.0.1\"\n      }\n    },\n    \"node_modules/duplexer2/node_modules/safe-buffer\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz\",\n      \"integrity\": \"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==\",\n      \"dev\": true\n    },\n    \"node_modules/duplexer2/node_modules/string_decoder\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz\",\n      \"integrity\": \"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"safe-buffer\": \"~5.1.0\"\n      }\n    },\n    \"node_modules/duplexer3\": {\n      \"version\": \"0.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz\",\n      \"integrity\": \"sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==\"\n    },\n    \"node_modules/eastasianwidth\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz\",\n      \"integrity\": \"sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==\"\n    },\n    \"node_modules/easy-table\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/easy-table/-/easy-table-1.2.0.tgz\",\n      \"integrity\": \"sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"optionalDependencies\": {\n        \"wcwidth\": \"^1.0.1\"\n      }\n    },\n    \"node_modules/easymde\": {\n      \"version\": \"2.18.0\",\n      \"resolved\": \"https://registry.npmjs.org/easymde/-/easymde-2.18.0.tgz\",\n      \"integrity\": \"sha512-IxVVUxNWIoXLeqtBU4BLc+eS/ScYhT1Dcb6yF5Wchoj1iXAV+TIIDWx+NCaZhY7RcSHqDPKllbYq7nwGKILnoA==\",\n      \"dependencies\": {\n        \"@types/codemirror\": \"^5.60.4\",\n        \"@types/marked\": \"^4.0.7\",\n        \"codemirror\": \"^5.63.1\",\n        \"codemirror-spell-checker\": \"1.1.2\",\n        \"marked\": \"^4.1.0\"\n      }\n    },\n    \"node_modules/easymde/node_modules/@types/codemirror\": {\n      \"version\": \"5.60.15\",\n      \"resolved\": \"https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.15.tgz\",\n      \"integrity\": \"sha512-dTOvwEQ+ouKJ/rE9LT1Ue2hmP6H1mZv5+CCnNWu2qtiOe2LQa9lCprEY20HxiDmV/Bxh+dXjywmy5aKvoGjULA==\",\n      \"dependencies\": {\n        \"@types/tern\": \"*\"\n      }\n    },\n    \"node_modules/easymde/node_modules/@types/marked\": {\n      \"version\": \"4.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/@types/marked/-/marked-4.3.2.tgz\",\n      \"integrity\": \"sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==\"\n    },\n    \"node_modules/edge-paths\": {\n      \"version\": \"3.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/edge-paths/-/edge-paths-3.0.5.tgz\",\n      \"integrity\": \"sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/which\": \"^2.0.1\",\n        \"which\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/shirshak55\"\n      }\n    },\n    \"node_modules/edgedriver\": {\n      \"version\": \"5.3.10\",\n      \"resolved\": \"https://registry.npmjs.org/edgedriver/-/edgedriver-5.3.10.tgz\",\n      \"integrity\": \"sha512-RFSHYMNtcF1PjaGZCA2rdQQ8hSTLPZgcYgeY1V6dC+tR4NhZXwFAku+8hCbRYh7ZlwKKrTbVu9FwknjFddIuuw==\",\n      \"dev\": true,\n      \"hasInstallScript\": true,\n      \"dependencies\": {\n        \"@wdio/logger\": \"^8.28.0\",\n        \"decamelize\": \"^6.0.0\",\n        \"edge-paths\": \"^3.0.5\",\n        \"node-fetch\": \"^3.3.2\",\n        \"unzipper\": \"^0.10.14\",\n        \"which\": \"^4.0.0\"\n      },\n      \"bin\": {\n        \"edgedriver\": \"bin/edgedriver.js\"\n      }\n    },\n    \"node_modules/edgedriver/node_modules/data-uri-to-buffer\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz\",\n      \"integrity\": \"sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 12\"\n      }\n    },\n    \"node_modules/edgedriver/node_modules/isexe\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz\",\n      \"integrity\": \"sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/edgedriver/node_modules/node-fetch\": {\n      \"version\": \"3.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz\",\n      \"integrity\": \"sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"data-uri-to-buffer\": \"^4.0.0\",\n        \"fetch-blob\": \"^3.1.4\",\n        \"formdata-polyfill\": \"^4.0.10\"\n      },\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/node-fetch\"\n      }\n    },\n    \"node_modules/edgedriver/node_modules/which\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/which/-/which-4.0.0.tgz\",\n      \"integrity\": \"sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"isexe\": \"^3.1.1\"\n      },\n      \"bin\": {\n        \"node-which\": \"bin/which.js\"\n      },\n      \"engines\": {\n        \"node\": \"^16.13.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/editorconfig\": {\n      \"version\": \"0.15.3\",\n      \"resolved\": \"https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz\",\n      \"integrity\": \"sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==\",\n      \"dependencies\": {\n        \"commander\": \"^2.19.0\",\n        \"lru-cache\": \"^4.1.5\",\n        \"semver\": \"^5.6.0\",\n        \"sigmund\": \"^1.0.1\"\n      },\n      \"bin\": {\n        \"editorconfig\": \"bin/editorconfig\"\n      }\n    },\n    \"node_modules/editorconfig/node_modules/commander\": {\n      \"version\": \"2.20.3\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-2.20.3.tgz\",\n      \"integrity\": \"sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==\"\n    },\n    \"node_modules/editorconfig/node_modules/lru-cache\": {\n      \"version\": \"4.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz\",\n      \"integrity\": \"sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==\",\n      \"dependencies\": {\n        \"pseudomap\": \"^1.0.2\",\n        \"yallist\": \"^2.1.2\"\n      }\n    },\n    \"node_modules/editorconfig/node_modules/semver\": {\n      \"version\": \"5.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-5.7.2.tgz\",\n      \"integrity\": \"sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==\",\n      \"bin\": {\n        \"semver\": \"bin/semver\"\n      }\n    },\n    \"node_modules/editorconfig/node_modules/yallist\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz\",\n      \"integrity\": \"sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==\"\n    },\n    \"node_modules/ee-first\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz\",\n      \"integrity\": \"sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==\",\n      \"dev\": true\n    },\n    \"node_modules/ejs\": {\n      \"version\": \"3.1.10\",\n      \"resolved\": \"https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz\",\n      \"integrity\": \"sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"jake\": \"^10.8.5\"\n      },\n      \"bin\": {\n        \"ejs\": \"bin/cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/electron\": {\n      \"version\": \"37.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/electron/-/electron-37.2.4.tgz\",\n      \"integrity\": \"sha512-F1WDDvY60TpFwGyW+evNB5q0Em8PamcDTVIKB2NaiaKEbNC2Fabn8Wyxy5g+Anirr1K40eKGjfSJhWEUbI1TOw==\",\n      \"hasInstallScript\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@electron/get\": \"^2.0.0\",\n        \"@types/node\": \"^22.7.7\",\n        \"extract-zip\": \"^2.0.1\"\n      },\n      \"bin\": {\n        \"electron\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">= 12.20.55\"\n      }\n    },\n    \"node_modules/electron-installer-common\": {\n      \"version\": \"0.10.3\",\n      \"resolved\": \"https://registry.npmjs.org/electron-installer-common/-/electron-installer-common-0.10.3.tgz\",\n      \"integrity\": \"sha512-mYbP+6i+nHMIm0WZHXgGdmmXMe+KXncl6jZYQNcCF9C1WsNA9C5SZ2VP4TLQMSIoFO+X4ugkMEA5uld1bmyEvA==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"@malept/cross-spawn-promise\": \"^1.0.0\",\n        \"asar\": \"^3.0.0\",\n        \"debug\": \"^4.1.1\",\n        \"fs-extra\": \"^9.0.0\",\n        \"glob\": \"^7.1.4\",\n        \"lodash\": \"^4.17.15\",\n        \"parse-author\": \"^2.0.0\",\n        \"semver\": \"^7.1.1\",\n        \"tmp-promise\": \"^3.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/electron-userland/electron-installer-common?sponsor=1\"\n      },\n      \"optionalDependencies\": {\n        \"@types/fs-extra\": \"^9.0.1\"\n      }\n    },\n    \"node_modules/electron-installer-common/node_modules/@malept/cross-spawn-promise\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz\",\n      \"integrity\": \"sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://github.com/sponsors/malept\"\n        },\n        {\n          \"type\": \"tidelift\",\n          \"url\": \"https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund\"\n        }\n      ],\n      \"optional\": true,\n      \"dependencies\": {\n        \"cross-spawn\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/electron-installer-common/node_modules/fs-extra\": {\n      \"version\": \"9.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz\",\n      \"integrity\": \"sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"at-least-node\": \"^1.0.0\",\n        \"graceful-fs\": \"^4.2.0\",\n        \"jsonfile\": \"^6.0.1\",\n        \"universalify\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/electron-installer-common/node_modules/glob\": {\n      \"version\": \"7.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-7.2.3.tgz\",\n      \"integrity\": \"sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"fs.realpath\": \"^1.0.0\",\n        \"inflight\": \"^1.0.4\",\n        \"inherits\": \"2\",\n        \"minimatch\": \"^3.1.1\",\n        \"once\": \"^1.3.0\",\n        \"path-is-absolute\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/electron-installer-debian\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/electron-installer-debian/-/electron-installer-debian-3.2.0.tgz\",\n      \"integrity\": \"sha512-58ZrlJ1HQY80VucsEIG9tQ//HrTlG6sfofA3nRGr6TmkX661uJyu4cMPPh6kXW+aHdq/7+q25KyQhDrXvRL7jw==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\",\n        \"linux\"\n      ],\n      \"dependencies\": {\n        \"@malept/cross-spawn-promise\": \"^1.0.0\",\n        \"debug\": \"^4.1.1\",\n        \"electron-installer-common\": \"^0.10.2\",\n        \"fs-extra\": \"^9.0.0\",\n        \"get-folder-size\": \"^2.0.1\",\n        \"lodash\": \"^4.17.4\",\n        \"word-wrap\": \"^1.2.3\",\n        \"yargs\": \"^16.0.2\"\n      },\n      \"bin\": {\n        \"electron-installer-debian\": \"src/cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.0.0\"\n      }\n    },\n    \"node_modules/electron-installer-debian/node_modules/@malept/cross-spawn-promise\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz\",\n      \"integrity\": \"sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://github.com/sponsors/malept\"\n        },\n        {\n          \"type\": \"tidelift\",\n          \"url\": \"https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund\"\n        }\n      ],\n      \"optional\": true,\n      \"dependencies\": {\n        \"cross-spawn\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/electron-installer-debian/node_modules/cliui\": {\n      \"version\": \"7.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz\",\n      \"integrity\": \"sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"string-width\": \"^4.2.0\",\n        \"strip-ansi\": \"^6.0.0\",\n        \"wrap-ansi\": \"^7.0.0\"\n      }\n    },\n    \"node_modules/electron-installer-debian/node_modules/fs-extra\": {\n      \"version\": \"9.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz\",\n      \"integrity\": \"sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"at-least-node\": \"^1.0.0\",\n        \"graceful-fs\": \"^4.2.0\",\n        \"jsonfile\": \"^6.0.1\",\n        \"universalify\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/electron-installer-debian/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/electron-installer-debian/node_modules/wrap-ansi\": {\n      \"version\": \"7.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n      \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.0.0\",\n        \"string-width\": \"^4.1.0\",\n        \"strip-ansi\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/electron-installer-debian/node_modules/y18n\": {\n      \"version\": \"5.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz\",\n      \"integrity\": \"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/electron-installer-debian/node_modules/yargs\": {\n      \"version\": \"16.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz\",\n      \"integrity\": \"sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"cliui\": \"^7.0.2\",\n        \"escalade\": \"^3.1.1\",\n        \"get-caller-file\": \"^2.0.5\",\n        \"require-directory\": \"^2.1.1\",\n        \"string-width\": \"^4.2.0\",\n        \"y18n\": \"^5.0.5\",\n        \"yargs-parser\": \"^20.2.2\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/electron-installer-debian/node_modules/yargs-parser\": {\n      \"version\": \"20.2.9\",\n      \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz\",\n      \"integrity\": \"sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/electron-installer-dmg\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/electron-installer-dmg/-/electron-installer-dmg-5.0.1.tgz\",\n      \"integrity\": \"sha512-qOa1aAQdX57C+vzhDk3549dd/PRlNL4F8y736MTD1a43qptD+PvHY97Bo9gSf+OZ8iUWE7BrYSpk/FgLUe40EA==\",\n      \"dev\": true,\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"@types/appdmg\": \"^0.5.5\",\n        \"debug\": \"^4.3.2\",\n        \"minimist\": \"^1.2.7\"\n      },\n      \"bin\": {\n        \"electron-installer-dmg\": \"dist/electron-installer-dmg-bin.js\"\n      },\n      \"engines\": {\n        \"node\": \">= 16\"\n      },\n      \"optionalDependencies\": {\n        \"appdmg\": \"^0.6.4\"\n      }\n    },\n    \"node_modules/electron-installer-redhat\": {\n      \"version\": \"3.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/electron-installer-redhat/-/electron-installer-redhat-3.4.0.tgz\",\n      \"integrity\": \"sha512-gEISr3U32Sgtj+fjxUAlSDo3wyGGq6OBx7rF5UdpIgbnpUvMN4W5uYb0ThpnAZ42VEJh/3aODQXHbFS4f5J3Iw==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\",\n        \"linux\"\n      ],\n      \"dependencies\": {\n        \"@malept/cross-spawn-promise\": \"^1.0.0\",\n        \"debug\": \"^4.1.1\",\n        \"electron-installer-common\": \"^0.10.2\",\n        \"fs-extra\": \"^9.0.0\",\n        \"lodash\": \"^4.17.15\",\n        \"word-wrap\": \"^1.2.3\",\n        \"yargs\": \"^16.0.2\"\n      },\n      \"bin\": {\n        \"electron-installer-redhat\": \"src/cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.0.0\"\n      }\n    },\n    \"node_modules/electron-installer-redhat/node_modules/@malept/cross-spawn-promise\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz\",\n      \"integrity\": \"sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://github.com/sponsors/malept\"\n        },\n        {\n          \"type\": \"tidelift\",\n          \"url\": \"https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund\"\n        }\n      ],\n      \"optional\": true,\n      \"dependencies\": {\n        \"cross-spawn\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/electron-installer-redhat/node_modules/cliui\": {\n      \"version\": \"7.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz\",\n      \"integrity\": \"sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"string-width\": \"^4.2.0\",\n        \"strip-ansi\": \"^6.0.0\",\n        \"wrap-ansi\": \"^7.0.0\"\n      }\n    },\n    \"node_modules/electron-installer-redhat/node_modules/fs-extra\": {\n      \"version\": \"9.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz\",\n      \"integrity\": \"sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"at-least-node\": \"^1.0.0\",\n        \"graceful-fs\": \"^4.2.0\",\n        \"jsonfile\": \"^6.0.1\",\n        \"universalify\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/electron-installer-redhat/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/electron-installer-redhat/node_modules/wrap-ansi\": {\n      \"version\": \"7.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n      \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.0.0\",\n        \"string-width\": \"^4.1.0\",\n        \"strip-ansi\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/electron-installer-redhat/node_modules/y18n\": {\n      \"version\": \"5.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz\",\n      \"integrity\": \"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/electron-installer-redhat/node_modules/yargs\": {\n      \"version\": \"16.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz\",\n      \"integrity\": \"sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"cliui\": \"^7.0.2\",\n        \"escalade\": \"^3.1.1\",\n        \"get-caller-file\": \"^2.0.5\",\n        \"require-directory\": \"^2.1.1\",\n        \"string-width\": \"^4.2.0\",\n        \"y18n\": \"^5.0.5\",\n        \"yargs-parser\": \"^20.2.2\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/electron-installer-redhat/node_modules/yargs-parser\": {\n      \"version\": \"20.2.9\",\n      \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz\",\n      \"integrity\": \"sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/electron-squirrel-startup\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/electron-squirrel-startup/-/electron-squirrel-startup-1.0.0.tgz\",\n      \"integrity\": \"sha512-Oce8mvgGdFmwr+DsAcXBmFK8jFfN6yaFAP9IvyhTfupM3nFkBku/7VS/mdtJteWumImkC6P+BKGsxScoDDkv9Q==\",\n      \"dependencies\": {\n        \"debug\": \"^2.2.0\"\n      }\n    },\n    \"node_modules/electron-squirrel-startup/node_modules/debug\": {\n      \"version\": \"2.6.9\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-2.6.9.tgz\",\n      \"integrity\": \"sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==\",\n      \"dependencies\": {\n        \"ms\": \"2.0.0\"\n      }\n    },\n    \"node_modules/electron-squirrel-startup/node_modules/ms\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz\",\n      \"integrity\": \"sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==\"\n    },\n    \"node_modules/electron-to-chromium\": {\n      \"version\": \"1.4.749\",\n      \"resolved\": \"https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.749.tgz\",\n      \"integrity\": \"sha512-LRMMrM9ITOvue0PoBrvNIraVmuDbJV5QC9ierz/z5VilMdPOVMjOtpICNld3PuXuTZ3CHH/UPxX9gHhAPwi+0Q==\"\n    },\n    \"node_modules/electron-updater\": {\n      \"version\": \"6.1.8\",\n      \"resolved\": \"https://registry.npmjs.org/electron-updater/-/electron-updater-6.1.8.tgz\",\n      \"integrity\": \"sha512-hhOTfaFAd6wRHAfUaBhnAOYc+ymSGCWJLtFkw4xJqOvtpHmIdNHnXDV9m1MHC+A6q08Abx4Ykgyz/R5DGKNAMQ==\",\n      \"dependencies\": {\n        \"builder-util-runtime\": \"9.2.3\",\n        \"fs-extra\": \"^10.1.0\",\n        \"js-yaml\": \"^4.1.0\",\n        \"lazy-val\": \"^1.0.5\",\n        \"lodash.escaperegexp\": \"^4.1.2\",\n        \"lodash.isequal\": \"^4.5.0\",\n        \"semver\": \"^7.3.8\",\n        \"tiny-typed-emitter\": \"^2.1.0\"\n      }\n    },\n    \"node_modules/electron-winstaller\": {\n      \"version\": \"5.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.3.1.tgz\",\n      \"integrity\": \"sha512-oM8BW3a8NEqG0XW+Vx3xywhk0DyDV4T0jT0zZfWt0IczNT3jHAAvQWBorF8osQDplSsCyXXyxrsrQ8cY0Slb/A==\",\n      \"dev\": true,\n      \"hasInstallScript\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"@electron/asar\": \"^3.2.1\",\n        \"debug\": \"^4.1.1\",\n        \"fs-extra\": \"^7.0.1\",\n        \"lodash\": \"^4.17.21\",\n        \"temp\": \"^0.9.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8.0.0\"\n      },\n      \"optionalDependencies\": {\n        \"@electron/windows-sign\": \"^1.1.2\"\n      }\n    },\n    \"node_modules/electron-winstaller/node_modules/fs-extra\": {\n      \"version\": \"7.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz\",\n      \"integrity\": \"sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"graceful-fs\": \"^4.1.2\",\n        \"jsonfile\": \"^4.0.0\",\n        \"universalify\": \"^0.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6 <7 || >=8\"\n      }\n    },\n    \"node_modules/electron-winstaller/node_modules/jsonfile\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz\",\n      \"integrity\": \"sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"optionalDependencies\": {\n        \"graceful-fs\": \"^4.1.6\"\n      }\n    },\n    \"node_modules/electron-winstaller/node_modules/universalify\": {\n      \"version\": \"0.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz\",\n      \"integrity\": \"sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">= 4.0.0\"\n      }\n    },\n    \"node_modules/electron/node_modules/@electron/get\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz\",\n      \"integrity\": \"sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==\",\n      \"dependencies\": {\n        \"debug\": \"^4.1.1\",\n        \"env-paths\": \"^2.2.0\",\n        \"fs-extra\": \"^8.1.0\",\n        \"got\": \"^11.8.5\",\n        \"progress\": \"^2.0.3\",\n        \"semver\": \"^6.2.0\",\n        \"sumchecker\": \"^3.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"optionalDependencies\": {\n        \"global-agent\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/electron/node_modules/@types/node\": {\n      \"version\": \"22.16.5\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-22.16.5.tgz\",\n      \"integrity\": \"sha512-bJFoMATwIGaxxx8VJPeM8TonI8t579oRvgAuT8zFugJsJZgzqv0Fu8Mhp68iecjzG7cnN3mO2dJQ5uUM2EFrgQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"undici-types\": \"~6.21.0\"\n      }\n    },\n    \"node_modules/electron/node_modules/fs-extra\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz\",\n      \"integrity\": \"sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==\",\n      \"dependencies\": {\n        \"graceful-fs\": \"^4.2.0\",\n        \"jsonfile\": \"^4.0.0\",\n        \"universalify\": \"^0.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6 <7 || >=8\"\n      }\n    },\n    \"node_modules/electron/node_modules/jsonfile\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz\",\n      \"integrity\": \"sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==\",\n      \"optionalDependencies\": {\n        \"graceful-fs\": \"^4.1.6\"\n      }\n    },\n    \"node_modules/electron/node_modules/semver\": {\n      \"version\": \"6.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n      \"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n      \"bin\": {\n        \"semver\": \"bin/semver.js\"\n      }\n    },\n    \"node_modules/electron/node_modules/undici-types\": {\n      \"version\": \"6.21.0\",\n      \"resolved\": \"https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz\",\n      \"integrity\": \"sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/electron/node_modules/universalify\": {\n      \"version\": \"0.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz\",\n      \"integrity\": \"sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==\",\n      \"engines\": {\n        \"node\": \">= 4.0.0\"\n      }\n    },\n    \"node_modules/emoji-regex\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n      \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\"\n    },\n    \"node_modules/emojis-list\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz\",\n      \"integrity\": \"sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 4\"\n      }\n    },\n    \"node_modules/encode-utf8\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz\",\n      \"integrity\": \"sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/encodeurl\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz\",\n      \"integrity\": \"sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/encoding\": {\n      \"version\": \"0.1.13\",\n      \"resolved\": \"https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz\",\n      \"integrity\": \"sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"iconv-lite\": \"^0.6.2\"\n      }\n    },\n    \"node_modules/encoding/node_modules/iconv-lite\": {\n      \"version\": \"0.6.3\",\n      \"resolved\": \"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz\",\n      \"integrity\": \"sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"safer-buffer\": \">= 2.1.2 < 3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/end-of-stream\": {\n      \"version\": \"1.4.4\",\n      \"resolved\": \"https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz\",\n      \"integrity\": \"sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==\",\n      \"dependencies\": {\n        \"once\": \"^1.4.0\"\n      }\n    },\n    \"node_modules/endian-toggle\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/endian-toggle/-/endian-toggle-0.0.0.tgz\",\n      \"integrity\": \"sha512-ShfqhXeHRE4TmggSlHXG8CMGIcsOsqDw/GcoPcosToE59Rm9e4aXaMhEQf2kPBsBRrKem1bbOAv5gOKnkliMFQ==\"\n    },\n    \"node_modules/enhanced-resolve\": {\n      \"version\": \"5.16.0\",\n      \"resolved\": \"https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz\",\n      \"integrity\": \"sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"graceful-fs\": \"^4.2.4\",\n        \"tapable\": \"^2.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10.13.0\"\n      }\n    },\n    \"node_modules/entities\": {\n      \"version\": \"4.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-4.5.0.tgz\",\n      \"integrity\": \"sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/env-paths\": {\n      \"version\": \"2.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz\",\n      \"integrity\": \"sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/err-code\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz\",\n      \"integrity\": \"sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/error-ex\": {\n      \"version\": \"1.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz\",\n      \"integrity\": \"sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"is-arrayish\": \"^0.2.1\"\n      }\n    },\n    \"node_modules/es-abstract\": {\n      \"version\": \"1.23.3\",\n      \"resolved\": \"https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz\",\n      \"integrity\": \"sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"array-buffer-byte-length\": \"^1.0.1\",\n        \"arraybuffer.prototype.slice\": \"^1.0.3\",\n        \"available-typed-arrays\": \"^1.0.7\",\n        \"call-bind\": \"^1.0.7\",\n        \"data-view-buffer\": \"^1.0.1\",\n        \"data-view-byte-length\": \"^1.0.1\",\n        \"data-view-byte-offset\": \"^1.0.0\",\n        \"es-define-property\": \"^1.0.0\",\n        \"es-errors\": \"^1.3.0\",\n        \"es-object-atoms\": \"^1.0.0\",\n        \"es-set-tostringtag\": \"^2.0.3\",\n        \"es-to-primitive\": \"^1.2.1\",\n        \"function.prototype.name\": \"^1.1.6\",\n        \"get-intrinsic\": \"^1.2.4\",\n        \"get-symbol-description\": \"^1.0.2\",\n        \"globalthis\": \"^1.0.3\",\n        \"gopd\": \"^1.0.1\",\n        \"has-property-descriptors\": \"^1.0.2\",\n        \"has-proto\": \"^1.0.3\",\n        \"has-symbols\": \"^1.0.3\",\n        \"hasown\": \"^2.0.2\",\n        \"internal-slot\": \"^1.0.7\",\n        \"is-array-buffer\": \"^3.0.4\",\n        \"is-callable\": \"^1.2.7\",\n        \"is-data-view\": \"^1.0.1\",\n        \"is-negative-zero\": \"^2.0.3\",\n        \"is-regex\": \"^1.1.4\",\n        \"is-shared-array-buffer\": \"^1.0.3\",\n        \"is-string\": \"^1.0.7\",\n        \"is-typed-array\": \"^1.1.13\",\n        \"is-weakref\": \"^1.0.2\",\n        \"object-inspect\": \"^1.13.1\",\n        \"object-keys\": \"^1.1.1\",\n        \"object.assign\": \"^4.1.5\",\n        \"regexp.prototype.flags\": \"^1.5.2\",\n        \"safe-array-concat\": \"^1.1.2\",\n        \"safe-regex-test\": \"^1.0.3\",\n        \"string.prototype.trim\": \"^1.2.9\",\n        \"string.prototype.trimend\": \"^1.0.8\",\n        \"string.prototype.trimstart\": \"^1.0.8\",\n        \"typed-array-buffer\": \"^1.0.2\",\n        \"typed-array-byte-length\": \"^1.0.1\",\n        \"typed-array-byte-offset\": \"^1.0.2\",\n        \"typed-array-length\": \"^1.0.6\",\n        \"unbox-primitive\": \"^1.0.2\",\n        \"which-typed-array\": \"^1.1.15\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/es-define-property\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz\",\n      \"integrity\": \"sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-errors\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz\",\n      \"integrity\": \"sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-iterator-helpers\": {\n      \"version\": \"1.0.19\",\n      \"resolved\": \"https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz\",\n      \"integrity\": \"sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.7\",\n        \"define-properties\": \"^1.2.1\",\n        \"es-abstract\": \"^1.23.3\",\n        \"es-errors\": \"^1.3.0\",\n        \"es-set-tostringtag\": \"^2.0.3\",\n        \"function-bind\": \"^1.1.2\",\n        \"get-intrinsic\": \"^1.2.4\",\n        \"globalthis\": \"^1.0.3\",\n        \"has-property-descriptors\": \"^1.0.2\",\n        \"has-proto\": \"^1.0.3\",\n        \"has-symbols\": \"^1.0.3\",\n        \"internal-slot\": \"^1.0.7\",\n        \"iterator.prototype\": \"^1.1.2\",\n        \"safe-array-concat\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-module-lexer\": {\n      \"version\": \"1.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz\",\n      \"integrity\": \"sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==\",\n      \"dev\": true\n    },\n    \"node_modules/es-object-atoms\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz\",\n      \"integrity\": \"sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-set-tostringtag\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz\",\n      \"integrity\": \"sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.6\",\n        \"has-tostringtag\": \"^1.0.2\",\n        \"hasown\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-shim-unscopables\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz\",\n      \"integrity\": \"sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"hasown\": \"^2.0.0\"\n      }\n    },\n    \"node_modules/es-to-primitive\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz\",\n      \"integrity\": \"sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"is-callable\": \"^1.1.4\",\n        \"is-date-object\": \"^1.0.1\",\n        \"is-symbol\": \"^1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/es5-ext\": {\n      \"version\": \"0.10.64\",\n      \"resolved\": \"https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz\",\n      \"integrity\": \"sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==\",\n      \"hasInstallScript\": true,\n      \"dependencies\": {\n        \"es6-iterator\": \"^2.0.3\",\n        \"es6-symbol\": \"^3.1.3\",\n        \"esniff\": \"^2.0.1\",\n        \"next-tick\": \"^1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10\"\n      }\n    },\n    \"node_modules/es6-error\": {\n      \"version\": \"4.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz\",\n      \"integrity\": \"sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==\",\n      \"optional\": true\n    },\n    \"node_modules/es6-iterator\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz\",\n      \"integrity\": \"sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==\",\n      \"dependencies\": {\n        \"d\": \"1\",\n        \"es5-ext\": \"^0.10.35\",\n        \"es6-symbol\": \"^3.1.1\"\n      }\n    },\n    \"node_modules/es6-symbol\": {\n      \"version\": \"3.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz\",\n      \"integrity\": \"sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==\",\n      \"dependencies\": {\n        \"d\": \"^1.0.2\",\n        \"ext\": \"^1.7.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.12\"\n      }\n    },\n    \"node_modules/es6-weak-map\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz\",\n      \"integrity\": \"sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==\",\n      \"dependencies\": {\n        \"d\": \"1\",\n        \"es5-ext\": \"^0.10.46\",\n        \"es6-iterator\": \"^2.0.3\",\n        \"es6-symbol\": \"^3.1.1\"\n      }\n    },\n    \"node_modules/escalade\": {\n      \"version\": \"3.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz\",\n      \"integrity\": \"sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/escape-goat\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz\",\n      \"integrity\": \"sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/escape-html\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz\",\n      \"integrity\": \"sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==\",\n      \"dev\": true\n    },\n    \"node_modules/escape-string-regexp\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz\",\n      \"integrity\": \"sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==\",\n      \"devOptional\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/escodegen\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz\",\n      \"integrity\": \"sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"esprima\": \"^4.0.1\",\n        \"estraverse\": \"^5.2.0\",\n        \"esutils\": \"^2.0.2\"\n      },\n      \"bin\": {\n        \"escodegen\": \"bin/escodegen.js\",\n        \"esgenerate\": \"bin/esgenerate.js\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0\"\n      },\n      \"optionalDependencies\": {\n        \"source-map\": \"~0.6.1\"\n      }\n    },\n    \"node_modules/eslint\": {\n      \"version\": \"8.57.0\",\n      \"resolved\": \"https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz\",\n      \"integrity\": \"sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@eslint-community/eslint-utils\": \"^4.2.0\",\n        \"@eslint-community/regexpp\": \"^4.6.1\",\n        \"@eslint/eslintrc\": \"^2.1.4\",\n        \"@eslint/js\": \"8.57.0\",\n        \"@humanwhocodes/config-array\": \"^0.11.14\",\n        \"@humanwhocodes/module-importer\": \"^1.0.1\",\n        \"@nodelib/fs.walk\": \"^1.2.8\",\n        \"@ungap/structured-clone\": \"^1.2.0\",\n        \"ajv\": \"^6.12.4\",\n        \"chalk\": \"^4.0.0\",\n        \"cross-spawn\": \"^7.0.2\",\n        \"debug\": \"^4.3.2\",\n        \"doctrine\": \"^3.0.0\",\n        \"escape-string-regexp\": \"^4.0.0\",\n        \"eslint-scope\": \"^7.2.2\",\n        \"eslint-visitor-keys\": \"^3.4.3\",\n        \"espree\": \"^9.6.1\",\n        \"esquery\": \"^1.4.2\",\n        \"esutils\": \"^2.0.2\",\n        \"fast-deep-equal\": \"^3.1.3\",\n        \"file-entry-cache\": \"^6.0.1\",\n        \"find-up\": \"^5.0.0\",\n        \"glob-parent\": \"^6.0.2\",\n        \"globals\": \"^13.19.0\",\n        \"graphemer\": \"^1.4.0\",\n        \"ignore\": \"^5.2.0\",\n        \"imurmurhash\": \"^0.1.4\",\n        \"is-glob\": \"^4.0.0\",\n        \"is-path-inside\": \"^3.0.3\",\n        \"js-yaml\": \"^4.1.0\",\n        \"json-stable-stringify-without-jsonify\": \"^1.0.1\",\n        \"levn\": \"^0.4.1\",\n        \"lodash.merge\": \"^4.6.2\",\n        \"minimatch\": \"^3.1.2\",\n        \"natural-compare\": \"^1.4.0\",\n        \"optionator\": \"^0.9.3\",\n        \"strip-ansi\": \"^6.0.1\",\n        \"text-table\": \"^0.2.0\"\n      },\n      \"bin\": {\n        \"eslint\": \"bin/eslint.js\"\n      },\n      \"engines\": {\n        \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/eslint\"\n      }\n    },\n    \"node_modules/eslint-config-prettier\": {\n      \"version\": \"9.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz\",\n      \"integrity\": \"sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==\",\n      \"dev\": true,\n      \"bin\": {\n        \"eslint-config-prettier\": \"bin/cli.js\"\n      },\n      \"peerDependencies\": {\n        \"eslint\": \">=7.0.0\"\n      }\n    },\n    \"node_modules/eslint-plugin-chai-friendly\": {\n      \"version\": \"0.7.4\",\n      \"resolved\": \"https://registry.npmjs.org/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-0.7.4.tgz\",\n      \"integrity\": \"sha512-PGPjJ8diYgX1mjLxGJqRop2rrGwZRKImoEOwUOgoIhg0p80MkTaqvmFLe5TF7/iagZHggasvIfQlUyHIhK/PYg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      },\n      \"peerDependencies\": {\n        \"eslint\": \">=3.0.0\"\n      }\n    },\n    \"node_modules/eslint-plugin-jsdoc\": {\n      \"version\": \"48.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.3.tgz\",\n      \"integrity\": \"sha512-r9DMAmFs66VNvNqRLLjHejdnJtILrt3xGi+Qx0op0oRfFGVpOR1Hb3BC++MacseHx93d8SKYPhyrC9BS7Os2QA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@es-joy/jsdoccomment\": \"~0.42.0\",\n        \"are-docs-informative\": \"^0.0.2\",\n        \"comment-parser\": \"1.4.1\",\n        \"debug\": \"^4.3.4\",\n        \"escape-string-regexp\": \"^4.0.0\",\n        \"esquery\": \"^1.5.0\",\n        \"is-builtin-module\": \"^3.2.1\",\n        \"semver\": \"^7.6.0\",\n        \"spdx-expression-parse\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"peerDependencies\": {\n        \"eslint\": \"^7.0.0 || ^8.0.0 || ^9.0.0\"\n      }\n    },\n    \"node_modules/eslint-plugin-no-only-tests\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.1.0.tgz\",\n      \"integrity\": \"sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=5.0.0\"\n      }\n    },\n    \"node_modules/eslint-plugin-react\": {\n      \"version\": \"7.34.1\",\n      \"resolved\": \"https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz\",\n      \"integrity\": \"sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"array-includes\": \"^3.1.7\",\n        \"array.prototype.findlast\": \"^1.2.4\",\n        \"array.prototype.flatmap\": \"^1.3.2\",\n        \"array.prototype.toreversed\": \"^1.1.2\",\n        \"array.prototype.tosorted\": \"^1.1.3\",\n        \"doctrine\": \"^2.1.0\",\n        \"es-iterator-helpers\": \"^1.0.17\",\n        \"estraverse\": \"^5.3.0\",\n        \"jsx-ast-utils\": \"^2.4.1 || ^3.0.0\",\n        \"minimatch\": \"^3.1.2\",\n        \"object.entries\": \"^1.1.7\",\n        \"object.fromentries\": \"^2.0.7\",\n        \"object.hasown\": \"^1.1.3\",\n        \"object.values\": \"^1.1.7\",\n        \"prop-types\": \"^15.8.1\",\n        \"resolve\": \"^2.0.0-next.5\",\n        \"semver\": \"^6.3.1\",\n        \"string.prototype.matchall\": \"^4.0.10\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      },\n      \"peerDependencies\": {\n        \"eslint\": \"^3 || ^4 || ^5 || ^6 || ^7 || ^8\"\n      }\n    },\n    \"node_modules/eslint-plugin-react/node_modules/doctrine\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz\",\n      \"integrity\": \"sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"esutils\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/eslint-plugin-react/node_modules/is-core-module\": {\n      \"version\": \"2.13.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz\",\n      \"integrity\": \"sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"hasown\": \"^2.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/eslint-plugin-react/node_modules/resolve\": {\n      \"version\": \"2.0.0-next.5\",\n      \"resolved\": \"https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz\",\n      \"integrity\": \"sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"is-core-module\": \"^2.13.0\",\n        \"path-parse\": \"^1.0.7\",\n        \"supports-preserve-symlinks-flag\": \"^1.0.0\"\n      },\n      \"bin\": {\n        \"resolve\": \"bin/resolve\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/eslint-plugin-react/node_modules/semver\": {\n      \"version\": \"6.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n      \"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n      \"dev\": true,\n      \"bin\": {\n        \"semver\": \"bin/semver.js\"\n      }\n    },\n    \"node_modules/eslint-scope\": {\n      \"version\": \"7.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz\",\n      \"integrity\": \"sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"esrecurse\": \"^4.3.0\",\n        \"estraverse\": \"^5.2.0\"\n      },\n      \"engines\": {\n        \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/eslint\"\n      }\n    },\n    \"node_modules/eslint-visitor-keys\": {\n      \"version\": \"3.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz\",\n      \"integrity\": \"sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/eslint\"\n      }\n    },\n    \"node_modules/eslint/node_modules/glob-parent\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz\",\n      \"integrity\": \"sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"is-glob\": \"^4.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">=10.13.0\"\n      }\n    },\n    \"node_modules/eslint/node_modules/globals\": {\n      \"version\": \"13.24.0\",\n      \"resolved\": \"https://registry.npmjs.org/globals/-/globals-13.24.0.tgz\",\n      \"integrity\": \"sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"type-fest\": \"^0.20.2\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/eslint/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/eslint/node_modules/type-fest\": {\n      \"version\": \"0.20.2\",\n      \"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz\",\n      \"integrity\": \"sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/esniff\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz\",\n      \"integrity\": \"sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==\",\n      \"dependencies\": {\n        \"d\": \"^1.0.1\",\n        \"es5-ext\": \"^0.10.62\",\n        \"event-emitter\": \"^0.3.5\",\n        \"type\": \"^2.7.2\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10\"\n      }\n    },\n    \"node_modules/espree\": {\n      \"version\": \"9.6.1\",\n      \"resolved\": \"https://registry.npmjs.org/espree/-/espree-9.6.1.tgz\",\n      \"integrity\": \"sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"acorn\": \"^8.9.0\",\n        \"acorn-jsx\": \"^5.3.2\",\n        \"eslint-visitor-keys\": \"^3.4.1\"\n      },\n      \"engines\": {\n        \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/eslint\"\n      }\n    },\n    \"node_modules/esprima\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz\",\n      \"integrity\": \"sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==\",\n      \"bin\": {\n        \"esparse\": \"bin/esparse.js\",\n        \"esvalidate\": \"bin/esvalidate.js\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/esquery\": {\n      \"version\": \"1.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz\",\n      \"integrity\": \"sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"estraverse\": \"^5.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10\"\n      }\n    },\n    \"node_modules/esrecurse\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz\",\n      \"integrity\": \"sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"estraverse\": \"^5.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4.0\"\n      }\n    },\n    \"node_modules/estraverse\": {\n      \"version\": \"5.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz\",\n      \"integrity\": \"sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=4.0\"\n      }\n    },\n    \"node_modules/estree-walker\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz\",\n      \"integrity\": \"sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==\",\n      \"dev\": true\n    },\n    \"node_modules/esutils\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz\",\n      \"integrity\": \"sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/etag\": {\n      \"version\": \"1.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/etag/-/etag-1.8.1.tgz\",\n      \"integrity\": \"sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/etcher-sdk\": {\n      \"version\": \"10.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/etcher-sdk/-/etcher-sdk-10.0.0.tgz\",\n      \"integrity\": \"sha512-RRC4pf19Vq+f+aNB7gNOIj3/kImw5I6UKOkWgdKLl/WgF/EefBuqmZeblAXHufZ+JnaH4ht2Pzw7GNqgFpqi0A==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@balena/node-beaglebone-usbboot\": \"^3.0.0\",\n        \"@balena/udif\": \"^1.1.2\",\n        \"@ronomon/direct-io\": \"^3.0.1\",\n        \"aws4-axios\": \"^3.3.0\",\n        \"axios\": \"^1.9.0\",\n        \"axios-http2-adapter\": \"^1.0.3\",\n        \"balena-image-fs\": \"^7.2.0\",\n        \"blockmap\": \"^4.0.3\",\n        \"check-disk-space\": \"^3.4.0\",\n        \"cyclic-32\": \"^1.1.0\",\n        \"debug\": \"^4.4.1\",\n        \"drivelist\": \"^12.0.0\",\n        \"file-disk\": \"^8.0.1\",\n        \"file-type\": \"^16.0.0\",\n        \"glob\": \"^10.3.10\",\n        \"gzip-stream\": \"^2.0.0\",\n        \"lzma-native\": \"^8.0.6\",\n        \"minimatch\": \"^9.0.3\",\n        \"mountutils\": \"^2.0.0\",\n        \"node-raspberrypi-usbboot\": \"1.1.0\",\n        \"outdent\": \"^0.8.0\",\n        \"partitioninfo\": \"^6.0.2\",\n        \"rwmutex\": \"^1.0.0\",\n        \"tslib\": \"^2.0.0\",\n        \"unbzip2-stream\": \"github:balena-io-modules/unbzip2-stream#4a54f56a25b58950f9e4277c56db2912d62242e7\",\n        \"unzip-stream\": \"^0.3.1\",\n        \"xxhash-addon\": \"^2.0.1\",\n        \"yauzl\": \"^2.9.2\",\n        \"zip-part-stream\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">18 <25\"\n      },\n      \"optionalDependencies\": {\n        \"winusb-driver-generator\": \"^2.0.0\"\n      }\n    },\n    \"node_modules/etcher-sdk/node_modules/brace-expansion\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz\",\n      \"integrity\": \"sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==\",\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/etcher-sdk/node_modules/debug\": {\n      \"version\": \"4.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.1.tgz\",\n      \"integrity\": \"sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ms\": \"^2.1.3\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"supports-color\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/etcher-sdk/node_modules/minimatch\": {\n      \"version\": \"9.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz\",\n      \"integrity\": \"sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==\",\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/etcher-sdk/node_modules/ms\": {\n      \"version\": \"2.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n      \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/etcher-sdk/node_modules/unbzip2-stream\": {\n      \"version\": \"1.4.2\",\n      \"resolved\": \"git+ssh://git@github.com/balena-io-modules/unbzip2-stream.git#4a54f56a25b58950f9e4277c56db2912d62242e7\",\n      \"integrity\": \"sha512-hqSQ+EGPNNs80IGpZszUngM7ttKBCgjRtrw+2PTRDUd1UNvPOoSL4M7V1bDBJXktGv8KaVJFRKk2mWi6RmbiEg==\"\n    },\n    \"node_modules/event-emitter\": {\n      \"version\": \"0.3.5\",\n      \"resolved\": \"https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz\",\n      \"integrity\": \"sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==\",\n      \"dependencies\": {\n        \"d\": \"1\",\n        \"es5-ext\": \"~0.10.14\"\n      }\n    },\n    \"node_modules/event-target-shim\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz\",\n      \"integrity\": \"sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/eventemitter3\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz\",\n      \"integrity\": \"sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==\",\n      \"dev\": true\n    },\n    \"node_modules/events\": {\n      \"version\": \"3.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/events/-/events-3.3.0.tgz\",\n      \"integrity\": \"sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.8.x\"\n      }\n    },\n    \"node_modules/execa\": {\n      \"version\": \"8.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/execa/-/execa-8.0.1.tgz\",\n      \"integrity\": \"sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"cross-spawn\": \"^7.0.3\",\n        \"get-stream\": \"^8.0.1\",\n        \"human-signals\": \"^5.0.0\",\n        \"is-stream\": \"^3.0.0\",\n        \"merge-stream\": \"^2.0.0\",\n        \"npm-run-path\": \"^5.1.0\",\n        \"onetime\": \"^6.0.0\",\n        \"signal-exit\": \"^4.1.0\",\n        \"strip-final-newline\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=16.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sindresorhus/execa?sponsor=1\"\n      }\n    },\n    \"node_modules/expand-template\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz\",\n      \"integrity\": \"sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/expand-tilde\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz\",\n      \"integrity\": \"sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"homedir-polyfill\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/expect\": {\n      \"version\": \"29.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/expect/-/expect-29.7.0.tgz\",\n      \"integrity\": \"sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jest/expect-utils\": \"^29.7.0\",\n        \"jest-get-type\": \"^29.6.3\",\n        \"jest-matcher-utils\": \"^29.7.0\",\n        \"jest-message-util\": \"^29.7.0\",\n        \"jest-util\": \"^29.7.0\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/expect-webdriverio\": {\n      \"version\": \"4.13.0\",\n      \"resolved\": \"https://registry.npmjs.org/expect-webdriverio/-/expect-webdriverio-4.13.0.tgz\",\n      \"integrity\": \"sha512-y2LF6vECifTOiOk0i0FMPWJGyntiW+eqzQWFZimu9Cae8XMUH5q4F5SzpfGCxsvmOdf3uFjlr+u9IXrQBN5o0Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@vitest/snapshot\": \"^1.2.2\",\n        \"expect\": \"^29.7.0\",\n        \"jest-matcher-utils\": \"^29.7.0\",\n        \"lodash.isequal\": \"^4.5.0\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || >=18 || >=20\"\n      },\n      \"optionalDependencies\": {\n        \"@wdio/globals\": \"^8.29.3\",\n        \"@wdio/logger\": \"^8.28.0\",\n        \"webdriverio\": \"^8.29.3\"\n      }\n    },\n    \"node_modules/exponential-backoff\": {\n      \"version\": \"3.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz\",\n      \"integrity\": \"sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==\",\n      \"dev\": true,\n      \"license\": \"Apache-2.0\"\n    },\n    \"node_modules/express\": {\n      \"version\": \"4.19.2\",\n      \"resolved\": \"https://registry.npmjs.org/express/-/express-4.19.2.tgz\",\n      \"integrity\": \"sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"accepts\": \"~1.3.8\",\n        \"array-flatten\": \"1.1.1\",\n        \"body-parser\": \"1.20.2\",\n        \"content-disposition\": \"0.5.4\",\n        \"content-type\": \"~1.0.4\",\n        \"cookie\": \"0.6.0\",\n        \"cookie-signature\": \"1.0.6\",\n        \"debug\": \"2.6.9\",\n        \"depd\": \"2.0.0\",\n        \"encodeurl\": \"~1.0.2\",\n        \"escape-html\": \"~1.0.3\",\n        \"etag\": \"~1.8.1\",\n        \"finalhandler\": \"1.2.0\",\n        \"fresh\": \"0.5.2\",\n        \"http-errors\": \"2.0.0\",\n        \"merge-descriptors\": \"1.0.1\",\n        \"methods\": \"~1.1.2\",\n        \"on-finished\": \"2.4.1\",\n        \"parseurl\": \"~1.3.3\",\n        \"path-to-regexp\": \"0.1.7\",\n        \"proxy-addr\": \"~2.0.7\",\n        \"qs\": \"6.11.0\",\n        \"range-parser\": \"~1.2.1\",\n        \"safe-buffer\": \"5.2.1\",\n        \"send\": \"0.18.0\",\n        \"serve-static\": \"1.15.0\",\n        \"setprototypeof\": \"1.2.0\",\n        \"statuses\": \"2.0.1\",\n        \"type-is\": \"~1.6.18\",\n        \"utils-merge\": \"1.0.1\",\n        \"vary\": \"~1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.10.0\"\n      }\n    },\n    \"node_modules/express-ws\": {\n      \"version\": \"5.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/express-ws/-/express-ws-5.0.2.tgz\",\n      \"integrity\": \"sha512-0uvmuk61O9HXgLhGl3QhNSEtRsQevtmbL94/eILaliEADZBHZOQUAiHFrGPrgsjikohyrmSG5g+sCfASTt0lkQ==\",\n      \"dev\": true,\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"ws\": \"^7.4.6\"\n      },\n      \"engines\": {\n        \"node\": \">=4.5.0\"\n      },\n      \"peerDependencies\": {\n        \"express\": \"^4.0.0 || ^5.0.0-alpha.1\"\n      }\n    },\n    \"node_modules/express-ws/node_modules/ws\": {\n      \"version\": \"7.5.10\",\n      \"resolved\": \"https://registry.npmjs.org/ws/-/ws-7.5.10.tgz\",\n      \"integrity\": \"sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8.3.0\"\n      },\n      \"peerDependencies\": {\n        \"bufferutil\": \"^4.0.1\",\n        \"utf-8-validate\": \"^5.0.2\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bufferutil\": {\n          \"optional\": true\n        },\n        \"utf-8-validate\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/express/node_modules/debug\": {\n      \"version\": \"2.6.9\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-2.6.9.tgz\",\n      \"integrity\": \"sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ms\": \"2.0.0\"\n      }\n    },\n    \"node_modules/express/node_modules/ms\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz\",\n      \"integrity\": \"sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==\",\n      \"dev\": true\n    },\n    \"node_modules/ext\": {\n      \"version\": \"1.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/ext/-/ext-1.7.0.tgz\",\n      \"integrity\": \"sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==\",\n      \"dependencies\": {\n        \"type\": \"^2.7.2\"\n      }\n    },\n    \"node_modules/ext2fs\": {\n      \"version\": \"4.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/ext2fs/-/ext2fs-4.2.3.tgz\",\n      \"integrity\": \"sha512-tH6a44Lo9rbWTgGOhR1qnl1cbjfpmjPgpb9jAgpWex0RcVOhFngcmm6nnDsi7QflRyEMaSDumWtZMdJZvNtzEw==\",\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/extend\": {\n      \"version\": \"3.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/extend/-/extend-3.0.2.tgz\",\n      \"integrity\": \"sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==\"\n    },\n    \"node_modules/extend-shallow\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz\",\n      \"integrity\": \"sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==\",\n      \"dependencies\": {\n        \"is-extendable\": \"^0.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/external-editor\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz\",\n      \"integrity\": \"sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==\",\n      \"dependencies\": {\n        \"chardet\": \"^0.7.0\",\n        \"iconv-lite\": \"^0.4.24\",\n        \"tmp\": \"^0.0.33\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/extract-zip\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz\",\n      \"integrity\": \"sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==\",\n      \"dependencies\": {\n        \"debug\": \"^4.1.1\",\n        \"get-stream\": \"^5.1.0\",\n        \"yauzl\": \"^2.10.0\"\n      },\n      \"bin\": {\n        \"extract-zip\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.17.0\"\n      },\n      \"optionalDependencies\": {\n        \"@types/yauzl\": \"^2.9.1\"\n      }\n    },\n    \"node_modules/extract-zip/node_modules/get-stream\": {\n      \"version\": \"5.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz\",\n      \"integrity\": \"sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==\",\n      \"dependencies\": {\n        \"pump\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/fast-clone\": {\n      \"version\": \"1.5.13\",\n      \"resolved\": \"https://registry.npmjs.org/fast-clone/-/fast-clone-1.5.13.tgz\",\n      \"integrity\": \"sha512-0ez7coyFBQFjZtId+RJqJ+EQs61w9xARfqjqK0AD9vIUkSxWD4HvPt80+5evebZ1tTnv1GYKrPTipx7kOW5ipA==\"\n    },\n    \"node_modules/fast-copy\": {\n      \"version\": \"3.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz\",\n      \"integrity\": \"sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==\",\n      \"dev\": true\n    },\n    \"node_modules/fast-deep-equal\": {\n      \"version\": \"3.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz\",\n      \"integrity\": \"sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==\"\n    },\n    \"node_modules/fast-fifo\": {\n      \"version\": \"1.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz\",\n      \"integrity\": \"sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==\",\n      \"dev\": true\n    },\n    \"node_modules/fast-glob\": {\n      \"version\": \"3.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz\",\n      \"integrity\": \"sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@nodelib/fs.stat\": \"^2.0.2\",\n        \"@nodelib/fs.walk\": \"^1.2.3\",\n        \"glob-parent\": \"^5.1.2\",\n        \"merge2\": \"^1.3.0\",\n        \"micromatch\": \"^4.0.4\"\n      },\n      \"engines\": {\n        \"node\": \">=8.6.0\"\n      }\n    },\n    \"node_modules/fast-json-stable-stringify\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz\",\n      \"integrity\": \"sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==\"\n    },\n    \"node_modules/fast-levenshtein\": {\n      \"version\": \"2.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz\",\n      \"integrity\": \"sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==\",\n      \"dev\": true\n    },\n    \"node_modules/fast-memoize\": {\n      \"version\": \"2.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz\",\n      \"integrity\": \"sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==\"\n    },\n    \"node_modules/fast-xml-parser\": {\n      \"version\": \"4.2.5\",\n      \"resolved\": \"https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz\",\n      \"integrity\": \"sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==\",\n      \"funding\": [\n        {\n          \"type\": \"paypal\",\n          \"url\": \"https://paypal.me/naturalintelligence\"\n        },\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/NaturalIntelligence\"\n        }\n      ],\n      \"dependencies\": {\n        \"strnum\": \"^1.0.5\"\n      },\n      \"bin\": {\n        \"fxparser\": \"src/cli/cli.js\"\n      }\n    },\n    \"node_modules/fastq\": {\n      \"version\": \"1.17.1\",\n      \"resolved\": \"https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz\",\n      \"integrity\": \"sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"reusify\": \"^1.0.4\"\n      }\n    },\n    \"node_modules/fatfs\": {\n      \"version\": \"0.10.8\",\n      \"resolved\": \"https://registry.npmjs.org/fatfs/-/fatfs-0.10.8.tgz\",\n      \"integrity\": \"sha512-SgtbqGNMwptNXpgLeqSSShm254JIzoVUyyFQBbqMmSPDpKsdZ65vSiS2SzyUI8sMtPvYK62hkuYhXzGZCMt5uQ==\",\n      \"dependencies\": {\n        \"fifolock\": \"^1.0.0\",\n        \"struct-fu\": \"^1.2.1\",\n        \"xok\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/faye-websocket\": {\n      \"version\": \"0.11.4\",\n      \"resolved\": \"https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz\",\n      \"integrity\": \"sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"websocket-driver\": \">=0.5.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.8.0\"\n      }\n    },\n    \"node_modules/fd-slicer\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz\",\n      \"integrity\": \"sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==\",\n      \"dependencies\": {\n        \"pend\": \"~1.2.0\"\n      }\n    },\n    \"node_modules/fetch-blob\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz\",\n      \"integrity\": \"sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/jimmywarting\"\n        },\n        {\n          \"type\": \"paypal\",\n          \"url\": \"https://paypal.me/jimmywarting\"\n        }\n      ],\n      \"dependencies\": {\n        \"node-domexception\": \"^1.0.0\",\n        \"web-streams-polyfill\": \"^3.0.3\"\n      },\n      \"engines\": {\n        \"node\": \"^12.20 || >= 14.13\"\n      }\n    },\n    \"node_modules/fifolock\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/fifolock/-/fifolock-1.0.0.tgz\",\n      \"integrity\": \"sha512-CqipzmuW6+xm7emSaBx1rV/fX17UGF9HkzLH887cFOj/Pe3TJsrboGxjZZtzV/5JrQ5vMegQ7ipZkB9wvsBDDQ==\"\n    },\n    \"node_modules/figures\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/figures/-/figures-5.0.0.tgz\",\n      \"integrity\": \"sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"escape-string-regexp\": \"^5.0.0\",\n        \"is-unicode-supported\": \"^1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/figures/node_modules/escape-string-regexp\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz\",\n      \"integrity\": \"sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/file-disk\": {\n      \"version\": \"8.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/file-disk/-/file-disk-8.0.1.tgz\",\n      \"integrity\": \"sha512-oO1bkG2RmZnMqteiAO3Uhffj/f6PJ5WY3fdVJJuI5tDbDgW3MgQvhQsDpijX81TXCbxRAKaNFdEQABTTyjL+og==\",\n      \"dependencies\": {\n        \"tslib\": \"^2.0.0\"\n      }\n    },\n    \"node_modules/file-entry-cache\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz\",\n      \"integrity\": \"sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"flat-cache\": \"^3.0.4\"\n      },\n      \"engines\": {\n        \"node\": \"^10.12.0 || >=12.0.0\"\n      }\n    },\n    \"node_modules/file-loader\": {\n      \"version\": \"6.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz\",\n      \"integrity\": \"sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"loader-utils\": \"^2.0.0\",\n        \"schema-utils\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.13.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/webpack\"\n      },\n      \"peerDependencies\": {\n        \"webpack\": \"^4.0.0 || ^5.0.0\"\n      }\n    },\n    \"node_modules/file-type\": {\n      \"version\": \"16.5.4\",\n      \"resolved\": \"https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz\",\n      \"integrity\": \"sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==\",\n      \"dependencies\": {\n        \"readable-web-to-node-stream\": \"^3.0.0\",\n        \"strtok3\": \"^6.2.4\",\n        \"token-types\": \"^4.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sindresorhus/file-type?sponsor=1\"\n      }\n    },\n    \"node_modules/file-uri-to-path\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz\",\n      \"integrity\": \"sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==\"\n    },\n    \"node_modules/filelist\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz\",\n      \"integrity\": \"sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"minimatch\": \"^5.0.1\"\n      }\n    },\n    \"node_modules/filelist/node_modules/brace-expansion\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz\",\n      \"integrity\": \"sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/filelist/node_modules/minimatch\": {\n      \"version\": \"5.1.6\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz\",\n      \"integrity\": \"sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/filename-reserved-regex\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz\",\n      \"integrity\": \"sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/filenamify\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz\",\n      \"integrity\": \"sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"filename-reserved-regex\": \"^2.0.0\",\n        \"strip-outer\": \"^1.0.1\",\n        \"trim-repeated\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/fill-range\": {\n      \"version\": \"7.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz\",\n      \"integrity\": \"sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"to-regex-range\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/finalhandler\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz\",\n      \"integrity\": \"sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"debug\": \"2.6.9\",\n        \"encodeurl\": \"~1.0.2\",\n        \"escape-html\": \"~1.0.3\",\n        \"on-finished\": \"2.4.1\",\n        \"parseurl\": \"~1.3.3\",\n        \"statuses\": \"2.0.1\",\n        \"unpipe\": \"~1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/finalhandler/node_modules/debug\": {\n      \"version\": \"2.6.9\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-2.6.9.tgz\",\n      \"integrity\": \"sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ms\": \"2.0.0\"\n      }\n    },\n    \"node_modules/finalhandler/node_modules/ms\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz\",\n      \"integrity\": \"sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==\",\n      \"dev\": true\n    },\n    \"node_modules/find-up\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz\",\n      \"integrity\": \"sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"locate-path\": \"^6.0.0\",\n        \"path-exists\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/find-up-simple\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz\",\n      \"integrity\": \"sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/find-versions\": {\n      \"version\": \"5.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz\",\n      \"integrity\": \"sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"semver-regex\": \"^4.0.5\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/findup-sync\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz\",\n      \"integrity\": \"sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"detect-file\": \"^1.0.0\",\n        \"is-glob\": \"^4.0.3\",\n        \"micromatch\": \"^4.0.4\",\n        \"resolve-dir\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.13.0\"\n      }\n    },\n    \"node_modules/flat\": {\n      \"version\": \"5.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/flat/-/flat-5.0.2.tgz\",\n      \"integrity\": \"sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==\",\n      \"dev\": true,\n      \"bin\": {\n        \"flat\": \"cli.js\"\n      }\n    },\n    \"node_modules/flat-cache\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz\",\n      \"integrity\": \"sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"flatted\": \"^3.2.9\",\n        \"keyv\": \"^4.5.3\",\n        \"rimraf\": \"^3.0.2\"\n      },\n      \"engines\": {\n        \"node\": \"^10.12.0 || >=12.0.0\"\n      }\n    },\n    \"node_modules/flatted\": {\n      \"version\": \"3.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz\",\n      \"integrity\": \"sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==\",\n      \"dev\": true\n    },\n    \"node_modules/flora-colossus\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/flora-colossus/-/flora-colossus-2.0.0.tgz\",\n      \"integrity\": \"sha512-dz4HxH6pOvbUzZpZ/yXhafjbR2I8cenK5xL0KtBFb7U2ADsR+OwXifnxZjij/pZWF775uSCMzWVd+jDik2H2IA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"debug\": \"^4.3.4\",\n        \"fs-extra\": \"^10.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 12\"\n      }\n    },\n    \"node_modules/fmix\": {\n      \"version\": \"0.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz\",\n      \"integrity\": \"sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"imul\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/follow-redirects\": {\n      \"version\": \"1.15.6\",\n      \"resolved\": \"https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz\",\n      \"integrity\": \"sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://github.com/sponsors/RubenVerborgh\"\n        }\n      ],\n      \"engines\": {\n        \"node\": \">=4.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"debug\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/for-each\": {\n      \"version\": \"0.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz\",\n      \"integrity\": \"sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"is-callable\": \"^1.1.3\"\n      }\n    },\n    \"node_modules/foreground-child\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz\",\n      \"integrity\": \"sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==\",\n      \"dependencies\": {\n        \"cross-spawn\": \"^7.0.0\",\n        \"signal-exit\": \"^4.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/form-data\": {\n      \"version\": \"4.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz\",\n      \"integrity\": \"sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"asynckit\": \"^0.4.0\",\n        \"combined-stream\": \"^1.0.8\",\n        \"es-set-tostringtag\": \"^2.1.0\",\n        \"hasown\": \"^2.0.2\",\n        \"mime-types\": \"^2.1.12\"\n      },\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/form-data-encoder\": {\n      \"version\": \"2.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz\",\n      \"integrity\": \"sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 14.17\"\n      }\n    },\n    \"node_modules/format-util\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/format-util/-/format-util-1.0.5.tgz\",\n      \"integrity\": \"sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==\"\n    },\n    \"node_modules/formdata-polyfill\": {\n      \"version\": \"4.0.10\",\n      \"resolved\": \"https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz\",\n      \"integrity\": \"sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"fetch-blob\": \"^3.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">=12.20.0\"\n      }\n    },\n    \"node_modules/forwarded\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz\",\n      \"integrity\": \"sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/fresh\": {\n      \"version\": \"0.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz\",\n      \"integrity\": \"sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/from2\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/from2/-/from2-2.3.0.tgz\",\n      \"integrity\": \"sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"inherits\": \"^2.0.1\",\n        \"readable-stream\": \"^2.0.0\"\n      }\n    },\n    \"node_modules/from2/node_modules/isarray\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz\",\n      \"integrity\": \"sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==\",\n      \"dev\": true\n    },\n    \"node_modules/from2/node_modules/readable-stream\": {\n      \"version\": \"2.3.8\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz\",\n      \"integrity\": \"sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"core-util-is\": \"~1.0.0\",\n        \"inherits\": \"~2.0.3\",\n        \"isarray\": \"~1.0.0\",\n        \"process-nextick-args\": \"~2.0.0\",\n        \"safe-buffer\": \"~5.1.1\",\n        \"string_decoder\": \"~1.1.1\",\n        \"util-deprecate\": \"~1.0.1\"\n      }\n    },\n    \"node_modules/from2/node_modules/safe-buffer\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz\",\n      \"integrity\": \"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==\",\n      \"dev\": true\n    },\n    \"node_modules/from2/node_modules/string_decoder\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz\",\n      \"integrity\": \"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"safe-buffer\": \"~5.1.0\"\n      }\n    },\n    \"node_modules/fs-constants\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz\",\n      \"integrity\": \"sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==\"\n    },\n    \"node_modules/fs-exists-sync\": {\n      \"version\": \"0.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz\",\n      \"integrity\": \"sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/fs-extra\": {\n      \"version\": \"10.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz\",\n      \"integrity\": \"sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==\",\n      \"dependencies\": {\n        \"graceful-fs\": \"^4.2.0\",\n        \"jsonfile\": \"^6.0.1\",\n        \"universalify\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/fs-minipass\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz\",\n      \"integrity\": \"sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"minipass\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/fs-minipass/node_modules/minipass\": {\n      \"version\": \"3.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz\",\n      \"integrity\": \"sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"yallist\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/fs-minipass/node_modules/yallist\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz\",\n      \"integrity\": \"sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==\",\n      \"dev\": true,\n      \"license\": \"ISC\"\n    },\n    \"node_modules/fs-monkey\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz\",\n      \"integrity\": \"sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==\",\n      \"dev\": true\n    },\n    \"node_modules/fs-temp\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/fs-temp/-/fs-temp-1.2.1.tgz\",\n      \"integrity\": \"sha512-okTwLB7/Qsq82G6iN5zZJFsOfZtx2/pqrA7Hk/9fvy+c+eJS9CvgGXT2uNxwnI14BDY9L/jQPkaBgSvlKfSW9w==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"random-path\": \"^0.1.0\"\n      }\n    },\n    \"node_modules/fs-xattr\": {\n      \"version\": \"0.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/fs-xattr/-/fs-xattr-0.3.1.tgz\",\n      \"integrity\": \"sha512-UVqkrEW0GfDabw4C3HOrFlxKfx0eeigfRne69FxSBdHIP8Qt5Sq6Pu3RM9KmMlkygtC4pPKkj5CiPO5USnj2GA==\",\n      \"dev\": true,\n      \"hasInstallScript\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"!win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=8.6.0\"\n      }\n    },\n    \"node_modules/fs.realpath\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz\",\n      \"integrity\": \"sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==\"\n    },\n    \"node_modules/fsevents\": {\n      \"version\": \"2.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz\",\n      \"integrity\": \"sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==\",\n      \"dev\": true,\n      \"hasInstallScript\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n      }\n    },\n    \"node_modules/fstream\": {\n      \"version\": \"1.0.12\",\n      \"resolved\": \"https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz\",\n      \"integrity\": \"sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"graceful-fs\": \"^4.1.2\",\n        \"inherits\": \"~2.0.0\",\n        \"mkdirp\": \">=0.5 0\",\n        \"rimraf\": \"2\"\n      },\n      \"engines\": {\n        \"node\": \">=0.6\"\n      }\n    },\n    \"node_modules/fstream/node_modules/glob\": {\n      \"version\": \"7.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-7.2.3.tgz\",\n      \"integrity\": \"sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"fs.realpath\": \"^1.0.0\",\n        \"inflight\": \"^1.0.4\",\n        \"inherits\": \"2\",\n        \"minimatch\": \"^3.1.1\",\n        \"once\": \"^1.3.0\",\n        \"path-is-absolute\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/fstream/node_modules/mkdirp\": {\n      \"version\": \"0.5.6\",\n      \"resolved\": \"https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz\",\n      \"integrity\": \"sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"minimist\": \"^1.2.6\"\n      },\n      \"bin\": {\n        \"mkdirp\": \"bin/cmd.js\"\n      }\n    },\n    \"node_modules/fstream/node_modules/rimraf\": {\n      \"version\": \"2.7.1\",\n      \"resolved\": \"https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz\",\n      \"integrity\": \"sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"glob\": \"^7.1.3\"\n      },\n      \"bin\": {\n        \"rimraf\": \"bin.js\"\n      }\n    },\n    \"node_modules/function-bind\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz\",\n      \"integrity\": \"sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==\",\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/function.prototype.name\": {\n      \"version\": \"1.1.6\",\n      \"resolved\": \"https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz\",\n      \"integrity\": \"sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.2\",\n        \"define-properties\": \"^1.2.0\",\n        \"es-abstract\": \"^1.22.1\",\n        \"functions-have-names\": \"^1.2.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/functions-have-names\": {\n      \"version\": \"1.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz\",\n      \"integrity\": \"sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==\",\n      \"dev\": true,\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/galactus\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/galactus/-/galactus-1.0.0.tgz\",\n      \"integrity\": \"sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"debug\": \"^4.3.4\",\n        \"flora-colossus\": \"^2.0.0\",\n        \"fs-extra\": \"^10.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 12\"\n      }\n    },\n    \"node_modules/gar\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/gar/-/gar-1.0.4.tgz\",\n      \"integrity\": \"sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==\",\n      \"deprecated\": \"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.\",\n      \"dev\": true,\n      \"optional\": true\n    },\n    \"node_modules/gaze\": {\n      \"version\": \"1.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz\",\n      \"integrity\": \"sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"globule\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 4.0.0\"\n      }\n    },\n    \"node_modules/geckodriver\": {\n      \"version\": \"4.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/geckodriver/-/geckodriver-4.3.3.tgz\",\n      \"integrity\": \"sha512-we2c2COgxFkLVuoknJNx+ioP+7VDq0sr6SCqWHTzlA4kzIbzR0EQ1Pps34s8WrsOnQqPC8a4sZV9dRPROOrkSg==\",\n      \"dev\": true,\n      \"hasInstallScript\": true,\n      \"dependencies\": {\n        \"@wdio/logger\": \"^8.28.0\",\n        \"decamelize\": \"^6.0.0\",\n        \"http-proxy-agent\": \"^7.0.2\",\n        \"https-proxy-agent\": \"^7.0.4\",\n        \"node-fetch\": \"^3.3.2\",\n        \"tar-fs\": \"^3.0.5\",\n        \"unzipper\": \"^0.10.14\",\n        \"which\": \"^4.0.0\"\n      },\n      \"bin\": {\n        \"geckodriver\": \"bin/geckodriver.js\"\n      },\n      \"engines\": {\n        \"node\": \"^16.13 || >=18 || >=20\"\n      }\n    },\n    \"node_modules/geckodriver/node_modules/data-uri-to-buffer\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz\",\n      \"integrity\": \"sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 12\"\n      }\n    },\n    \"node_modules/geckodriver/node_modules/https-proxy-agent\": {\n      \"version\": \"7.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz\",\n      \"integrity\": \"sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"agent-base\": \"^7.0.2\",\n        \"debug\": \"4\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/geckodriver/node_modules/isexe\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz\",\n      \"integrity\": \"sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/geckodriver/node_modules/node-fetch\": {\n      \"version\": \"3.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz\",\n      \"integrity\": \"sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"data-uri-to-buffer\": \"^4.0.0\",\n        \"fetch-blob\": \"^3.1.4\",\n        \"formdata-polyfill\": \"^4.0.10\"\n      },\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/node-fetch\"\n      }\n    },\n    \"node_modules/geckodriver/node_modules/tar-fs\": {\n      \"version\": \"3.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz\",\n      \"integrity\": \"sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"pump\": \"^3.0.0\",\n        \"tar-stream\": \"^3.1.5\"\n      },\n      \"optionalDependencies\": {\n        \"bare-fs\": \"^2.1.1\",\n        \"bare-path\": \"^2.1.0\"\n      }\n    },\n    \"node_modules/geckodriver/node_modules/which\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/which/-/which-4.0.0.tgz\",\n      \"integrity\": \"sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"isexe\": \"^3.1.1\"\n      },\n      \"bin\": {\n        \"node-which\": \"bin/which.js\"\n      },\n      \"engines\": {\n        \"node\": \"^16.13.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/generate-function\": {\n      \"version\": \"2.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz\",\n      \"integrity\": \"sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"is-property\": \"^1.0.2\"\n      }\n    },\n    \"node_modules/generate-object-property\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz\",\n      \"integrity\": \"sha512-TuOwZWgJ2VAMEGJvAyPWvpqxSANF0LDpmyHauMjFYzaACvn+QTT/AZomvPCzVBV7yDN3OmwHQ5OvHaeLKre3JQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"is-property\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/gensync\": {\n      \"version\": \"1.0.0-beta.2\",\n      \"resolved\": \"https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz\",\n      \"integrity\": \"sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/get-caller-file\": {\n      \"version\": \"2.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\n      \"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\",\n      \"engines\": {\n        \"node\": \"6.* || 8.* || >= 10.*\"\n      }\n    },\n    \"node_modules/get-folder-size\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz\",\n      \"integrity\": \"sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"gar\": \"^1.0.4\",\n        \"tiny-each-async\": \"2.0.3\"\n      },\n      \"bin\": {\n        \"get-folder-size\": \"bin/get-folder-size\"\n      }\n    },\n    \"node_modules/get-func-name\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz\",\n      \"integrity\": \"sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/get-intrinsic\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz\",\n      \"integrity\": \"sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"es-define-property\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"es-object-atoms\": \"^1.1.1\",\n        \"function-bind\": \"^1.1.2\",\n        \"get-proto\": \"^1.0.1\",\n        \"gopd\": \"^1.2.0\",\n        \"has-symbols\": \"^1.1.0\",\n        \"hasown\": \"^2.0.2\",\n        \"math-intrinsics\": \"^1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/get-package-info\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz\",\n      \"integrity\": \"sha512-SCbprXGAPdIhKAXiG+Mk6yeoFH61JlYunqdFQFHDtLjJlDjFf6x07dsS8acO+xWt52jpdVo49AlVDnUVK1sDNw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"bluebird\": \"^3.1.1\",\n        \"debug\": \"^2.2.0\",\n        \"lodash.get\": \"^4.0.0\",\n        \"read-pkg-up\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 4.0\"\n      }\n    },\n    \"node_modules/get-package-info/node_modules/debug\": {\n      \"version\": \"2.6.9\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-2.6.9.tgz\",\n      \"integrity\": \"sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ms\": \"2.0.0\"\n      }\n    },\n    \"node_modules/get-package-info/node_modules/find-up\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz\",\n      \"integrity\": \"sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"locate-path\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/get-package-info/node_modules/hosted-git-info\": {\n      \"version\": \"2.8.9\",\n      \"resolved\": \"https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz\",\n      \"integrity\": \"sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==\",\n      \"dev\": true,\n      \"license\": \"ISC\"\n    },\n    \"node_modules/get-package-info/node_modules/locate-path\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz\",\n      \"integrity\": \"sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"p-locate\": \"^2.0.0\",\n        \"path-exists\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/get-package-info/node_modules/ms\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz\",\n      \"integrity\": \"sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/get-package-info/node_modules/normalize-package-data\": {\n      \"version\": \"2.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz\",\n      \"integrity\": \"sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==\",\n      \"dev\": true,\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"hosted-git-info\": \"^2.1.4\",\n        \"resolve\": \"^1.10.0\",\n        \"semver\": \"2 || 3 || 4 || 5\",\n        \"validate-npm-package-license\": \"^3.0.1\"\n      }\n    },\n    \"node_modules/get-package-info/node_modules/p-limit\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz\",\n      \"integrity\": \"sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"p-try\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/get-package-info/node_modules/p-locate\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz\",\n      \"integrity\": \"sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"p-limit\": \"^1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/get-package-info/node_modules/path-exists\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz\",\n      \"integrity\": \"sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/get-package-info/node_modules/path-type\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz\",\n      \"integrity\": \"sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"pify\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/get-package-info/node_modules/read-pkg\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz\",\n      \"integrity\": \"sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"load-json-file\": \"^2.0.0\",\n        \"normalize-package-data\": \"^2.3.2\",\n        \"path-type\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/get-package-info/node_modules/read-pkg-up\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz\",\n      \"integrity\": \"sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"find-up\": \"^2.0.0\",\n        \"read-pkg\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/get-package-info/node_modules/semver\": {\n      \"version\": \"5.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-5.7.2.tgz\",\n      \"integrity\": \"sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"bin\": {\n        \"semver\": \"bin/semver\"\n      }\n    },\n    \"node_modules/get-port\": {\n      \"version\": \"7.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz\",\n      \"integrity\": \"sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=16\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/get-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"dunder-proto\": \"^1.0.1\",\n        \"es-object-atoms\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/get-stream\": {\n      \"version\": \"8.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz\",\n      \"integrity\": \"sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=16\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/get-symbol-description\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz\",\n      \"integrity\": \"sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.5\",\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/get-uri\": {\n      \"version\": \"6.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz\",\n      \"integrity\": \"sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"basic-ftp\": \"^5.0.2\",\n        \"data-uri-to-buffer\": \"^6.0.2\",\n        \"debug\": \"^4.3.4\",\n        \"fs-extra\": \"^11.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/get-uri/node_modules/fs-extra\": {\n      \"version\": \"11.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz\",\n      \"integrity\": \"sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"graceful-fs\": \"^4.2.0\",\n        \"jsonfile\": \"^6.0.1\",\n        \"universalify\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14.14\"\n      }\n    },\n    \"node_modules/git-config-path\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/git-config-path/-/git-config-path-1.0.1.tgz\",\n      \"integrity\": \"sha512-KcJ2dlrrP5DbBnYIZ2nlikALfRhKzNSX0stvv3ImJ+fvC4hXKoV+U+74SV0upg+jlQZbrtQzc0bu6/Zh+7aQbg==\",\n      \"dependencies\": {\n        \"extend-shallow\": \"^2.0.1\",\n        \"fs-exists-sync\": \"^0.1.0\",\n        \"homedir-polyfill\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/git-username\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/git-username/-/git-username-1.0.0.tgz\",\n      \"integrity\": \"sha512-xm45KwBR6Eu1jO4umx/o2M84v9TC7tdOBuzLx8ayhdR9H1FBiiG9azz31uC0esDvaWVBTDINpJ5USomk+ja8OQ==\",\n      \"dependencies\": {\n        \"parse-github-url\": \"^1.0.2\",\n        \"remote-origin-url\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.8\"\n      }\n    },\n    \"node_modules/github-from-package\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz\",\n      \"integrity\": \"sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==\"\n    },\n    \"node_modules/github-slugger\": {\n      \"version\": \"1.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz\",\n      \"integrity\": \"sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==\"\n    },\n    \"node_modules/glob\": {\n      \"version\": \"10.3.12\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-10.3.12.tgz\",\n      \"integrity\": \"sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==\",\n      \"dependencies\": {\n        \"foreground-child\": \"^3.1.0\",\n        \"jackspeak\": \"^2.3.6\",\n        \"minimatch\": \"^9.0.1\",\n        \"minipass\": \"^7.0.4\",\n        \"path-scurry\": \"^1.10.2\"\n      },\n      \"bin\": {\n        \"glob\": \"dist/esm/bin.mjs\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/glob-parent\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz\",\n      \"integrity\": \"sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"is-glob\": \"^4.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/glob-to-regexp\": {\n      \"version\": \"0.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz\",\n      \"integrity\": \"sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==\",\n      \"dev\": true\n    },\n    \"node_modules/glob/node_modules/brace-expansion\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz\",\n      \"integrity\": \"sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==\",\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/glob/node_modules/minimatch\": {\n      \"version\": \"9.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz\",\n      \"integrity\": \"sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==\",\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/global-agent\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz\",\n      \"integrity\": \"sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"boolean\": \"^3.0.1\",\n        \"es6-error\": \"^4.1.1\",\n        \"matcher\": \"^3.0.0\",\n        \"roarr\": \"^2.15.3\",\n        \"semver\": \"^7.3.2\",\n        \"serialize-error\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=10.0\"\n      }\n    },\n    \"node_modules/global-dirs\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz\",\n      \"integrity\": \"sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==\",\n      \"dependencies\": {\n        \"ini\": \"1.3.7\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/global-dirs/node_modules/ini\": {\n      \"version\": \"1.3.7\",\n      \"resolved\": \"https://registry.npmjs.org/ini/-/ini-1.3.7.tgz\",\n      \"integrity\": \"sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==\"\n    },\n    \"node_modules/global-modules\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz\",\n      \"integrity\": \"sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"global-prefix\": \"^1.0.1\",\n        \"is-windows\": \"^1.0.1\",\n        \"resolve-dir\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/global-prefix\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz\",\n      \"integrity\": \"sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"expand-tilde\": \"^2.0.2\",\n        \"homedir-polyfill\": \"^1.0.1\",\n        \"ini\": \"^1.3.4\",\n        \"is-windows\": \"^1.0.1\",\n        \"which\": \"^1.2.14\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/global-prefix/node_modules/which\": {\n      \"version\": \"1.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/which/-/which-1.3.1.tgz\",\n      \"integrity\": \"sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"isexe\": \"^2.0.0\"\n      },\n      \"bin\": {\n        \"which\": \"bin/which\"\n      }\n    },\n    \"node_modules/globals\": {\n      \"version\": \"11.12.0\",\n      \"resolved\": \"https://registry.npmjs.org/globals/-/globals-11.12.0.tgz\",\n      \"integrity\": \"sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/globalthis\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz\",\n      \"integrity\": \"sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==\",\n      \"devOptional\": true,\n      \"dependencies\": {\n        \"define-properties\": \"^1.1.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/globby\": {\n      \"version\": \"11.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/globby/-/globby-11.1.0.tgz\",\n      \"integrity\": \"sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"array-union\": \"^2.1.0\",\n        \"dir-glob\": \"^3.0.1\",\n        \"fast-glob\": \"^3.2.9\",\n        \"ignore\": \"^5.2.0\",\n        \"merge2\": \"^1.4.1\",\n        \"slash\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/globule\": {\n      \"version\": \"1.3.4\",\n      \"resolved\": \"https://registry.npmjs.org/globule/-/globule-1.3.4.tgz\",\n      \"integrity\": \"sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"glob\": \"~7.1.1\",\n        \"lodash\": \"^4.17.21\",\n        \"minimatch\": \"~3.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.10\"\n      }\n    },\n    \"node_modules/globule/node_modules/glob\": {\n      \"version\": \"7.1.7\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-7.1.7.tgz\",\n      \"integrity\": \"sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"fs.realpath\": \"^1.0.0\",\n        \"inflight\": \"^1.0.4\",\n        \"inherits\": \"2\",\n        \"minimatch\": \"^3.0.4\",\n        \"once\": \"^1.3.0\",\n        \"path-is-absolute\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/globule/node_modules/minimatch\": {\n      \"version\": \"3.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz\",\n      \"integrity\": \"sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"brace-expansion\": \"^1.1.7\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/gopd\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz\",\n      \"integrity\": \"sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/got\": {\n      \"version\": \"11.8.6\",\n      \"resolved\": \"https://registry.npmjs.org/got/-/got-11.8.6.tgz\",\n      \"integrity\": \"sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==\",\n      \"dependencies\": {\n        \"@sindresorhus/is\": \"^4.0.0\",\n        \"@szmarczak/http-timer\": \"^4.0.5\",\n        \"@types/cacheable-request\": \"^6.0.1\",\n        \"@types/responselike\": \"^1.0.0\",\n        \"cacheable-lookup\": \"^5.0.3\",\n        \"cacheable-request\": \"^7.0.2\",\n        \"decompress-response\": \"^6.0.0\",\n        \"http2-wrapper\": \"^1.0.0-beta.5.2\",\n        \"lowercase-keys\": \"^2.0.0\",\n        \"p-cancelable\": \"^2.0.0\",\n        \"responselike\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10.19.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sindresorhus/got?sponsor=1\"\n      }\n    },\n    \"node_modules/got/node_modules/http2-wrapper\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz\",\n      \"integrity\": \"sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==\",\n      \"dependencies\": {\n        \"quick-lru\": \"^5.1.1\",\n        \"resolve-alpn\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10.19.0\"\n      }\n    },\n    \"node_modules/gpt\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/gpt/-/gpt-2.0.4.tgz\",\n      \"integrity\": \"sha512-gCibB52dZAjDeyuAJE158FfVYpMa8poCBMYvNXCwDvZJ0+5D0YpP1hZ/KYtWpQyXu18ddoQoqj+FGnbyq2qhKw==\",\n      \"dependencies\": {\n        \"cyclic-32\": \"^1.1.0\"\n      }\n    },\n    \"node_modules/graceful-fs\": {\n      \"version\": \"4.2.11\",\n      \"resolved\": \"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz\",\n      \"integrity\": \"sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==\"\n    },\n    \"node_modules/grapheme-splitter\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz\",\n      \"integrity\": \"sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==\",\n      \"dev\": true\n    },\n    \"node_modules/graphemer\": {\n      \"version\": \"1.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz\",\n      \"integrity\": \"sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==\",\n      \"dev\": true\n    },\n    \"node_modules/graphlib\": {\n      \"version\": \"2.1.8\",\n      \"resolved\": \"https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz\",\n      \"integrity\": \"sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==\",\n      \"dependencies\": {\n        \"lodash\": \"^4.17.15\"\n      }\n    },\n    \"node_modules/grommet\": {\n      \"version\": \"2.18.0\",\n      \"resolved\": \"https://registry.npmjs.org/grommet/-/grommet-2.18.0.tgz\",\n      \"integrity\": \"sha512-e7w3EJT2+TkJEHa+lB2BWcPbOixVk3X6hUl0hxRITMVqEFyjzU5NY5dzoRs50uMtHF4/tksyBWOKyvdsjJwMVg==\",\n      \"dependencies\": {\n        \"grommet-icons\": \"^4.6.2\",\n        \"hoist-non-react-statics\": \"^3.2.0\",\n        \"markdown-to-jsx\": \"^7.1.3\",\n        \"prop-types\": \"^15.7.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 12\"\n      },\n      \"peerDependencies\": {\n        \"react\": \"^16.6.1 || ^17.0.0\",\n        \"react-dom\": \"^16.6.1 || ^17.0.0\",\n        \"styled-components\": \">= 5.1\"\n      }\n    },\n    \"node_modules/grommet-icons\": {\n      \"version\": \"4.12.1\",\n      \"resolved\": \"https://registry.npmjs.org/grommet-icons/-/grommet-icons-4.12.1.tgz\",\n      \"integrity\": \"sha512-LhOP6BkDAGiSNcUOfsGGRo+AKD6zWOXeNeusY1WYvKplAR6mKCAQfH7Nig2Buc/v5zadKSko2NDtCQqwJaME0Q==\",\n      \"peerDependencies\": {\n        \"react\": \"^16.6.0 || ^17.0.0 || ^18.0.0\",\n        \"react-dom\": \"^16.6.0 || ^17.0.0 || ^18.0.0\",\n        \"styled-components\": \">= 5.x\"\n      }\n    },\n    \"node_modules/gzip-stream\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/gzip-stream/-/gzip-stream-2.0.0.tgz\",\n      \"integrity\": \"sha512-Vf5SFUMy6NMJ0zyBHSdBnN8XfNvNBfW+0mnNdsnB65KhCxDY7G8BTTdKqgxuET/bxzHPa0us25I2z6Lqw/YsTg==\",\n      \"dependencies\": {\n        \"@balena/node-crc-utils\": \"^3.0.0\",\n        \"combined-stream\": \"^1.0.8\",\n        \"crc32-stream\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/handle-thing\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz\",\n      \"integrity\": \"sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==\",\n      \"dev\": true\n    },\n    \"node_modules/has\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/has/-/has-1.0.4.tgz\",\n      \"integrity\": \"sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.4.0\"\n      }\n    },\n    \"node_modules/has-ansi\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz\",\n      \"integrity\": \"sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/has-ansi/node_modules/ansi-regex\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz\",\n      \"integrity\": \"sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/has-bigints\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz\",\n      \"integrity\": \"sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==\",\n      \"dev\": true,\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/has-flag\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz\",\n      \"integrity\": \"sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/has-own-prop\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz\",\n      \"integrity\": \"sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/has-property-descriptors\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz\",\n      \"integrity\": \"sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==\",\n      \"dependencies\": {\n        \"es-define-property\": \"^1.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/has-proto\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz\",\n      \"integrity\": \"sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/has-symbols\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz\",\n      \"integrity\": \"sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/has-tostringtag\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz\",\n      \"integrity\": \"sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==\",\n      \"dependencies\": {\n        \"has-symbols\": \"^1.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/has-yarn\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz\",\n      \"integrity\": \"sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/hasown\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz\",\n      \"integrity\": \"sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==\",\n      \"dependencies\": {\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/hast-to-hyperscript\": {\n      \"version\": \"9.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz\",\n      \"integrity\": \"sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==\",\n      \"dependencies\": {\n        \"@types/unist\": \"^2.0.3\",\n        \"comma-separated-tokens\": \"^1.0.0\",\n        \"property-information\": \"^5.3.0\",\n        \"space-separated-tokens\": \"^1.0.0\",\n        \"style-to-object\": \"^0.3.0\",\n        \"unist-util-is\": \"^4.0.0\",\n        \"web-namespaces\": \"^1.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/hast-util-from-parse5\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz\",\n      \"integrity\": \"sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==\",\n      \"dependencies\": {\n        \"@types/parse5\": \"^5.0.0\",\n        \"hastscript\": \"^6.0.0\",\n        \"property-information\": \"^5.0.0\",\n        \"vfile\": \"^4.0.0\",\n        \"vfile-location\": \"^3.2.0\",\n        \"web-namespaces\": \"^1.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/hast-util-has-property\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-1.0.4.tgz\",\n      \"integrity\": \"sha512-ghHup2voGfgFoHMGnaLHOjbYFACKrRh9KFttdCzMCbFoBMJXiNi2+XTrPP8+q6cDJM/RSqlCfVWrjp1H201rZg==\",\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/hast-util-heading-rank\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-1.0.1.tgz\",\n      \"integrity\": \"sha512-P6Hq7RCky9syMevlrN90QWpqWDXCxwIVOfQR2rK6P4GpY4bqjKEuCzoWSRORZ7vz+VgRpLnXimh+mkwvVFjbyQ==\",\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/hast-util-parse-selector\": {\n      \"version\": \"2.2.5\",\n      \"resolved\": \"https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz\",\n      \"integrity\": \"sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==\",\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/hast-util-raw\": {\n      \"version\": \"6.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.1.0.tgz\",\n      \"integrity\": \"sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ==\",\n      \"dependencies\": {\n        \"@types/hast\": \"^2.0.0\",\n        \"hast-util-from-parse5\": \"^6.0.0\",\n        \"hast-util-to-parse5\": \"^6.0.0\",\n        \"html-void-elements\": \"^1.0.0\",\n        \"parse5\": \"^6.0.0\",\n        \"unist-util-position\": \"^3.0.0\",\n        \"unist-util-visit\": \"^2.0.0\",\n        \"vfile\": \"^4.0.0\",\n        \"web-namespaces\": \"^1.0.0\",\n        \"xtend\": \"^4.0.0\",\n        \"zwitch\": \"^1.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/hast-util-sanitize\": {\n      \"version\": \"3.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-3.0.2.tgz\",\n      \"integrity\": \"sha512-+2I0x2ZCAyiZOO/sb4yNLFmdwPBnyJ4PBkVTUMKMqBwYNA+lXSgOmoRXlJFazoyid9QPogRRKgKhVEodv181sA==\",\n      \"dependencies\": {\n        \"xtend\": \"^4.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/hast-util-to-parse5\": {\n      \"version\": \"6.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz\",\n      \"integrity\": \"sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==\",\n      \"dependencies\": {\n        \"hast-to-hyperscript\": \"^9.0.0\",\n        \"property-information\": \"^5.0.0\",\n        \"web-namespaces\": \"^1.0.0\",\n        \"xtend\": \"^4.0.0\",\n        \"zwitch\": \"^1.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/hast-util-to-string\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-1.0.4.tgz\",\n      \"integrity\": \"sha512-eK0MxRX47AV2eZ+Lyr18DCpQgodvaS3fAQO2+b9Two9F5HEoRPhiUMNzoXArMJfZi2yieFzUBMRl3HNJ3Jus3w==\",\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/hastscript\": {\n      \"version\": \"6.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz\",\n      \"integrity\": \"sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==\",\n      \"dependencies\": {\n        \"@types/hast\": \"^2.0.0\",\n        \"comma-separated-tokens\": \"^1.0.0\",\n        \"hast-util-parse-selector\": \"^2.0.0\",\n        \"property-information\": \"^5.0.0\",\n        \"space-separated-tokens\": \"^1.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/he\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/he/-/he-1.2.0.tgz\",\n      \"integrity\": \"sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==\",\n      \"dev\": true,\n      \"bin\": {\n        \"he\": \"bin/he\"\n      }\n    },\n    \"node_modules/hoist-non-react-statics\": {\n      \"version\": \"3.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz\",\n      \"integrity\": \"sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==\",\n      \"dependencies\": {\n        \"react-is\": \"^16.7.0\"\n      }\n    },\n    \"node_modules/hoist-non-react-statics/node_modules/react-is\": {\n      \"version\": \"16.13.1\",\n      \"resolved\": \"https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz\",\n      \"integrity\": \"sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==\"\n    },\n    \"node_modules/homedir-polyfill\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz\",\n      \"integrity\": \"sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==\",\n      \"dependencies\": {\n        \"parse-passwd\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/hosted-git-info\": {\n      \"version\": \"7.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz\",\n      \"integrity\": \"sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"lru-cache\": \"^10.0.1\"\n      },\n      \"engines\": {\n        \"node\": \"^16.14.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/hosted-git-info/node_modules/lru-cache\": {\n      \"version\": \"10.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.1.tgz\",\n      \"integrity\": \"sha512-tS24spDe/zXhWbNPErCHs/AGOzbKGHT+ybSBqmdLm8WZ1xXLWvH8Qn71QPAlqVhd0qUTWjy+Kl9JmISgDdEjsA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"14 || >=16.14\"\n      }\n    },\n    \"node_modules/hpack.js\": {\n      \"version\": \"2.1.6\",\n      \"resolved\": \"https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz\",\n      \"integrity\": \"sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"inherits\": \"^2.0.1\",\n        \"obuf\": \"^1.0.0\",\n        \"readable-stream\": \"^2.0.1\",\n        \"wbuf\": \"^1.1.0\"\n      }\n    },\n    \"node_modules/hpack.js/node_modules/isarray\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz\",\n      \"integrity\": \"sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==\",\n      \"dev\": true\n    },\n    \"node_modules/hpack.js/node_modules/readable-stream\": {\n      \"version\": \"2.3.8\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz\",\n      \"integrity\": \"sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"core-util-is\": \"~1.0.0\",\n        \"inherits\": \"~2.0.3\",\n        \"isarray\": \"~1.0.0\",\n        \"process-nextick-args\": \"~2.0.0\",\n        \"safe-buffer\": \"~5.1.1\",\n        \"string_decoder\": \"~1.1.1\",\n        \"util-deprecate\": \"~1.0.1\"\n      }\n    },\n    \"node_modules/hpack.js/node_modules/safe-buffer\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz\",\n      \"integrity\": \"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==\",\n      \"dev\": true\n    },\n    \"node_modules/hpack.js/node_modules/string_decoder\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz\",\n      \"integrity\": \"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"safe-buffer\": \"~5.1.0\"\n      }\n    },\n    \"node_modules/html-entities\": {\n      \"version\": \"2.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz\",\n      \"integrity\": \"sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/mdevils\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://patreon.com/mdevils\"\n        }\n      ]\n    },\n    \"node_modules/html-minifier-terser\": {\n      \"version\": \"6.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz\",\n      \"integrity\": \"sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"camel-case\": \"^4.1.2\",\n        \"clean-css\": \"^5.2.2\",\n        \"commander\": \"^8.3.0\",\n        \"he\": \"^1.2.0\",\n        \"param-case\": \"^3.0.4\",\n        \"relateurl\": \"^0.2.7\",\n        \"terser\": \"^5.10.0\"\n      },\n      \"bin\": {\n        \"html-minifier-terser\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/html-minifier-terser/node_modules/commander\": {\n      \"version\": \"8.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-8.3.0.tgz\",\n      \"integrity\": \"sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 12\"\n      }\n    },\n    \"node_modules/html-parse-stringify\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz\",\n      \"integrity\": \"sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==\",\n      \"dependencies\": {\n        \"void-elements\": \"3.1.0\"\n      }\n    },\n    \"node_modules/html-void-elements\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz\",\n      \"integrity\": \"sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/html-webpack-plugin\": {\n      \"version\": \"5.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz\",\n      \"integrity\": \"sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/html-minifier-terser\": \"^6.0.0\",\n        \"html-minifier-terser\": \"^6.0.2\",\n        \"lodash\": \"^4.17.21\",\n        \"pretty-error\": \"^4.0.0\",\n        \"tapable\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10.13.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/html-webpack-plugin\"\n      },\n      \"peerDependencies\": {\n        \"@rspack/core\": \"0.x || 1.x\",\n        \"webpack\": \"^5.20.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"@rspack/core\": {\n          \"optional\": true\n        },\n        \"webpack\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/htmlparser2\": {\n      \"version\": \"6.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz\",\n      \"integrity\": \"sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==\",\n      \"dev\": true,\n      \"funding\": [\n        \"https://github.com/fb55/htmlparser2?sponsor=1\",\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/fb55\"\n        }\n      ],\n      \"dependencies\": {\n        \"domelementtype\": \"^2.0.1\",\n        \"domhandler\": \"^4.0.0\",\n        \"domutils\": \"^2.5.2\",\n        \"entities\": \"^2.0.0\"\n      }\n    },\n    \"node_modules/htmlparser2/node_modules/entities\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-2.2.0.tgz\",\n      \"integrity\": \"sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==\",\n      \"dev\": true,\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/http-cache-semantics\": {\n      \"version\": \"4.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz\",\n      \"integrity\": \"sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==\"\n    },\n    \"node_modules/http-deceiver\": {\n      \"version\": \"1.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz\",\n      \"integrity\": \"sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==\",\n      \"dev\": true\n    },\n    \"node_modules/http-errors\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz\",\n      \"integrity\": \"sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"depd\": \"2.0.0\",\n        \"inherits\": \"2.0.4\",\n        \"setprototypeof\": \"1.2.0\",\n        \"statuses\": \"2.0.1\",\n        \"toidentifier\": \"1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/http-parser-js\": {\n      \"version\": \"0.5.8\",\n      \"resolved\": \"https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz\",\n      \"integrity\": \"sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==\",\n      \"dev\": true\n    },\n    \"node_modules/http-proxy\": {\n      \"version\": \"1.18.1\",\n      \"resolved\": \"https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz\",\n      \"integrity\": \"sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"eventemitter3\": \"^4.0.0\",\n        \"follow-redirects\": \"^1.0.0\",\n        \"requires-port\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8.0.0\"\n      }\n    },\n    \"node_modules/http-proxy-agent\": {\n      \"version\": \"7.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz\",\n      \"integrity\": \"sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"agent-base\": \"^7.1.0\",\n        \"debug\": \"^4.3.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/http-proxy-middleware\": {\n      \"version\": \"2.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz\",\n      \"integrity\": \"sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/http-proxy\": \"^1.17.8\",\n        \"http-proxy\": \"^1.18.1\",\n        \"is-glob\": \"^4.0.1\",\n        \"is-plain-obj\": \"^3.0.0\",\n        \"micromatch\": \"^4.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=12.0.0\"\n      },\n      \"peerDependencies\": {\n        \"@types/express\": \"^4.17.13\"\n      },\n      \"peerDependenciesMeta\": {\n        \"@types/express\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/http-proxy-middleware/node_modules/is-plain-obj\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz\",\n      \"integrity\": \"sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/http-proxy/node_modules/eventemitter3\": {\n      \"version\": \"4.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz\",\n      \"integrity\": \"sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==\",\n      \"dev\": true\n    },\n    \"node_modules/http2-wrapper\": {\n      \"version\": \"2.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz\",\n      \"integrity\": \"sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==\",\n      \"dependencies\": {\n        \"quick-lru\": \"^5.1.1\",\n        \"resolve-alpn\": \"^1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10.19.0\"\n      }\n    },\n    \"node_modules/https-proxy-agent\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz\",\n      \"integrity\": \"sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"agent-base\": \"6\",\n        \"debug\": \"4\"\n      },\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/https-proxy-agent/node_modules/agent-base\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz\",\n      \"integrity\": \"sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"debug\": \"4\"\n      },\n      \"engines\": {\n        \"node\": \">= 6.0.0\"\n      }\n    },\n    \"node_modules/human-signals\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz\",\n      \"integrity\": \"sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=16.17.0\"\n      }\n    },\n    \"node_modules/humanize-ms\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz\",\n      \"integrity\": \"sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ms\": \"^2.0.0\"\n      }\n    },\n    \"node_modules/husky\": {\n      \"version\": \"8.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/husky/-/husky-8.0.3.tgz\",\n      \"integrity\": \"sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==\",\n      \"dev\": true,\n      \"bin\": {\n        \"husky\": \"lib/bin.js\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/typicode\"\n      }\n    },\n    \"node_modules/i18next\": {\n      \"version\": \"23.11.2\",\n      \"resolved\": \"https://registry.npmjs.org/i18next/-/i18next-23.11.2.tgz\",\n      \"integrity\": \"sha512-qMBm7+qT8jdpmmDw/kQD16VpmkL9BdL+XNAK5MNbNFaf1iQQq35ZbPrSlqmnNPOSUY4m342+c0t0evinF5l7sA==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://locize.com\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://locize.com/i18next.html\"\n        },\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project\"\n        }\n      ],\n      \"dependencies\": {\n        \"@babel/runtime\": \"^7.23.2\"\n      }\n    },\n    \"node_modules/iconv-lite\": {\n      \"version\": \"0.4.24\",\n      \"resolved\": \"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz\",\n      \"integrity\": \"sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==\",\n      \"dependencies\": {\n        \"safer-buffer\": \">= 2.1.2 < 3\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/icss-utils\": {\n      \"version\": \"5.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz\",\n      \"integrity\": \"sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^10 || ^12 || >= 14\"\n      },\n      \"peerDependencies\": {\n        \"postcss\": \"^8.1.0\"\n      }\n    },\n    \"node_modules/ieee754\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz\",\n      \"integrity\": \"sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ]\n    },\n    \"node_modules/ignore\": {\n      \"version\": \"5.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz\",\n      \"integrity\": \"sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 4\"\n      }\n    },\n    \"node_modules/image-size\": {\n      \"version\": \"0.7.5\",\n      \"resolved\": \"https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz\",\n      \"integrity\": \"sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"bin\": {\n        \"image-size\": \"bin/image-size.js\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/immediate\": {\n      \"version\": \"3.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz\",\n      \"integrity\": \"sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==\"\n    },\n    \"node_modules/immutable\": {\n      \"version\": \"3.8.2\",\n      \"resolved\": \"https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz\",\n      \"integrity\": \"sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/import-fresh\": {\n      \"version\": \"3.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz\",\n      \"integrity\": \"sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"parent-module\": \"^1.0.0\",\n        \"resolve-from\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/import-fresh/node_modules/resolve-from\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz\",\n      \"integrity\": \"sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/import-lazy\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz\",\n      \"integrity\": \"sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/import-meta-resolve\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz\",\n      \"integrity\": \"sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==\",\n      \"dev\": true,\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/imul\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/imul/-/imul-1.0.1.tgz\",\n      \"integrity\": \"sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/imurmurhash\": {\n      \"version\": \"0.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz\",\n      \"integrity\": \"sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==\",\n      \"engines\": {\n        \"node\": \">=0.8.19\"\n      }\n    },\n    \"node_modules/indent-string\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz\",\n      \"integrity\": \"sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/index-to-position\": {\n      \"version\": \"0.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.2.tgz\",\n      \"integrity\": \"sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/infer-owner\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz\",\n      \"integrity\": \"sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==\",\n      \"dev\": true,\n      \"license\": \"ISC\"\n    },\n    \"node_modules/inflight\": {\n      \"version\": \"1.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz\",\n      \"integrity\": \"sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==\",\n      \"dependencies\": {\n        \"once\": \"^1.3.0\",\n        \"wrappy\": \"1\"\n      }\n    },\n    \"node_modules/inherits\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz\",\n      \"integrity\": \"sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==\"\n    },\n    \"node_modules/ini\": {\n      \"version\": \"1.3.8\",\n      \"resolved\": \"https://registry.npmjs.org/ini/-/ini-1.3.8.tgz\",\n      \"integrity\": \"sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==\"\n    },\n    \"node_modules/inline-style-parser\": {\n      \"version\": \"0.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz\",\n      \"integrity\": \"sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==\"\n    },\n    \"node_modules/inquirer\": {\n      \"version\": \"9.2.12\",\n      \"resolved\": \"https://registry.npmjs.org/inquirer/-/inquirer-9.2.12.tgz\",\n      \"integrity\": \"sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@ljharb/through\": \"^2.3.11\",\n        \"ansi-escapes\": \"^4.3.2\",\n        \"chalk\": \"^5.3.0\",\n        \"cli-cursor\": \"^3.1.0\",\n        \"cli-width\": \"^4.1.0\",\n        \"external-editor\": \"^3.1.0\",\n        \"figures\": \"^5.0.0\",\n        \"lodash\": \"^4.17.21\",\n        \"mute-stream\": \"1.0.0\",\n        \"ora\": \"^5.4.1\",\n        \"run-async\": \"^3.0.0\",\n        \"rxjs\": \"^7.8.1\",\n        \"string-width\": \"^4.2.3\",\n        \"strip-ansi\": \"^6.0.1\",\n        \"wrap-ansi\": \"^6.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14.18.0\"\n      }\n    },\n    \"node_modules/inquirer/node_modules/chalk\": {\n      \"version\": \"5.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz\",\n      \"integrity\": \"sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.17.0 || ^14.13 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/chalk?sponsor=1\"\n      }\n    },\n    \"node_modules/inquirer/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/internal-slot\": {\n      \"version\": \"1.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz\",\n      \"integrity\": \"sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"hasown\": \"^2.0.0\",\n        \"side-channel\": \"^1.0.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/internmap\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz\",\n      \"integrity\": \"sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==\",\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/interpret\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz\",\n      \"integrity\": \"sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=10.13.0\"\n      }\n    },\n    \"node_modules/into-stream\": {\n      \"version\": \"6.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz\",\n      \"integrity\": \"sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"from2\": \"^2.3.0\",\n        \"p-is-promise\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/invariant\": {\n      \"version\": \"2.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz\",\n      \"integrity\": \"sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==\",\n      \"dependencies\": {\n        \"loose-envify\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/ip-address\": {\n      \"version\": \"9.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz\",\n      \"integrity\": \"sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"jsbn\": \"1.1.0\",\n        \"sprintf-js\": \"^1.1.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 12\"\n      }\n    },\n    \"node_modules/ipaddr.js\": {\n      \"version\": \"1.9.1\",\n      \"resolved\": \"https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz\",\n      \"integrity\": \"sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.10\"\n      }\n    },\n    \"node_modules/is-alphabetical\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz\",\n      \"integrity\": \"sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/is-alphanumerical\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz\",\n      \"integrity\": \"sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==\",\n      \"dependencies\": {\n        \"is-alphabetical\": \"^1.0.0\",\n        \"is-decimal\": \"^1.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/is-array-buffer\": {\n      \"version\": \"3.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz\",\n      \"integrity\": \"sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.2\",\n        \"get-intrinsic\": \"^1.2.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-arrayish\": {\n      \"version\": \"0.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz\",\n      \"integrity\": \"sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==\",\n      \"dev\": true\n    },\n    \"node_modules/is-async-function\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz\",\n      \"integrity\": \"sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"has-tostringtag\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-bigint\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz\",\n      \"integrity\": \"sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"has-bigints\": \"^1.0.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-binary-path\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz\",\n      \"integrity\": \"sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"binary-extensions\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/is-boolean-object\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz\",\n      \"integrity\": \"sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.2\",\n        \"has-tostringtag\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-buffer\": {\n      \"version\": \"2.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz\",\n      \"integrity\": \"sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/is-builtin-module\": {\n      \"version\": \"3.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz\",\n      \"integrity\": \"sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"builtin-modules\": \"^3.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/is-callable\": {\n      \"version\": \"1.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz\",\n      \"integrity\": \"sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-ci\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz\",\n      \"integrity\": \"sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==\",\n      \"dependencies\": {\n        \"ci-info\": \"^2.0.0\"\n      },\n      \"bin\": {\n        \"is-ci\": \"bin.js\"\n      }\n    },\n    \"node_modules/is-ci/node_modules/ci-info\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz\",\n      \"integrity\": \"sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==\"\n    },\n    \"node_modules/is-core-module\": {\n      \"version\": \"2.9.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz\",\n      \"integrity\": \"sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"has\": \"^1.0.3\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-data-view\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz\",\n      \"integrity\": \"sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"is-typed-array\": \"^1.1.13\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-date-object\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz\",\n      \"integrity\": \"sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"has-tostringtag\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-decimal\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz\",\n      \"integrity\": \"sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/is-directory\": {\n      \"version\": \"0.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz\",\n      \"integrity\": \"sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/is-docker\": {\n      \"version\": \"2.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz\",\n      \"integrity\": \"sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==\",\n      \"dev\": true,\n      \"bin\": {\n        \"is-docker\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/is-extendable\": {\n      \"version\": \"0.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz\",\n      \"integrity\": \"sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/is-extglob\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz\",\n      \"integrity\": \"sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/is-finalizationregistry\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz\",\n      \"integrity\": \"sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.2\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-fullwidth-code-point\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz\",\n      \"integrity\": \"sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/is-generator-function\": {\n      \"version\": \"1.0.10\",\n      \"resolved\": \"https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz\",\n      \"integrity\": \"sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"has-tostringtag\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-glob\": {\n      \"version\": \"4.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz\",\n      \"integrity\": \"sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"is-extglob\": \"^2.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/is-hexadecimal\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz\",\n      \"integrity\": \"sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/is-installed-globally\": {\n      \"version\": \"0.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz\",\n      \"integrity\": \"sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==\",\n      \"dependencies\": {\n        \"global-dirs\": \"^2.0.1\",\n        \"is-path-inside\": \"^3.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/is-interactive\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz\",\n      \"integrity\": \"sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/is-lambda\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz\",\n      \"integrity\": \"sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/is-map\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz\",\n      \"integrity\": \"sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-my-ip-valid\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.1.tgz\",\n      \"integrity\": \"sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/is-my-json-valid\": {\n      \"version\": \"2.20.6\",\n      \"resolved\": \"https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.6.tgz\",\n      \"integrity\": \"sha512-1JQwulVNjx8UqkPE/bqDaxtH4PXCe/2VRh/y3p99heOV87HG4Id5/VfDswd+YiAfHcRTfDlWgISycnHuhZq1aw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"generate-function\": \"^2.0.0\",\n        \"generate-object-property\": \"^1.1.0\",\n        \"is-my-ip-valid\": \"^1.0.0\",\n        \"jsonpointer\": \"^5.0.0\",\n        \"xtend\": \"^4.0.0\"\n      }\n    },\n    \"node_modules/is-negative-zero\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz\",\n      \"integrity\": \"sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-npm\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz\",\n      \"integrity\": \"sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/is-number\": {\n      \"version\": \"7.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz\",\n      \"integrity\": \"sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.12.0\"\n      }\n    },\n    \"node_modules/is-number-object\": {\n      \"version\": \"1.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz\",\n      \"integrity\": \"sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"has-tostringtag\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-obj\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz\",\n      \"integrity\": \"sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/is-path-inside\": {\n      \"version\": \"3.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz\",\n      \"integrity\": \"sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/is-plain-obj\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz\",\n      \"integrity\": \"sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/is-plain-object\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz\",\n      \"integrity\": \"sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"isobject\": \"^3.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/is-promise\": {\n      \"version\": \"2.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz\",\n      \"integrity\": \"sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==\"\n    },\n    \"node_modules/is-property\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz\",\n      \"integrity\": \"sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/is-redirect\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz\",\n      \"integrity\": \"sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/is-regex\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz\",\n      \"integrity\": \"sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.2\",\n        \"has-tostringtag\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-retry-allowed\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz\",\n      \"integrity\": \"sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/is-set\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz\",\n      \"integrity\": \"sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-shared-array-buffer\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz\",\n      \"integrity\": \"sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.7\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-stream\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz\",\n      \"integrity\": \"sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/is-string\": {\n      \"version\": \"1.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz\",\n      \"integrity\": \"sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"has-tostringtag\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-symbol\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz\",\n      \"integrity\": \"sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"has-symbols\": \"^1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-typed-array\": {\n      \"version\": \"1.1.13\",\n      \"resolved\": \"https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz\",\n      \"integrity\": \"sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"which-typed-array\": \"^1.1.14\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-typedarray\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz\",\n      \"integrity\": \"sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==\"\n    },\n    \"node_modules/is-unicode-supported\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz\",\n      \"integrity\": \"sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/is-weakmap\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz\",\n      \"integrity\": \"sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-weakref\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz\",\n      \"integrity\": \"sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.2\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-weakset\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz\",\n      \"integrity\": \"sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.7\",\n        \"get-intrinsic\": \"^1.2.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-whitespace-character\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz\",\n      \"integrity\": \"sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/is-windows\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz\",\n      \"integrity\": \"sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/is-word-character\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz\",\n      \"integrity\": \"sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/is-wsl\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz\",\n      \"integrity\": \"sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"is-docker\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/is-yarn-global\": {\n      \"version\": \"0.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz\",\n      \"integrity\": \"sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==\"\n    },\n    \"node_modules/isarray\": {\n      \"version\": \"2.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz\",\n      \"integrity\": \"sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==\",\n      \"dev\": true\n    },\n    \"node_modules/isbinaryfile\": {\n      \"version\": \"4.0.10\",\n      \"resolved\": \"https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz\",\n      \"integrity\": \"sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 8.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/gjtorikian/\"\n      }\n    },\n    \"node_modules/isexe\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz\",\n      \"integrity\": \"sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==\"\n    },\n    \"node_modules/isobject\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz\",\n      \"integrity\": \"sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/iterator.prototype\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz\",\n      \"integrity\": \"sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"define-properties\": \"^1.2.1\",\n        \"get-intrinsic\": \"^1.2.1\",\n        \"has-symbols\": \"^1.0.3\",\n        \"reflect.getprototypeof\": \"^1.0.4\",\n        \"set-function-name\": \"^2.0.1\"\n      }\n    },\n    \"node_modules/jackspeak\": {\n      \"version\": \"2.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz\",\n      \"integrity\": \"sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==\",\n      \"dependencies\": {\n        \"@isaacs/cliui\": \"^8.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      },\n      \"optionalDependencies\": {\n        \"@pkgjs/parseargs\": \"^0.11.0\"\n      }\n    },\n    \"node_modules/jake\": {\n      \"version\": \"10.8.7\",\n      \"resolved\": \"https://registry.npmjs.org/jake/-/jake-10.8.7.tgz\",\n      \"integrity\": \"sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"async\": \"^3.2.3\",\n        \"chalk\": \"^4.0.2\",\n        \"filelist\": \"^1.0.4\",\n        \"minimatch\": \"^3.1.2\"\n      },\n      \"bin\": {\n        \"jake\": \"bin/cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/jake/node_modules/async\": {\n      \"version\": \"3.2.5\",\n      \"resolved\": \"https://registry.npmjs.org/async/-/async-3.2.5.tgz\",\n      \"integrity\": \"sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==\",\n      \"dev\": true\n    },\n    \"node_modules/jest-diff\": {\n      \"version\": \"29.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz\",\n      \"integrity\": \"sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"chalk\": \"^4.0.0\",\n        \"diff-sequences\": \"^29.6.3\",\n        \"jest-get-type\": \"^29.6.3\",\n        \"pretty-format\": \"^29.7.0\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/jest-get-type\": {\n      \"version\": \"29.6.3\",\n      \"resolved\": \"https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz\",\n      \"integrity\": \"sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/jest-matcher-utils\": {\n      \"version\": \"29.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz\",\n      \"integrity\": \"sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"chalk\": \"^4.0.0\",\n        \"jest-diff\": \"^29.7.0\",\n        \"jest-get-type\": \"^29.6.3\",\n        \"pretty-format\": \"^29.7.0\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/jest-message-util\": {\n      \"version\": \"29.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz\",\n      \"integrity\": \"sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/code-frame\": \"^7.12.13\",\n        \"@jest/types\": \"^29.6.3\",\n        \"@types/stack-utils\": \"^2.0.0\",\n        \"chalk\": \"^4.0.0\",\n        \"graceful-fs\": \"^4.2.9\",\n        \"micromatch\": \"^4.0.4\",\n        \"pretty-format\": \"^29.7.0\",\n        \"slash\": \"^3.0.0\",\n        \"stack-utils\": \"^2.0.3\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/jest-util\": {\n      \"version\": \"29.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz\",\n      \"integrity\": \"sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jest/types\": \"^29.6.3\",\n        \"@types/node\": \"*\",\n        \"chalk\": \"^4.0.0\",\n        \"ci-info\": \"^3.2.0\",\n        \"graceful-fs\": \"^4.2.9\",\n        \"picomatch\": \"^2.2.3\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/jest-worker\": {\n      \"version\": \"27.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz\",\n      \"integrity\": \"sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/node\": \"*\",\n        \"merge-stream\": \"^2.0.0\",\n        \"supports-color\": \"^8.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.13.0\"\n      }\n    },\n    \"node_modules/jest-worker/node_modules/supports-color\": {\n      \"version\": \"8.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz\",\n      \"integrity\": \"sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"has-flag\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/supports-color?sponsor=1\"\n      }\n    },\n    \"node_modules/jiti\": {\n      \"version\": \"2.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz\",\n      \"integrity\": \"sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"jiti\": \"lib/jiti-cli.mjs\"\n      }\n    },\n    \"node_modules/js-tokens\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n      \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\"\n    },\n    \"node_modules/js-yaml\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz\",\n      \"integrity\": \"sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==\",\n      \"dependencies\": {\n        \"argparse\": \"^2.0.1\"\n      },\n      \"bin\": {\n        \"js-yaml\": \"bin/js-yaml.js\"\n      }\n    },\n    \"node_modules/jsbn\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz\",\n      \"integrity\": \"sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==\",\n      \"dev\": true\n    },\n    \"node_modules/jsdoc-type-pratt-parser\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz\",\n      \"integrity\": \"sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12.0.0\"\n      }\n    },\n    \"node_modules/jsesc\": {\n      \"version\": \"2.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz\",\n      \"integrity\": \"sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==\",\n      \"bin\": {\n        \"jsesc\": \"bin/jsesc\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/json-buffer\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz\",\n      \"integrity\": \"sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==\"\n    },\n    \"node_modules/json-e\": {\n      \"version\": \"4.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/json-e/-/json-e-4.7.0.tgz\",\n      \"integrity\": \"sha512-0Ep2/T5qXy2sKAj/pZ5swxd8ktfW6Rqc5T4Lu3KvF5UhNnFhbogNpb1OCADfg0/yrShNg2Cop/MV1RQ1UvVg4Q==\",\n      \"dependencies\": {\n        \"json-stable-stringify-without-jsonify\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/json-parse-even-better-errors\": {\n      \"version\": \"2.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz\",\n      \"integrity\": \"sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==\",\n      \"dev\": true\n    },\n    \"node_modules/json-schema-compare\": {\n      \"version\": \"0.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz\",\n      \"integrity\": \"sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==\",\n      \"dependencies\": {\n        \"lodash\": \"^4.17.4\"\n      }\n    },\n    \"node_modules/json-schema-faker\": {\n      \"version\": \"0.5.6\",\n      \"resolved\": \"https://registry.npmjs.org/json-schema-faker/-/json-schema-faker-0.5.6.tgz\",\n      \"integrity\": \"sha512-u/cFC26/GDxh2vPiAC8B8xVvpXAW+QYtG2mijEbKrimCk8IHtiwQBjCE8TwvowdhALWq9IcdIWZ+/8ocXvdL3Q==\",\n      \"dependencies\": {\n        \"json-schema-ref-parser\": \"^6.1.0\",\n        \"jsonpath-plus\": \"^7.2.0\"\n      },\n      \"bin\": {\n        \"jsf\": \"bin/gen.cjs\"\n      }\n    },\n    \"node_modules/json-schema-merge-allof\": {\n      \"version\": \"0.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/json-schema-merge-allof/-/json-schema-merge-allof-0.6.0.tgz\",\n      \"integrity\": \"sha512-LEw4VMQVRceOPLuGRWcxW5orTTiR9ZAtqTAe4rQUjNADTeR81bezBVFa0MqIwp0YmHIM1KkhSjZM7o+IQhaPbQ==\",\n      \"dependencies\": {\n        \"compute-lcm\": \"^1.1.0\",\n        \"json-schema-compare\": \"^0.2.2\",\n        \"lodash\": \"^4.17.4\"\n      }\n    },\n    \"node_modules/json-schema-ref-parser\": {\n      \"version\": \"6.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-6.1.0.tgz\",\n      \"integrity\": \"sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw==\",\n      \"deprecated\": \"Please switch to @apidevtools/json-schema-ref-parser\",\n      \"dependencies\": {\n        \"call-me-maybe\": \"^1.0.1\",\n        \"js-yaml\": \"^3.12.1\",\n        \"ono\": \"^4.0.11\"\n      }\n    },\n    \"node_modules/json-schema-ref-parser/node_modules/argparse\": {\n      \"version\": \"1.0.10\",\n      \"resolved\": \"https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz\",\n      \"integrity\": \"sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==\",\n      \"dependencies\": {\n        \"sprintf-js\": \"~1.0.2\"\n      }\n    },\n    \"node_modules/json-schema-ref-parser/node_modules/js-yaml\": {\n      \"version\": \"3.14.1\",\n      \"resolved\": \"https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz\",\n      \"integrity\": \"sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==\",\n      \"dependencies\": {\n        \"argparse\": \"^1.0.7\",\n        \"esprima\": \"^4.0.0\"\n      },\n      \"bin\": {\n        \"js-yaml\": \"bin/js-yaml.js\"\n      }\n    },\n    \"node_modules/json-schema-ref-parser/node_modules/sprintf-js\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz\",\n      \"integrity\": \"sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==\"\n    },\n    \"node_modules/json-schema-traverse\": {\n      \"version\": \"0.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz\",\n      \"integrity\": \"sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==\"\n    },\n    \"node_modules/json-stable-stringify-without-jsonify\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz\",\n      \"integrity\": \"sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==\"\n    },\n    \"node_modules/json-stringify-safe\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz\",\n      \"integrity\": \"sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==\",\n      \"optional\": true\n    },\n    \"node_modules/json5\": {\n      \"version\": \"2.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/json5/-/json5-2.2.3.tgz\",\n      \"integrity\": \"sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==\",\n      \"bin\": {\n        \"json5\": \"lib/cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/jsonfile\": {\n      \"version\": \"6.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz\",\n      \"integrity\": \"sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==\",\n      \"dependencies\": {\n        \"universalify\": \"^2.0.0\"\n      },\n      \"optionalDependencies\": {\n        \"graceful-fs\": \"^4.1.6\"\n      }\n    },\n    \"node_modules/jsonpath-plus\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz\",\n      \"integrity\": \"sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==\",\n      \"engines\": {\n        \"node\": \">=12.0.0\"\n      }\n    },\n    \"node_modules/jsonpointer\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz\",\n      \"integrity\": \"sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/jsx-ast-utils\": {\n      \"version\": \"3.3.5\",\n      \"resolved\": \"https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz\",\n      \"integrity\": \"sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"array-includes\": \"^3.1.6\",\n        \"array.prototype.flat\": \"^1.3.1\",\n        \"object.assign\": \"^4.1.4\",\n        \"object.values\": \"^1.1.6\"\n      },\n      \"engines\": {\n        \"node\": \">=4.0\"\n      }\n    },\n    \"node_modules/junk\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/junk/-/junk-3.1.0.tgz\",\n      \"integrity\": \"sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/just-extend\": {\n      \"version\": \"6.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz\",\n      \"integrity\": \"sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==\",\n      \"dev\": true\n    },\n    \"node_modules/kdbush\": {\n      \"version\": \"4.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz\",\n      \"integrity\": \"sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==\"\n    },\n    \"node_modules/keyv\": {\n      \"version\": \"4.5.4\",\n      \"resolved\": \"https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz\",\n      \"integrity\": \"sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==\",\n      \"dependencies\": {\n        \"json-buffer\": \"3.0.1\"\n      }\n    },\n    \"node_modules/khroma\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz\",\n      \"integrity\": \"sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==\"\n    },\n    \"node_modules/kind-of\": {\n      \"version\": \"6.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz\",\n      \"integrity\": \"sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/kleur\": {\n      \"version\": \"3.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz\",\n      \"integrity\": \"sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/ky\": {\n      \"version\": \"0.33.3\",\n      \"resolved\": \"https://registry.npmjs.org/ky/-/ky-0.33.3.tgz\",\n      \"integrity\": \"sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14.16\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sindresorhus/ky?sponsor=1\"\n      }\n    },\n    \"node_modules/latest-version\": {\n      \"version\": \"5.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz\",\n      \"integrity\": \"sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==\",\n      \"dependencies\": {\n        \"package-json\": \"^6.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/launch-editor\": {\n      \"version\": \"2.6.1\",\n      \"resolved\": \"https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz\",\n      \"integrity\": \"sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"picocolors\": \"^1.0.0\",\n        \"shell-quote\": \"^1.8.1\"\n      }\n    },\n    \"node_modules/lazy-val\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz\",\n      \"integrity\": \"sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==\"\n    },\n    \"node_modules/lazystream\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz\",\n      \"integrity\": \"sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"readable-stream\": \"^2.0.5\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6.3\"\n      }\n    },\n    \"node_modules/lazystream/node_modules/isarray\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz\",\n      \"integrity\": \"sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==\",\n      \"dev\": true\n    },\n    \"node_modules/lazystream/node_modules/readable-stream\": {\n      \"version\": \"2.3.8\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz\",\n      \"integrity\": \"sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"core-util-is\": \"~1.0.0\",\n        \"inherits\": \"~2.0.3\",\n        \"isarray\": \"~1.0.0\",\n        \"process-nextick-args\": \"~2.0.0\",\n        \"safe-buffer\": \"~5.1.1\",\n        \"string_decoder\": \"~1.1.1\",\n        \"util-deprecate\": \"~1.0.1\"\n      }\n    },\n    \"node_modules/lazystream/node_modules/safe-buffer\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz\",\n      \"integrity\": \"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==\",\n      \"dev\": true\n    },\n    \"node_modules/lazystream/node_modules/string_decoder\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz\",\n      \"integrity\": \"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"safe-buffer\": \"~5.1.0\"\n      }\n    },\n    \"node_modules/levn\": {\n      \"version\": \"0.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/levn/-/levn-0.4.1.tgz\",\n      \"integrity\": \"sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"prelude-ls\": \"^1.2.1\",\n        \"type-check\": \"~0.4.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/libnpx\": {\n      \"version\": \"10.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/libnpx/-/libnpx-10.2.4.tgz\",\n      \"integrity\": \"sha512-BPc0D1cOjBeS8VIBKUu5F80s6njm0wbVt7CsGMrIcJ+SI7pi7V0uVPGpEMH9H5L8csOcclTxAXFE2VAsJXUhfA==\",\n      \"dependencies\": {\n        \"dotenv\": \"^5.0.1\",\n        \"npm-package-arg\": \"^6.0.0\",\n        \"rimraf\": \"^2.6.2\",\n        \"safe-buffer\": \"^5.1.0\",\n        \"update-notifier\": \"^2.3.0\",\n        \"which\": \"^1.3.0\",\n        \"y18n\": \"^4.0.0\",\n        \"yargs\": \"^14.2.3\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/ansi-align\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz\",\n      \"integrity\": \"sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==\",\n      \"dependencies\": {\n        \"string-width\": \"^2.0.0\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/ansi-regex\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz\",\n      \"integrity\": \"sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/ansi-styles\": {\n      \"version\": \"3.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz\",\n      \"integrity\": \"sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==\",\n      \"dependencies\": {\n        \"color-convert\": \"^1.9.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/boxen\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz\",\n      \"integrity\": \"sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==\",\n      \"dependencies\": {\n        \"ansi-align\": \"^2.0.0\",\n        \"camelcase\": \"^4.0.0\",\n        \"chalk\": \"^2.0.1\",\n        \"cli-boxes\": \"^1.0.0\",\n        \"string-width\": \"^2.0.0\",\n        \"term-size\": \"^1.2.0\",\n        \"widest-line\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/camelcase\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz\",\n      \"integrity\": \"sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/chalk\": {\n      \"version\": \"2.4.2\",\n      \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz\",\n      \"integrity\": \"sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^3.2.1\",\n        \"escape-string-regexp\": \"^1.0.5\",\n        \"supports-color\": \"^5.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/ci-info\": {\n      \"version\": \"1.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz\",\n      \"integrity\": \"sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==\"\n    },\n    \"node_modules/libnpx/node_modules/cli-boxes\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz\",\n      \"integrity\": \"sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/cliui\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz\",\n      \"integrity\": \"sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==\",\n      \"dependencies\": {\n        \"string-width\": \"^3.1.0\",\n        \"strip-ansi\": \"^5.2.0\",\n        \"wrap-ansi\": \"^5.1.0\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/cliui/node_modules/ansi-regex\": {\n      \"version\": \"4.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz\",\n      \"integrity\": \"sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/cliui/node_modules/string-width\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz\",\n      \"integrity\": \"sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==\",\n      \"dependencies\": {\n        \"emoji-regex\": \"^7.0.1\",\n        \"is-fullwidth-code-point\": \"^2.0.0\",\n        \"strip-ansi\": \"^5.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/cliui/node_modules/strip-ansi\": {\n      \"version\": \"5.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz\",\n      \"integrity\": \"sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^4.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/color-convert\": {\n      \"version\": \"1.9.3\",\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz\",\n      \"integrity\": \"sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==\",\n      \"dependencies\": {\n        \"color-name\": \"1.1.3\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/color-name\": {\n      \"version\": \"1.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz\",\n      \"integrity\": \"sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==\"\n    },\n    \"node_modules/libnpx/node_modules/configstore\": {\n      \"version\": \"3.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz\",\n      \"integrity\": \"sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==\",\n      \"dependencies\": {\n        \"dot-prop\": \"^4.2.1\",\n        \"graceful-fs\": \"^4.1.2\",\n        \"make-dir\": \"^1.0.0\",\n        \"unique-string\": \"^1.0.0\",\n        \"write-file-atomic\": \"^2.0.0\",\n        \"xdg-basedir\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/cross-spawn\": {\n      \"version\": \"5.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz\",\n      \"integrity\": \"sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==\",\n      \"dependencies\": {\n        \"lru-cache\": \"^4.0.1\",\n        \"shebang-command\": \"^1.2.0\",\n        \"which\": \"^1.2.9\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/crypto-random-string\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz\",\n      \"integrity\": \"sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/decamelize\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz\",\n      \"integrity\": \"sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/dot-prop\": {\n      \"version\": \"4.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz\",\n      \"integrity\": \"sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==\",\n      \"dependencies\": {\n        \"is-obj\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/dotenv\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz\",\n      \"integrity\": \"sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==\",\n      \"engines\": {\n        \"node\": \">=4.6.0\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/emoji-regex\": {\n      \"version\": \"7.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz\",\n      \"integrity\": \"sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==\"\n    },\n    \"node_modules/libnpx/node_modules/escape-string-regexp\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz\",\n      \"integrity\": \"sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==\",\n      \"engines\": {\n        \"node\": \">=0.8.0\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/execa\": {\n      \"version\": \"0.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/execa/-/execa-0.7.0.tgz\",\n      \"integrity\": \"sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==\",\n      \"dependencies\": {\n        \"cross-spawn\": \"^5.0.1\",\n        \"get-stream\": \"^3.0.0\",\n        \"is-stream\": \"^1.1.0\",\n        \"npm-run-path\": \"^2.0.0\",\n        \"p-finally\": \"^1.0.0\",\n        \"signal-exit\": \"^3.0.0\",\n        \"strip-eof\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/find-up\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz\",\n      \"integrity\": \"sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==\",\n      \"dependencies\": {\n        \"locate-path\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/get-stream\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz\",\n      \"integrity\": \"sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/glob\": {\n      \"version\": \"7.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-7.2.3.tgz\",\n      \"integrity\": \"sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==\",\n      \"dependencies\": {\n        \"fs.realpath\": \"^1.0.0\",\n        \"inflight\": \"^1.0.4\",\n        \"inherits\": \"2\",\n        \"minimatch\": \"^3.1.1\",\n        \"once\": \"^1.3.0\",\n        \"path-is-absolute\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/global-dirs\": {\n      \"version\": \"0.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz\",\n      \"integrity\": \"sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==\",\n      \"dependencies\": {\n        \"ini\": \"^1.3.4\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/got\": {\n      \"version\": \"6.7.1\",\n      \"resolved\": \"https://registry.npmjs.org/got/-/got-6.7.1.tgz\",\n      \"integrity\": \"sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==\",\n      \"dependencies\": {\n        \"create-error-class\": \"^3.0.0\",\n        \"duplexer3\": \"^0.1.4\",\n        \"get-stream\": \"^3.0.0\",\n        \"is-redirect\": \"^1.0.0\",\n        \"is-retry-allowed\": \"^1.0.0\",\n        \"is-stream\": \"^1.0.0\",\n        \"lowercase-keys\": \"^1.0.0\",\n        \"safe-buffer\": \"^5.0.1\",\n        \"timed-out\": \"^4.0.0\",\n        \"unzip-response\": \"^2.0.1\",\n        \"url-parse-lax\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/has-flag\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz\",\n      \"integrity\": \"sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/is-ci\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz\",\n      \"integrity\": \"sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==\",\n      \"dependencies\": {\n        \"ci-info\": \"^1.5.0\"\n      },\n      \"bin\": {\n        \"is-ci\": \"bin.js\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/is-fullwidth-code-point\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz\",\n      \"integrity\": \"sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/is-installed-globally\": {\n      \"version\": \"0.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz\",\n      \"integrity\": \"sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==\",\n      \"dependencies\": {\n        \"global-dirs\": \"^0.1.0\",\n        \"is-path-inside\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/is-npm\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz\",\n      \"integrity\": \"sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/is-obj\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz\",\n      \"integrity\": \"sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/is-path-inside\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz\",\n      \"integrity\": \"sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==\",\n      \"dependencies\": {\n        \"path-is-inside\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/is-stream\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz\",\n      \"integrity\": \"sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/latest-version\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz\",\n      \"integrity\": \"sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==\",\n      \"dependencies\": {\n        \"package-json\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/locate-path\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz\",\n      \"integrity\": \"sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==\",\n      \"dependencies\": {\n        \"p-locate\": \"^3.0.0\",\n        \"path-exists\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/lowercase-keys\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz\",\n      \"integrity\": \"sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/lru-cache\": {\n      \"version\": \"4.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz\",\n      \"integrity\": \"sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==\",\n      \"dependencies\": {\n        \"pseudomap\": \"^1.0.2\",\n        \"yallist\": \"^2.1.2\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/make-dir\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz\",\n      \"integrity\": \"sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==\",\n      \"dependencies\": {\n        \"pify\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/npm-run-path\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz\",\n      \"integrity\": \"sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==\",\n      \"dependencies\": {\n        \"path-key\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/p-limit\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz\",\n      \"integrity\": \"sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==\",\n      \"dependencies\": {\n        \"p-try\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/p-locate\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz\",\n      \"integrity\": \"sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==\",\n      \"dependencies\": {\n        \"p-limit\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/p-try\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz\",\n      \"integrity\": \"sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/package-json\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz\",\n      \"integrity\": \"sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==\",\n      \"dependencies\": {\n        \"got\": \"^6.7.1\",\n        \"registry-auth-token\": \"^3.0.1\",\n        \"registry-url\": \"^3.0.3\",\n        \"semver\": \"^5.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/path-exists\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz\",\n      \"integrity\": \"sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/path-key\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz\",\n      \"integrity\": \"sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/pify\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/pify/-/pify-3.0.0.tgz\",\n      \"integrity\": \"sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/registry-auth-token\": {\n      \"version\": \"3.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz\",\n      \"integrity\": \"sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==\",\n      \"dependencies\": {\n        \"rc\": \"^1.1.6\",\n        \"safe-buffer\": \"^5.0.1\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/registry-url\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz\",\n      \"integrity\": \"sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==\",\n      \"dependencies\": {\n        \"rc\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/rimraf\": {\n      \"version\": \"2.7.1\",\n      \"resolved\": \"https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz\",\n      \"integrity\": \"sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==\",\n      \"dependencies\": {\n        \"glob\": \"^7.1.3\"\n      },\n      \"bin\": {\n        \"rimraf\": \"bin.js\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/semver\": {\n      \"version\": \"5.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-5.7.2.tgz\",\n      \"integrity\": \"sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==\",\n      \"bin\": {\n        \"semver\": \"bin/semver\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/semver-diff\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz\",\n      \"integrity\": \"sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==\",\n      \"dependencies\": {\n        \"semver\": \"^5.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/shebang-command\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz\",\n      \"integrity\": \"sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==\",\n      \"dependencies\": {\n        \"shebang-regex\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/shebang-regex\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz\",\n      \"integrity\": \"sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/signal-exit\": {\n      \"version\": \"3.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz\",\n      \"integrity\": \"sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==\"\n    },\n    \"node_modules/libnpx/node_modules/string-width\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz\",\n      \"integrity\": \"sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==\",\n      \"dependencies\": {\n        \"is-fullwidth-code-point\": \"^2.0.0\",\n        \"strip-ansi\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/strip-ansi\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz\",\n      \"integrity\": \"sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/supports-color\": {\n      \"version\": \"5.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz\",\n      \"integrity\": \"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==\",\n      \"dependencies\": {\n        \"has-flag\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/term-size\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz\",\n      \"integrity\": \"sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==\",\n      \"dependencies\": {\n        \"execa\": \"^0.7.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/unique-string\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz\",\n      \"integrity\": \"sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==\",\n      \"dependencies\": {\n        \"crypto-random-string\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/update-notifier\": {\n      \"version\": \"2.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz\",\n      \"integrity\": \"sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==\",\n      \"dependencies\": {\n        \"boxen\": \"^1.2.1\",\n        \"chalk\": \"^2.0.1\",\n        \"configstore\": \"^3.0.0\",\n        \"import-lazy\": \"^2.1.0\",\n        \"is-ci\": \"^1.0.10\",\n        \"is-installed-globally\": \"^0.1.0\",\n        \"is-npm\": \"^1.0.0\",\n        \"latest-version\": \"^3.0.0\",\n        \"semver-diff\": \"^2.0.0\",\n        \"xdg-basedir\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/which\": {\n      \"version\": \"1.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/which/-/which-1.3.1.tgz\",\n      \"integrity\": \"sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==\",\n      \"dependencies\": {\n        \"isexe\": \"^2.0.0\"\n      },\n      \"bin\": {\n        \"which\": \"bin/which\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/widest-line\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz\",\n      \"integrity\": \"sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==\",\n      \"dependencies\": {\n        \"string-width\": \"^2.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/wrap-ansi\": {\n      \"version\": \"5.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz\",\n      \"integrity\": \"sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^3.2.0\",\n        \"string-width\": \"^3.0.0\",\n        \"strip-ansi\": \"^5.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/wrap-ansi/node_modules/ansi-regex\": {\n      \"version\": \"4.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz\",\n      \"integrity\": \"sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/wrap-ansi/node_modules/string-width\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz\",\n      \"integrity\": \"sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==\",\n      \"dependencies\": {\n        \"emoji-regex\": \"^7.0.1\",\n        \"is-fullwidth-code-point\": \"^2.0.0\",\n        \"strip-ansi\": \"^5.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/wrap-ansi/node_modules/strip-ansi\": {\n      \"version\": \"5.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz\",\n      \"integrity\": \"sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^4.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/write-file-atomic\": {\n      \"version\": \"2.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz\",\n      \"integrity\": \"sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==\",\n      \"dependencies\": {\n        \"graceful-fs\": \"^4.1.11\",\n        \"imurmurhash\": \"^0.1.4\",\n        \"signal-exit\": \"^3.0.2\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/xdg-basedir\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz\",\n      \"integrity\": \"sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/yallist\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz\",\n      \"integrity\": \"sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==\"\n    },\n    \"node_modules/libnpx/node_modules/yargs\": {\n      \"version\": \"14.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz\",\n      \"integrity\": \"sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==\",\n      \"dependencies\": {\n        \"cliui\": \"^5.0.0\",\n        \"decamelize\": \"^1.2.0\",\n        \"find-up\": \"^3.0.0\",\n        \"get-caller-file\": \"^2.0.1\",\n        \"require-directory\": \"^2.1.1\",\n        \"require-main-filename\": \"^2.0.0\",\n        \"set-blocking\": \"^2.0.0\",\n        \"string-width\": \"^3.0.0\",\n        \"which-module\": \"^2.0.0\",\n        \"y18n\": \"^4.0.0\",\n        \"yargs-parser\": \"^15.0.1\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/yargs-parser\": {\n      \"version\": \"15.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz\",\n      \"integrity\": \"sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==\",\n      \"dependencies\": {\n        \"camelcase\": \"^5.0.0\",\n        \"decamelize\": \"^1.2.0\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/yargs-parser/node_modules/camelcase\": {\n      \"version\": \"5.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz\",\n      \"integrity\": \"sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/yargs/node_modules/ansi-regex\": {\n      \"version\": \"4.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz\",\n      \"integrity\": \"sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/yargs/node_modules/string-width\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz\",\n      \"integrity\": \"sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==\",\n      \"dependencies\": {\n        \"emoji-regex\": \"^7.0.1\",\n        \"is-fullwidth-code-point\": \"^2.0.0\",\n        \"strip-ansi\": \"^5.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/libnpx/node_modules/yargs/node_modules/strip-ansi\": {\n      \"version\": \"5.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz\",\n      \"integrity\": \"sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^4.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/lie\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/lie/-/lie-3.1.1.tgz\",\n      \"integrity\": \"sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==\",\n      \"dependencies\": {\n        \"immediate\": \"~3.0.5\"\n      }\n    },\n    \"node_modules/lines-and-columns\": {\n      \"version\": \"1.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz\",\n      \"integrity\": \"sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==\",\n      \"dev\": true\n    },\n    \"node_modules/listenercount\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz\",\n      \"integrity\": \"sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==\",\n      \"dev\": true\n    },\n    \"node_modules/listify\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/listify/-/listify-1.0.3.tgz\",\n      \"integrity\": \"sha512-083swF7iH7bx8666zdzBColpgEuy46HjN3r1isD4zV6Ix7FuHfb/2/WVnl4CH8hjuoWeFF7P5KkKNXUnJCFEJg==\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/listr2\": {\n      \"version\": \"7.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz\",\n      \"integrity\": \"sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"cli-truncate\": \"^3.1.0\",\n        \"colorette\": \"^2.0.20\",\n        \"eventemitter3\": \"^5.0.1\",\n        \"log-update\": \"^5.0.1\",\n        \"rfdc\": \"^1.3.0\",\n        \"wrap-ansi\": \"^8.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=16.0.0\"\n      }\n    },\n    \"node_modules/listr2/node_modules/ansi-styles\": {\n      \"version\": \"6.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz\",\n      \"integrity\": \"sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/listr2/node_modules/emoji-regex\": {\n      \"version\": \"9.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz\",\n      \"integrity\": \"sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==\",\n      \"dev\": true\n    },\n    \"node_modules/listr2/node_modules/string-width\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz\",\n      \"integrity\": \"sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"eastasianwidth\": \"^0.2.0\",\n        \"emoji-regex\": \"^9.2.2\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/listr2/node_modules/wrap-ansi\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz\",\n      \"integrity\": \"sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-styles\": \"^6.1.0\",\n        \"string-width\": \"^5.0.1\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/load-json-file\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz\",\n      \"integrity\": \"sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"graceful-fs\": \"^4.1.2\",\n        \"parse-json\": \"^2.2.0\",\n        \"pify\": \"^2.0.0\",\n        \"strip-bom\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/load-json-file/node_modules/parse-json\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz\",\n      \"integrity\": \"sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"error-ex\": \"^1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/load-json-file/node_modules/strip-bom\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz\",\n      \"integrity\": \"sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/loader-runner\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz\",\n      \"integrity\": \"sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6.11.5\"\n      }\n    },\n    \"node_modules/loader-utils\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz\",\n      \"integrity\": \"sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"big.js\": \"^5.2.2\",\n        \"emojis-list\": \"^3.0.0\",\n        \"json5\": \"^2.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">=8.9.0\"\n      }\n    },\n    \"node_modules/localforage\": {\n      \"version\": \"1.10.0\",\n      \"resolved\": \"https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz\",\n      \"integrity\": \"sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==\",\n      \"dependencies\": {\n        \"lie\": \"3.1.1\"\n      }\n    },\n    \"node_modules/locate-app\": {\n      \"version\": \"2.4.10\",\n      \"resolved\": \"https://registry.npmjs.org/locate-app/-/locate-app-2.4.10.tgz\",\n      \"integrity\": \"sha512-EVbBEFmVKiKUI+94k5x7Qev1xbfPOddhkXO/0ahBvZRsl4LNezss2HXV8wsxOQLa6TVvYDgfN33GafvzVJL8DA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@promptbook/utils\": \"0.44.0-17\",\n        \"type-fest\": \"2.13.0\",\n        \"userhome\": \"1.0.0\"\n      }\n    },\n    \"node_modules/locate-app/node_modules/type-fest\": {\n      \"version\": \"2.13.0\",\n      \"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-2.13.0.tgz\",\n      \"integrity\": \"sha512-lPfAm42MxE4/456+QyIaaVBAwgpJb6xZ8PRu09utnhPdWwcyj9vgy6Sq0Z5yNbJ21EdxB5dRU/Qg8bsyAMtlcw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12.20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/locate-path\": {\n      \"version\": \"6.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz\",\n      \"integrity\": \"sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"p-locate\": \"^5.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/lodash\": {\n      \"version\": \"4.17.21\",\n      \"resolved\": \"https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz\",\n      \"integrity\": \"sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==\"\n    },\n    \"node_modules/lodash.clonedeep\": {\n      \"version\": \"4.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz\",\n      \"integrity\": \"sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==\",\n      \"dev\": true\n    },\n    \"node_modules/lodash.debounce\": {\n      \"version\": \"4.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz\",\n      \"integrity\": \"sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==\",\n      \"dev\": true\n    },\n    \"node_modules/lodash.escaperegexp\": {\n      \"version\": \"4.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz\",\n      \"integrity\": \"sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==\"\n    },\n    \"node_modules/lodash.flattendeep\": {\n      \"version\": \"4.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz\",\n      \"integrity\": \"sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==\",\n      \"dev\": true\n    },\n    \"node_modules/lodash.get\": {\n      \"version\": \"4.4.2\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz\",\n      \"integrity\": \"sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==\",\n      \"dev\": true\n    },\n    \"node_modules/lodash.isequal\": {\n      \"version\": \"4.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz\",\n      \"integrity\": \"sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==\"\n    },\n    \"node_modules/lodash.merge\": {\n      \"version\": \"4.6.2\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz\",\n      \"integrity\": \"sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==\",\n      \"dev\": true\n    },\n    \"node_modules/lodash.pickby\": {\n      \"version\": \"4.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz\",\n      \"integrity\": \"sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==\",\n      \"dev\": true\n    },\n    \"node_modules/lodash.union\": {\n      \"version\": \"4.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz\",\n      \"integrity\": \"sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==\",\n      \"dev\": true\n    },\n    \"node_modules/lodash.zip\": {\n      \"version\": \"4.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz\",\n      \"integrity\": \"sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==\",\n      \"dev\": true\n    },\n    \"node_modules/log-symbols\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz\",\n      \"integrity\": \"sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"chalk\": \"^4.1.0\",\n        \"is-unicode-supported\": \"^0.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/log-symbols/node_modules/is-unicode-supported\": {\n      \"version\": \"0.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz\",\n      \"integrity\": \"sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/log-update\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz\",\n      \"integrity\": \"sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-escapes\": \"^5.0.0\",\n        \"cli-cursor\": \"^4.0.0\",\n        \"slice-ansi\": \"^5.0.0\",\n        \"strip-ansi\": \"^7.0.1\",\n        \"wrap-ansi\": \"^8.0.1\"\n      },\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/log-update/node_modules/ansi-escapes\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz\",\n      \"integrity\": \"sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"type-fest\": \"^1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/log-update/node_modules/ansi-styles\": {\n      \"version\": \"6.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz\",\n      \"integrity\": \"sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/log-update/node_modules/cli-cursor\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz\",\n      \"integrity\": \"sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"restore-cursor\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/log-update/node_modules/emoji-regex\": {\n      \"version\": \"9.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz\",\n      \"integrity\": \"sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==\",\n      \"dev\": true\n    },\n    \"node_modules/log-update/node_modules/mimic-fn\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz\",\n      \"integrity\": \"sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/log-update/node_modules/onetime\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz\",\n      \"integrity\": \"sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"mimic-fn\": \"^2.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/log-update/node_modules/restore-cursor\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz\",\n      \"integrity\": \"sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"onetime\": \"^5.1.0\",\n        \"signal-exit\": \"^3.0.2\"\n      },\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/log-update/node_modules/signal-exit\": {\n      \"version\": \"3.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz\",\n      \"integrity\": \"sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==\",\n      \"dev\": true\n    },\n    \"node_modules/log-update/node_modules/string-width\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz\",\n      \"integrity\": \"sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"eastasianwidth\": \"^0.2.0\",\n        \"emoji-regex\": \"^9.2.2\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/log-update/node_modules/type-fest\": {\n      \"version\": \"1.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz\",\n      \"integrity\": \"sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/log-update/node_modules/wrap-ansi\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz\",\n      \"integrity\": \"sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-styles\": \"^6.1.0\",\n        \"string-width\": \"^5.0.1\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/loglevel\": {\n      \"version\": \"1.9.1\",\n      \"resolved\": \"https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz\",\n      \"integrity\": \"sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.6.0\"\n      },\n      \"funding\": {\n        \"type\": \"tidelift\",\n        \"url\": \"https://tidelift.com/funding/github/npm/loglevel\"\n      }\n    },\n    \"node_modules/loglevel-plugin-prefix\": {\n      \"version\": \"0.8.4\",\n      \"resolved\": \"https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz\",\n      \"integrity\": \"sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==\",\n      \"dev\": true\n    },\n    \"node_modules/longest\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/longest/-/longest-2.0.1.tgz\",\n      \"integrity\": \"sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/loose-envify\": {\n      \"version\": \"1.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz\",\n      \"integrity\": \"sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==\",\n      \"dependencies\": {\n        \"js-tokens\": \"^3.0.0 || ^4.0.0\"\n      },\n      \"bin\": {\n        \"loose-envify\": \"cli.js\"\n      }\n    },\n    \"node_modules/loupe\": {\n      \"version\": \"2.3.7\",\n      \"resolved\": \"https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz\",\n      \"integrity\": \"sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"get-func-name\": \"^2.0.1\"\n      }\n    },\n    \"node_modules/lower-case\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz\",\n      \"integrity\": \"sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"tslib\": \"^2.0.3\"\n      }\n    },\n    \"node_modules/lowercase-keys\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz\",\n      \"integrity\": \"sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/lru-cache\": {\n      \"version\": \"5.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz\",\n      \"integrity\": \"sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==\",\n      \"dependencies\": {\n        \"yallist\": \"^3.0.2\"\n      }\n    },\n    \"node_modules/lru-queue\": {\n      \"version\": \"0.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz\",\n      \"integrity\": \"sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==\",\n      \"dependencies\": {\n        \"es5-ext\": \"~0.10.2\"\n      }\n    },\n    \"node_modules/lzma-native\": {\n      \"version\": \"8.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/lzma-native/-/lzma-native-8.0.6.tgz\",\n      \"integrity\": \"sha512-09xfg67mkL2Lz20PrrDeNYZxzeW7ADtpYFbwSQh9U8+76RIzx5QsJBMy8qikv3hbUPfpy6hqwxt6FcGK81g9AA==\",\n      \"hasInstallScript\": true,\n      \"dependencies\": {\n        \"node-addon-api\": \"^3.1.0\",\n        \"node-gyp-build\": \"^4.2.1\",\n        \"readable-stream\": \"^3.6.0\"\n      },\n      \"bin\": {\n        \"lzmajs\": \"bin/lzmajs\"\n      },\n      \"engines\": {\n        \"node\": \">=10.0.0\"\n      }\n    },\n    \"node_modules/lzma-native/node_modules/node-addon-api\": {\n      \"version\": \"3.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz\",\n      \"integrity\": \"sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==\"\n    },\n    \"node_modules/macos-alias\": {\n      \"version\": \"0.2.12\",\n      \"resolved\": \"https://registry.npmjs.org/macos-alias/-/macos-alias-0.2.12.tgz\",\n      \"integrity\": \"sha512-yiLHa7cfJcGRFq4FrR4tMlpNHb4Vy4mWnpajlSSIFM5k4Lv8/7BbbDLzCAVogWNl0LlLhizRp1drXv0hK9h0Yw==\",\n      \"dev\": true,\n      \"hasInstallScript\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"dependencies\": {\n        \"nan\": \"^2.4.0\"\n      }\n    },\n    \"node_modules/magic-string\": {\n      \"version\": \"0.30.10\",\n      \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz\",\n      \"integrity\": \"sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/sourcemap-codec\": \"^1.4.15\"\n      }\n    },\n    \"node_modules/make-dir\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz\",\n      \"integrity\": \"sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==\",\n      \"dependencies\": {\n        \"semver\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/make-dir/node_modules/semver\": {\n      \"version\": \"6.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n      \"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n      \"bin\": {\n        \"semver\": \"bin/semver.js\"\n      }\n    },\n    \"node_modules/make-error\": {\n      \"version\": \"1.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz\",\n      \"integrity\": \"sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==\",\n      \"dev\": true\n    },\n    \"node_modules/make-fetch-happen\": {\n      \"version\": \"10.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz\",\n      \"integrity\": \"sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"agentkeepalive\": \"^4.2.1\",\n        \"cacache\": \"^16.1.0\",\n        \"http-cache-semantics\": \"^4.1.0\",\n        \"http-proxy-agent\": \"^5.0.0\",\n        \"https-proxy-agent\": \"^5.0.0\",\n        \"is-lambda\": \"^1.0.1\",\n        \"lru-cache\": \"^7.7.1\",\n        \"minipass\": \"^3.1.6\",\n        \"minipass-collect\": \"^1.0.2\",\n        \"minipass-fetch\": \"^2.0.3\",\n        \"minipass-flush\": \"^1.0.5\",\n        \"minipass-pipeline\": \"^1.2.4\",\n        \"negotiator\": \"^0.6.3\",\n        \"promise-retry\": \"^2.0.1\",\n        \"socks-proxy-agent\": \"^7.0.0\",\n        \"ssri\": \"^9.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^12.13.0 || ^14.15.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/make-fetch-happen/node_modules/agent-base\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz\",\n      \"integrity\": \"sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"debug\": \"4\"\n      },\n      \"engines\": {\n        \"node\": \">= 6.0.0\"\n      }\n    },\n    \"node_modules/make-fetch-happen/node_modules/http-proxy-agent\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz\",\n      \"integrity\": \"sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@tootallnate/once\": \"2\",\n        \"agent-base\": \"6\",\n        \"debug\": \"4\"\n      },\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/make-fetch-happen/node_modules/lru-cache\": {\n      \"version\": \"7.18.3\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz\",\n      \"integrity\": \"sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/make-fetch-happen/node_modules/minipass\": {\n      \"version\": \"3.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz\",\n      \"integrity\": \"sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"yallist\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/make-fetch-happen/node_modules/yallist\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz\",\n      \"integrity\": \"sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==\",\n      \"dev\": true,\n      \"license\": \"ISC\"\n    },\n    \"node_modules/map-age-cleaner\": {\n      \"version\": \"0.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz\",\n      \"integrity\": \"sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"p-defer\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/markdown-escapes\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz\",\n      \"integrity\": \"sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/markdown-to-jsx\": {\n      \"version\": \"7.4.7\",\n      \"resolved\": \"https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.4.7.tgz\",\n      \"integrity\": \"sha512-0+ls1IQZdU6cwM1yu0ZjjiVWYtkbExSyUIFU2ZeDIFuZM1W42Mh4OlJ4nb4apX4H8smxDHRdFaoIVJGwfv5hkg==\",\n      \"engines\": {\n        \"node\": \">= 10\"\n      },\n      \"peerDependencies\": {\n        \"react\": \">= 0.14.0\"\n      }\n    },\n    \"node_modules/marked\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/marked/-/marked-4.3.0.tgz\",\n      \"integrity\": \"sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==\",\n      \"bin\": {\n        \"marked\": \"bin/marked.js\"\n      },\n      \"engines\": {\n        \"node\": \">= 12\"\n      }\n    },\n    \"node_modules/matcher\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz\",\n      \"integrity\": \"sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"escape-string-regexp\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/math-intrinsics\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz\",\n      \"integrity\": \"sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/mbr\": {\n      \"version\": \"1.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/mbr/-/mbr-1.1.3.tgz\",\n      \"integrity\": \"sha512-be9zNj5gJOTAppUkjU7HU/hZnjLRsfkKSnlle1BqxmTzMlGis7dbIClEbQnDKlUjNaFhBTcQQ/KQT+OQDWAvJg==\",\n      \"dependencies\": {\n        \"bloodline\": \"^1.0.1\",\n        \"chs\": \"^1.1.0\"\n      }\n    },\n    \"node_modules/mdast-util-definitions\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-3.0.1.tgz\",\n      \"integrity\": \"sha512-BAv2iUm/e6IK/b2/t+Fx69EL/AGcq/IG2S+HxHjDJGfLJtd6i9SZUS76aC9cig+IEucsqxKTR0ot3m933R3iuA==\",\n      \"dependencies\": {\n        \"unist-util-visit\": \"^2.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/mdast-util-to-hast\": {\n      \"version\": \"9.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-9.1.2.tgz\",\n      \"integrity\": \"sha512-OpkFLBC2VnNAb2FNKcKWu9FMbJhQKog+FCT8nuKmQNIKXyT1n3SIskE7uWDep6x+cA20QXlK5AETHQtYmQmxtQ==\",\n      \"dependencies\": {\n        \"@types/mdast\": \"^3.0.0\",\n        \"@types/unist\": \"^2.0.0\",\n        \"mdast-util-definitions\": \"^3.0.0\",\n        \"mdurl\": \"^1.0.0\",\n        \"unist-builder\": \"^2.0.0\",\n        \"unist-util-generated\": \"^1.0.0\",\n        \"unist-util-position\": \"^3.0.0\",\n        \"unist-util-visit\": \"^2.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/mdn-data\": {\n      \"version\": \"2.0.30\",\n      \"resolved\": \"https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz\",\n      \"integrity\": \"sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==\",\n      \"dev\": true\n    },\n    \"node_modules/mdurl\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz\",\n      \"integrity\": \"sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==\"\n    },\n    \"node_modules/media-typer\": {\n      \"version\": \"0.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz\",\n      \"integrity\": \"sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/mem\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/mem/-/mem-4.3.0.tgz\",\n      \"integrity\": \"sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"map-age-cleaner\": \"^0.1.1\",\n        \"mimic-fn\": \"^2.0.0\",\n        \"p-is-promise\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/mem/node_modules/mimic-fn\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz\",\n      \"integrity\": \"sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/mem/node_modules/p-is-promise\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz\",\n      \"integrity\": \"sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/memfs\": {\n      \"version\": \"3.5.3\",\n      \"resolved\": \"https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz\",\n      \"integrity\": \"sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"fs-monkey\": \"^1.0.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 4.0.0\"\n      }\n    },\n    \"node_modules/memoizee\": {\n      \"version\": \"0.4.15\",\n      \"resolved\": \"https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz\",\n      \"integrity\": \"sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==\",\n      \"dependencies\": {\n        \"d\": \"^1.0.1\",\n        \"es5-ext\": \"^0.10.53\",\n        \"es6-weak-map\": \"^2.0.3\",\n        \"event-emitter\": \"^0.3.5\",\n        \"is-promise\": \"^2.2.2\",\n        \"lru-queue\": \"^0.1.0\",\n        \"next-tick\": \"^1.1.0\",\n        \"timers-ext\": \"^0.1.7\"\n      }\n    },\n    \"node_modules/merge-descriptors\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz\",\n      \"integrity\": \"sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==\",\n      \"dev\": true\n    },\n    \"node_modules/merge-stream\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz\",\n      \"integrity\": \"sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==\",\n      \"dev\": true\n    },\n    \"node_modules/merge2\": {\n      \"version\": \"1.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz\",\n      \"integrity\": \"sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/mermaid\": {\n      \"version\": \"9.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/mermaid/-/mermaid-9.2.2.tgz\",\n      \"integrity\": \"sha512-6s7eKMqFJGS+0MYjmx8f6ZigqKBJVoSx5ql2gw6a4Aa+WJ49QiEJg7gPwywaBg3DZMs79UP7trESp4+jmaQccw==\",\n      \"dependencies\": {\n        \"@braintree/sanitize-url\": \"^6.0.0\",\n        \"d3\": \"^7.0.0\",\n        \"dagre\": \"^0.8.5\",\n        \"dagre-d3\": \"^0.6.4\",\n        \"dompurify\": \"2.4.0\",\n        \"fast-clone\": \"^1.5.13\",\n        \"graphlib\": \"^2.1.8\",\n        \"khroma\": \"^2.0.0\",\n        \"lodash\": \"^4.17.21\",\n        \"moment-mini\": \"^2.24.0\",\n        \"non-layered-tidy-tree-layout\": \"^2.0.2\",\n        \"stylis\": \"^4.1.2\",\n        \"uuid\": \"^9.0.0\"\n      }\n    },\n    \"node_modules/methods\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/methods/-/methods-1.1.2.tgz\",\n      \"integrity\": \"sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/micromatch\": {\n      \"version\": \"4.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz\",\n      \"integrity\": \"sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"braces\": \"^3.0.2\",\n        \"picomatch\": \"^2.3.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8.6\"\n      }\n    },\n    \"node_modules/middleearth-names\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/middleearth-names/-/middleearth-names-1.1.0.tgz\",\n      \"integrity\": \"sha512-Oo1mbq9odpn6KHsDs8/UA5xFfX/gcrY+jWZpvd5MDaX0tjkxA7S7NTREQuqD7DWfluDgygjhKvETMWbwd3A9sA==\",\n      \"dependencies\": {\n        \"unique-random-array\": \"1.0.0\"\n      }\n    },\n    \"node_modules/mime\": {\n      \"version\": \"1.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/mime/-/mime-1.6.0.tgz\",\n      \"integrity\": \"sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==\",\n      \"dev\": true,\n      \"bin\": {\n        \"mime\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/mime-db\": {\n      \"version\": \"1.52.0\",\n      \"resolved\": \"https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz\",\n      \"integrity\": \"sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/mime-types\": {\n      \"version\": \"2.1.35\",\n      \"resolved\": \"https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz\",\n      \"integrity\": \"sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==\",\n      \"dependencies\": {\n        \"mime-db\": \"1.52.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/mimic-fn\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz\",\n      \"integrity\": \"sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/mimic-response\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz\",\n      \"integrity\": \"sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/minimalistic-assert\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz\",\n      \"integrity\": \"sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==\",\n      \"dev\": true\n    },\n    \"node_modules/minimatch\": {\n      \"version\": \"3.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz\",\n      \"integrity\": \"sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==\",\n      \"dependencies\": {\n        \"brace-expansion\": \"^1.1.7\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/minimist\": {\n      \"version\": \"1.2.8\",\n      \"resolved\": \"https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz\",\n      \"integrity\": \"sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==\",\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/minipass\": {\n      \"version\": \"7.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz\",\n      \"integrity\": \"sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==\",\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      }\n    },\n    \"node_modules/minipass-collect\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz\",\n      \"integrity\": \"sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"minipass\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/minipass-collect/node_modules/minipass\": {\n      \"version\": \"3.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz\",\n      \"integrity\": \"sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"yallist\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/minipass-collect/node_modules/yallist\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz\",\n      \"integrity\": \"sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==\",\n      \"dev\": true,\n      \"license\": \"ISC\"\n    },\n    \"node_modules/minipass-fetch\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz\",\n      \"integrity\": \"sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"minipass\": \"^3.1.6\",\n        \"minipass-sized\": \"^1.0.3\",\n        \"minizlib\": \"^2.1.2\"\n      },\n      \"engines\": {\n        \"node\": \"^12.13.0 || ^14.15.0 || >=16.0.0\"\n      },\n      \"optionalDependencies\": {\n        \"encoding\": \"^0.1.13\"\n      }\n    },\n    \"node_modules/minipass-fetch/node_modules/minipass\": {\n      \"version\": \"3.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz\",\n      \"integrity\": \"sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"yallist\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/minipass-fetch/node_modules/yallist\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz\",\n      \"integrity\": \"sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==\",\n      \"dev\": true,\n      \"license\": \"ISC\"\n    },\n    \"node_modules/minipass-flush\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz\",\n      \"integrity\": \"sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"minipass\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/minipass-flush/node_modules/minipass\": {\n      \"version\": \"3.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz\",\n      \"integrity\": \"sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"yallist\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/minipass-flush/node_modules/yallist\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz\",\n      \"integrity\": \"sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==\",\n      \"dev\": true,\n      \"license\": \"ISC\"\n    },\n    \"node_modules/minipass-pipeline\": {\n      \"version\": \"1.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz\",\n      \"integrity\": \"sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"minipass\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/minipass-pipeline/node_modules/minipass\": {\n      \"version\": \"3.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz\",\n      \"integrity\": \"sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"yallist\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/minipass-pipeline/node_modules/yallist\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz\",\n      \"integrity\": \"sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==\",\n      \"dev\": true,\n      \"license\": \"ISC\"\n    },\n    \"node_modules/minipass-sized\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz\",\n      \"integrity\": \"sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"minipass\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/minipass-sized/node_modules/minipass\": {\n      \"version\": \"3.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz\",\n      \"integrity\": \"sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"yallist\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/minipass-sized/node_modules/yallist\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz\",\n      \"integrity\": \"sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==\",\n      \"dev\": true,\n      \"license\": \"ISC\"\n    },\n    \"node_modules/minizlib\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz\",\n      \"integrity\": \"sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"minipass\": \"^3.0.0\",\n        \"yallist\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/minizlib/node_modules/minipass\": {\n      \"version\": \"3.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz\",\n      \"integrity\": \"sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"yallist\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/minizlib/node_modules/yallist\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz\",\n      \"integrity\": \"sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==\",\n      \"dev\": true,\n      \"license\": \"ISC\"\n    },\n    \"node_modules/mitt\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz\",\n      \"integrity\": \"sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==\",\n      \"dev\": true\n    },\n    \"node_modules/mkdirp\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz\",\n      \"integrity\": \"sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"mkdirp\": \"bin/cmd.js\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/mkdirp-classic\": {\n      \"version\": \"0.5.3\",\n      \"resolved\": \"https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz\",\n      \"integrity\": \"sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==\"\n    },\n    \"node_modules/mocha\": {\n      \"version\": \"10.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz\",\n      \"integrity\": \"sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-colors\": \"4.1.1\",\n        \"browser-stdout\": \"1.3.1\",\n        \"chokidar\": \"3.5.3\",\n        \"debug\": \"4.3.4\",\n        \"diff\": \"5.0.0\",\n        \"escape-string-regexp\": \"4.0.0\",\n        \"find-up\": \"5.0.0\",\n        \"glob\": \"8.1.0\",\n        \"he\": \"1.2.0\",\n        \"js-yaml\": \"4.1.0\",\n        \"log-symbols\": \"4.1.0\",\n        \"minimatch\": \"5.0.1\",\n        \"ms\": \"2.1.3\",\n        \"serialize-javascript\": \"6.0.0\",\n        \"strip-json-comments\": \"3.1.1\",\n        \"supports-color\": \"8.1.1\",\n        \"workerpool\": \"6.2.1\",\n        \"yargs\": \"16.2.0\",\n        \"yargs-parser\": \"20.2.4\",\n        \"yargs-unparser\": \"2.0.0\"\n      },\n      \"bin\": {\n        \"_mocha\": \"bin/_mocha\",\n        \"mocha\": \"bin/mocha.js\"\n      },\n      \"engines\": {\n        \"node\": \">= 14.0.0\"\n      }\n    },\n    \"node_modules/mocha/node_modules/brace-expansion\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz\",\n      \"integrity\": \"sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/mocha/node_modules/chokidar\": {\n      \"version\": \"3.5.3\",\n      \"resolved\": \"https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz\",\n      \"integrity\": \"sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://paulmillr.com/funding/\"\n        }\n      ],\n      \"dependencies\": {\n        \"anymatch\": \"~3.1.2\",\n        \"braces\": \"~3.0.2\",\n        \"glob-parent\": \"~5.1.2\",\n        \"is-binary-path\": \"~2.1.0\",\n        \"is-glob\": \"~4.0.1\",\n        \"normalize-path\": \"~3.0.0\",\n        \"readdirp\": \"~3.6.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 8.10.0\"\n      },\n      \"optionalDependencies\": {\n        \"fsevents\": \"~2.3.2\"\n      }\n    },\n    \"node_modules/mocha/node_modules/cliui\": {\n      \"version\": \"7.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz\",\n      \"integrity\": \"sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"string-width\": \"^4.2.0\",\n        \"strip-ansi\": \"^6.0.0\",\n        \"wrap-ansi\": \"^7.0.0\"\n      }\n    },\n    \"node_modules/mocha/node_modules/diff\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/diff/-/diff-5.0.0.tgz\",\n      \"integrity\": \"sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.3.1\"\n      }\n    },\n    \"node_modules/mocha/node_modules/glob\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-8.1.0.tgz\",\n      \"integrity\": \"sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"fs.realpath\": \"^1.0.0\",\n        \"inflight\": \"^1.0.4\",\n        \"inherits\": \"2\",\n        \"minimatch\": \"^5.0.1\",\n        \"once\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/mocha/node_modules/minimatch\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz\",\n      \"integrity\": \"sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/mocha/node_modules/ms\": {\n      \"version\": \"2.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n      \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\n      \"dev\": true\n    },\n    \"node_modules/mocha/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/mocha/node_modules/supports-color\": {\n      \"version\": \"8.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz\",\n      \"integrity\": \"sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"has-flag\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/supports-color?sponsor=1\"\n      }\n    },\n    \"node_modules/mocha/node_modules/wrap-ansi\": {\n      \"version\": \"7.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n      \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.0.0\",\n        \"string-width\": \"^4.1.0\",\n        \"strip-ansi\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/mocha/node_modules/y18n\": {\n      \"version\": \"5.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz\",\n      \"integrity\": \"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/mocha/node_modules/yargs\": {\n      \"version\": \"16.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz\",\n      \"integrity\": \"sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"cliui\": \"^7.0.2\",\n        \"escalade\": \"^3.1.1\",\n        \"get-caller-file\": \"^2.0.5\",\n        \"require-directory\": \"^2.1.1\",\n        \"string-width\": \"^4.2.0\",\n        \"y18n\": \"^5.0.5\",\n        \"yargs-parser\": \"^20.2.2\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/mocha/node_modules/yargs-parser\": {\n      \"version\": \"20.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz\",\n      \"integrity\": \"sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/moment\": {\n      \"version\": \"2.30.1\",\n      \"resolved\": \"https://registry.npmjs.org/moment/-/moment-2.30.1.tgz\",\n      \"integrity\": \"sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/moment-mini\": {\n      \"version\": \"2.29.4\",\n      \"resolved\": \"https://registry.npmjs.org/moment-mini/-/moment-mini-2.29.4.tgz\",\n      \"integrity\": \"sha512-uhXpYwHFeiTbY9KSgPPRoo1nt8OxNVdMVoTBYHfSEKeRkIkwGpO+gERmhuhBtzfaeOyTkykSrm2+noJBgqt3Hg==\"\n    },\n    \"node_modules/mountutils\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/mountutils/-/mountutils-2.0.1.tgz\",\n      \"integrity\": \"sha512-qfp2+SBVwlpJ4ScHc97Oj6tJdkeEgs2UAG1GQ5PX/w5Embd7RE0aXKK+Coo4vGvaE4UqAuQL4c/Si/2EVVJDNQ==\",\n      \"hasInstallScript\": true,\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bindings\": \"^1.3.0\",\n        \"nan\": \"^2.22.0\",\n        \"node-gyp-build\": \"^4.8.4\",\n        \"prebuildify\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">18 <=24\"\n      }\n    },\n    \"node_modules/mrm\": {\n      \"version\": \"3.0.10\",\n      \"resolved\": \"https://registry.npmjs.org/mrm/-/mrm-3.0.10.tgz\",\n      \"integrity\": \"sha512-aRByZsPXMM8W0NHNH9afkKyk5OW4bB5pYNRIN+8iSVfpMAzqeMejmj/yIYcdFNJTksXmdPMfTaucm2NYdh4xIw==\",\n      \"dependencies\": {\n        \"git-username\": \"^1.0.0\",\n        \"glob\": \"^7.1.6\",\n        \"inquirer\": \"^7.0.4\",\n        \"is-directory\": \"^0.3.1\",\n        \"kleur\": \"^3.0.3\",\n        \"libnpx\": \"^10.2.4\",\n        \"listify\": \"^1.0.0\",\n        \"lodash\": \"^4.17.15\",\n        \"longest\": \"^2.0.1\",\n        \"middleearth-names\": \"^1.1.0\",\n        \"minimist\": \"^1.2.0\",\n        \"mrm-core\": \"^6.1.7\",\n        \"semver-utils\": \"^1.1.4\",\n        \"update-notifier\": \"^4.1.0\",\n        \"user-home\": \"^2.0.0\",\n        \"user-meta\": \"^1.0.0\",\n        \"which\": \"^2.0.2\"\n      },\n      \"bin\": {\n        \"mrm\": \"bin/mrm.js\"\n      },\n      \"engines\": {\n        \"node\": \">=10.13\"\n      }\n    },\n    \"node_modules/mrm-core\": {\n      \"version\": \"6.1.7\",\n      \"resolved\": \"https://registry.npmjs.org/mrm-core/-/mrm-core-6.1.7.tgz\",\n      \"integrity\": \"sha512-jLGWrkupcgGIsLerrI/xmM/dFHbaoehRsuVbgYBrxYKXNMRBHN3Mgkd8cw+/ZCCoiZEXF8/SaZol0GCp6oBQ9g==\",\n      \"dependencies\": {\n        \"babel-code-frame\": \"^6.26.0\",\n        \"comment-json\": \"^2.2.0\",\n        \"detect-indent\": \"^6.0.0\",\n        \"editorconfig\": \"^0.15.3\",\n        \"find-up\": \"^4.1.0\",\n        \"fs-extra\": \"^8.1.0\",\n        \"kleur\": \"^3.0.3\",\n        \"listify\": \"^1.0.0\",\n        \"lodash\": \"^4.17.15\",\n        \"minimist\": \"^1.2.0\",\n        \"prop-ini\": \"^0.0.2\",\n        \"rc\": \"^1.2.8\",\n        \"readme-badger\": \"^0.3.0\",\n        \"semver\": \"^6.3.0\",\n        \"smpltmpl\": \"^1.0.2\",\n        \"split-lines\": \"^2.0.0\",\n        \"strip-bom\": \"^4.0.0\",\n        \"validate-npm-package-name\": \"^3.0.0\",\n        \"webpack-merge\": \"^4.2.2\",\n        \"yaml\": \"^2.0.0-1\"\n      },\n      \"engines\": {\n        \"node\": \">=10.13\"\n      }\n    },\n    \"node_modules/mrm-core/node_modules/find-up\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz\",\n      \"integrity\": \"sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==\",\n      \"dependencies\": {\n        \"locate-path\": \"^5.0.0\",\n        \"path-exists\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/mrm-core/node_modules/fs-extra\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz\",\n      \"integrity\": \"sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==\",\n      \"dependencies\": {\n        \"graceful-fs\": \"^4.2.0\",\n        \"jsonfile\": \"^4.0.0\",\n        \"universalify\": \"^0.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6 <7 || >=8\"\n      }\n    },\n    \"node_modules/mrm-core/node_modules/jsonfile\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz\",\n      \"integrity\": \"sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==\",\n      \"optionalDependencies\": {\n        \"graceful-fs\": \"^4.1.6\"\n      }\n    },\n    \"node_modules/mrm-core/node_modules/locate-path\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz\",\n      \"integrity\": \"sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==\",\n      \"dependencies\": {\n        \"p-locate\": \"^4.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/mrm-core/node_modules/p-limit\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz\",\n      \"integrity\": \"sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==\",\n      \"dependencies\": {\n        \"p-try\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/mrm-core/node_modules/p-locate\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz\",\n      \"integrity\": \"sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==\",\n      \"dependencies\": {\n        \"p-limit\": \"^2.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/mrm-core/node_modules/p-try\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz\",\n      \"integrity\": \"sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/mrm-core/node_modules/semver\": {\n      \"version\": \"6.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n      \"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n      \"bin\": {\n        \"semver\": \"bin/semver.js\"\n      }\n    },\n    \"node_modules/mrm-core/node_modules/universalify\": {\n      \"version\": \"0.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz\",\n      \"integrity\": \"sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==\",\n      \"engines\": {\n        \"node\": \">= 4.0.0\"\n      }\n    },\n    \"node_modules/mrm-core/node_modules/webpack-merge\": {\n      \"version\": \"4.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz\",\n      \"integrity\": \"sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==\",\n      \"dependencies\": {\n        \"lodash\": \"^4.17.15\"\n      }\n    },\n    \"node_modules/mrm/node_modules/cli-width\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz\",\n      \"integrity\": \"sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==\",\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/mrm/node_modules/escape-string-regexp\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz\",\n      \"integrity\": \"sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==\",\n      \"engines\": {\n        \"node\": \">=0.8.0\"\n      }\n    },\n    \"node_modules/mrm/node_modules/figures\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/figures/-/figures-3.2.0.tgz\",\n      \"integrity\": \"sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==\",\n      \"dependencies\": {\n        \"escape-string-regexp\": \"^1.0.5\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/mrm/node_modules/glob\": {\n      \"version\": \"7.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-7.2.3.tgz\",\n      \"integrity\": \"sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==\",\n      \"dependencies\": {\n        \"fs.realpath\": \"^1.0.0\",\n        \"inflight\": \"^1.0.4\",\n        \"inherits\": \"2\",\n        \"minimatch\": \"^3.1.1\",\n        \"once\": \"^1.3.0\",\n        \"path-is-absolute\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/mrm/node_modules/inquirer\": {\n      \"version\": \"7.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz\",\n      \"integrity\": \"sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==\",\n      \"dependencies\": {\n        \"ansi-escapes\": \"^4.2.1\",\n        \"chalk\": \"^4.1.0\",\n        \"cli-cursor\": \"^3.1.0\",\n        \"cli-width\": \"^3.0.0\",\n        \"external-editor\": \"^3.0.3\",\n        \"figures\": \"^3.0.0\",\n        \"lodash\": \"^4.17.19\",\n        \"mute-stream\": \"0.0.8\",\n        \"run-async\": \"^2.4.0\",\n        \"rxjs\": \"^6.6.0\",\n        \"string-width\": \"^4.1.0\",\n        \"strip-ansi\": \"^6.0.0\",\n        \"through\": \"^2.3.6\"\n      },\n      \"engines\": {\n        \"node\": \">=8.0.0\"\n      }\n    },\n    \"node_modules/mrm/node_modules/mute-stream\": {\n      \"version\": \"0.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz\",\n      \"integrity\": \"sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==\"\n    },\n    \"node_modules/mrm/node_modules/run-async\": {\n      \"version\": \"2.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz\",\n      \"integrity\": \"sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==\",\n      \"engines\": {\n        \"node\": \">=0.12.0\"\n      }\n    },\n    \"node_modules/mrm/node_modules/rxjs\": {\n      \"version\": \"6.6.7\",\n      \"resolved\": \"https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz\",\n      \"integrity\": \"sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==\",\n      \"dependencies\": {\n        \"tslib\": \"^1.9.0\"\n      },\n      \"engines\": {\n        \"npm\": \">=2.0.0\"\n      }\n    },\n    \"node_modules/mrm/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/mrm/node_modules/tslib\": {\n      \"version\": \"1.14.1\",\n      \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz\",\n      \"integrity\": \"sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==\"\n    },\n    \"node_modules/ms\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.2.tgz\",\n      \"integrity\": \"sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==\"\n    },\n    \"node_modules/multicast-dns\": {\n      \"version\": \"7.2.5\",\n      \"resolved\": \"https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz\",\n      \"integrity\": \"sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"dns-packet\": \"^5.2.2\",\n        \"thunky\": \"^1.0.2\"\n      },\n      \"bin\": {\n        \"multicast-dns\": \"cli.js\"\n      }\n    },\n    \"node_modules/multimatch\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz\",\n      \"integrity\": \"sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/minimatch\": \"^3.0.3\",\n        \"array-differ\": \"^3.0.0\",\n        \"array-union\": \"^2.1.0\",\n        \"arrify\": \"^2.0.1\",\n        \"minimatch\": \"^3.0.4\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/multimatch/node_modules/@types/minimatch\": {\n      \"version\": \"3.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz\",\n      \"integrity\": \"sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==\",\n      \"dev\": true\n    },\n    \"node_modules/multistream\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz\",\n      \"integrity\": \"sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"dependencies\": {\n        \"once\": \"^1.4.0\",\n        \"readable-stream\": \"^3.6.0\"\n      }\n    },\n    \"node_modules/murmur-32\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/murmur-32/-/murmur-32-0.2.0.tgz\",\n      \"integrity\": \"sha512-ZkcWZudylwF+ir3Ld1n7gL6bI2mQAzXvSobPwVtu8aYi2sbXeipeSkdcanRLzIofLcM5F53lGaKm2dk7orBi7Q==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"encode-utf8\": \"^1.0.3\",\n        \"fmix\": \"^0.1.0\",\n        \"imul\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/mute-stream\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz\",\n      \"integrity\": \"sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^14.17.0 || ^16.13.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/nan\": {\n      \"version\": \"2.23.0\",\n      \"resolved\": \"https://registry.npmjs.org/nan/-/nan-2.23.0.tgz\",\n      \"integrity\": \"sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/nanoid\": {\n      \"version\": \"3.3.7\",\n      \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz\",\n      \"integrity\": \"sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/ai\"\n        }\n      ],\n      \"bin\": {\n        \"nanoid\": \"bin/nanoid.cjs\"\n      },\n      \"engines\": {\n        \"node\": \"^10 || ^12 || ^13.7 || ^14 || >=15.0.1\"\n      }\n    },\n    \"node_modules/napi-build-utils\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz\",\n      \"integrity\": \"sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==\"\n    },\n    \"node_modules/native-addon-loader\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/native-addon-loader/-/native-addon-loader-2.0.1.tgz\",\n      \"integrity\": \"sha512-tAaKULhDUmHYNZNKAWlvEky0x+y17+6jbtscXpf0WeWCPRP1nR2h3sA128rWRwj0YbpXVaPhPeJT0ejN7bJtyw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"loader-utils\": \"^1.2.3\"\n      }\n    },\n    \"node_modules/native-addon-loader/node_modules/json5\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/json5/-/json5-1.0.2.tgz\",\n      \"integrity\": \"sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"minimist\": \"^1.2.0\"\n      },\n      \"bin\": {\n        \"json5\": \"lib/cli.js\"\n      }\n    },\n    \"node_modules/native-addon-loader/node_modules/loader-utils\": {\n      \"version\": \"1.4.2\",\n      \"resolved\": \"https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz\",\n      \"integrity\": \"sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"big.js\": \"^5.2.2\",\n        \"emojis-list\": \"^3.0.0\",\n        \"json5\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=4.0.0\"\n      }\n    },\n    \"node_modules/natural-compare\": {\n      \"version\": \"1.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz\",\n      \"integrity\": \"sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==\",\n      \"dev\": true\n    },\n    \"node_modules/negotiator\": {\n      \"version\": \"0.6.3\",\n      \"resolved\": \"https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz\",\n      \"integrity\": \"sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/neo-async\": {\n      \"version\": \"2.6.2\",\n      \"resolved\": \"https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz\",\n      \"integrity\": \"sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==\",\n      \"dev\": true\n    },\n    \"node_modules/netmask\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz\",\n      \"integrity\": \"sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.4.0\"\n      }\n    },\n    \"node_modules/next-tick\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz\",\n      \"integrity\": \"sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==\"\n    },\n    \"node_modules/nice-try\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz\",\n      \"integrity\": \"sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/nise\": {\n      \"version\": \"5.1.9\",\n      \"resolved\": \"https://registry.npmjs.org/nise/-/nise-5.1.9.tgz\",\n      \"integrity\": \"sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@sinonjs/commons\": \"^3.0.0\",\n        \"@sinonjs/fake-timers\": \"^11.2.2\",\n        \"@sinonjs/text-encoding\": \"^0.7.2\",\n        \"just-extend\": \"^6.2.0\",\n        \"path-to-regexp\": \"^6.2.1\"\n      }\n    },\n    \"node_modules/nise/node_modules/path-to-regexp\": {\n      \"version\": \"6.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz\",\n      \"integrity\": \"sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==\",\n      \"dev\": true\n    },\n    \"node_modules/no-case\": {\n      \"version\": \"3.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz\",\n      \"integrity\": \"sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"lower-case\": \"^2.0.2\",\n        \"tslib\": \"^2.0.3\"\n      }\n    },\n    \"node_modules/node-abi\": {\n      \"version\": \"3.62.0\",\n      \"resolved\": \"https://registry.npmjs.org/node-abi/-/node-abi-3.62.0.tgz\",\n      \"integrity\": \"sha512-CPMcGa+y33xuL1E0TcNIu4YyaZCxnnvkVaEXrsosR3FxN+fV8xvb7Mzpb7IgKler10qeMkE6+Dp8qJhpzdq35g==\",\n      \"dependencies\": {\n        \"semver\": \"^7.3.5\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/node-addon-api\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.0.0.tgz\",\n      \"integrity\": \"sha512-ipO7rsHEBqa9STO5C5T10fj732ml+5kLN1cAG8/jdHd56ldQeGj3Q7+scUS+VHK/qy1zLEwC4wMK5+yM0btPvw==\",\n      \"engines\": {\n        \"node\": \"^18 || ^20 || >= 21\"\n      }\n    },\n    \"node_modules/node-api-version\": {\n      \"version\": \"0.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz\",\n      \"integrity\": \"sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"semver\": \"^7.3.5\"\n      }\n    },\n    \"node_modules/node-domexception\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz\",\n      \"integrity\": \"sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/jimmywarting\"\n        },\n        {\n          \"type\": \"github\",\n          \"url\": \"https://paypal.me/jimmywarting\"\n        }\n      ],\n      \"engines\": {\n        \"node\": \">=10.5.0\"\n      }\n    },\n    \"node_modules/node-fetch\": {\n      \"version\": \"2.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz\",\n      \"integrity\": \"sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"whatwg-url\": \"^5.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"4.x || >=6.0.0\"\n      },\n      \"peerDependencies\": {\n        \"encoding\": \"^0.1.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"encoding\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/node-forge\": {\n      \"version\": \"1.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz\",\n      \"integrity\": \"sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 6.13.0\"\n      }\n    },\n    \"node_modules/node-gyp-build\": {\n      \"version\": \"4.8.4\",\n      \"resolved\": \"https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz\",\n      \"integrity\": \"sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==\",\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"node-gyp-build\": \"bin.js\",\n        \"node-gyp-build-optional\": \"optional.js\",\n        \"node-gyp-build-test\": \"build-test.js\"\n      }\n    },\n    \"node_modules/node-loader\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/node-loader/-/node-loader-2.0.0.tgz\",\n      \"integrity\": \"sha512-I5VN34NO4/5UYJaUBtkrODPWxbobrE4hgDqPrjB25yPkonFhCmZ146vTH+Zg417E9Iwoh1l/MbRs1apc5J295Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"loader-utils\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.13.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/webpack\"\n      },\n      \"peerDependencies\": {\n        \"webpack\": \"^5.0.0\"\n      }\n    },\n    \"node_modules/node-raspberrypi-usbboot\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/node-raspberrypi-usbboot/-/node-raspberrypi-usbboot-1.1.0.tgz\",\n      \"integrity\": \"sha512-X5+S+YO/jHcNosb+532shuSQAkaFrt9y0B+JiimTsH62gO+OenwBqWEEoVxrxr/fOtze30zPMe/66u/gA9WzhA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"debug\": \"^4.3.4\",\n        \"usb\": \"^2.12.1\"\n      }\n    },\n    \"node_modules/node-releases\": {\n      \"version\": \"2.0.14\",\n      \"resolved\": \"https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz\",\n      \"integrity\": \"sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==\"\n    },\n    \"node_modules/non-layered-tidy-tree-layout\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz\",\n      \"integrity\": \"sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==\"\n    },\n    \"node_modules/nopt\": {\n      \"version\": \"6.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz\",\n      \"integrity\": \"sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"abbrev\": \"^1.0.0\"\n      },\n      \"bin\": {\n        \"nopt\": \"bin/nopt.js\"\n      },\n      \"engines\": {\n        \"node\": \"^12.13.0 || ^14.15.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/normalize-package-data\": {\n      \"version\": \"6.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz\",\n      \"integrity\": \"sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"hosted-git-info\": \"^7.0.0\",\n        \"is-core-module\": \"^2.8.1\",\n        \"semver\": \"^7.3.5\",\n        \"validate-npm-package-license\": \"^3.0.4\"\n      },\n      \"engines\": {\n        \"node\": \"^16.14.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/normalize-path\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz\",\n      \"integrity\": \"sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/normalize-url\": {\n      \"version\": \"6.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz\",\n      \"integrity\": \"sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==\",\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/npm-package-arg\": {\n      \"version\": \"6.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz\",\n      \"integrity\": \"sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==\",\n      \"dependencies\": {\n        \"hosted-git-info\": \"^2.7.1\",\n        \"osenv\": \"^0.1.5\",\n        \"semver\": \"^5.6.0\",\n        \"validate-npm-package-name\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/npm-package-arg/node_modules/hosted-git-info\": {\n      \"version\": \"2.8.9\",\n      \"resolved\": \"https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz\",\n      \"integrity\": \"sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==\"\n    },\n    \"node_modules/npm-package-arg/node_modules/semver\": {\n      \"version\": \"5.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-5.7.2.tgz\",\n      \"integrity\": \"sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==\",\n      \"bin\": {\n        \"semver\": \"bin/semver\"\n      }\n    },\n    \"node_modules/npm-run-path\": {\n      \"version\": \"5.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz\",\n      \"integrity\": \"sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"path-key\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/npm-run-path/node_modules/path-key\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz\",\n      \"integrity\": \"sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/nth-check\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz\",\n      \"integrity\": \"sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"boolbase\": \"^1.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/nth-check?sponsor=1\"\n      }\n    },\n    \"node_modules/object-assign\": {\n      \"version\": \"4.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz\",\n      \"integrity\": \"sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/object-inspect\": {\n      \"version\": \"1.13.1\",\n      \"resolved\": \"https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz\",\n      \"integrity\": \"sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==\",\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/object-keys\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz\",\n      \"integrity\": \"sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==\",\n      \"devOptional\": true,\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/object.assign\": {\n      \"version\": \"4.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz\",\n      \"integrity\": \"sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.5\",\n        \"define-properties\": \"^1.2.1\",\n        \"has-symbols\": \"^1.0.3\",\n        \"object-keys\": \"^1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/object.entries\": {\n      \"version\": \"1.1.8\",\n      \"resolved\": \"https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz\",\n      \"integrity\": \"sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.7\",\n        \"define-properties\": \"^1.2.1\",\n        \"es-object-atoms\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/object.fromentries\": {\n      \"version\": \"2.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz\",\n      \"integrity\": \"sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.7\",\n        \"define-properties\": \"^1.2.1\",\n        \"es-abstract\": \"^1.23.2\",\n        \"es-object-atoms\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/object.hasown\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz\",\n      \"integrity\": \"sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"define-properties\": \"^1.2.1\",\n        \"es-abstract\": \"^1.23.2\",\n        \"es-object-atoms\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/object.values\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz\",\n      \"integrity\": \"sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.7\",\n        \"define-properties\": \"^1.2.1\",\n        \"es-object-atoms\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/obuf\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz\",\n      \"integrity\": \"sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==\",\n      \"dev\": true\n    },\n    \"node_modules/on-finished\": {\n      \"version\": \"2.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz\",\n      \"integrity\": \"sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ee-first\": \"1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/on-headers\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz\",\n      \"integrity\": \"sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/once\": {\n      \"version\": \"1.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/once/-/once-1.4.0.tgz\",\n      \"integrity\": \"sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==\",\n      \"dependencies\": {\n        \"wrappy\": \"1\"\n      }\n    },\n    \"node_modules/onetime\": {\n      \"version\": \"6.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz\",\n      \"integrity\": \"sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"mimic-fn\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/ono\": {\n      \"version\": \"4.0.11\",\n      \"resolved\": \"https://registry.npmjs.org/ono/-/ono-4.0.11.tgz\",\n      \"integrity\": \"sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==\",\n      \"dependencies\": {\n        \"format-util\": \"^1.0.3\"\n      }\n    },\n    \"node_modules/open\": {\n      \"version\": \"8.4.2\",\n      \"resolved\": \"https://registry.npmjs.org/open/-/open-8.4.2.tgz\",\n      \"integrity\": \"sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"define-lazy-prop\": \"^2.0.0\",\n        \"is-docker\": \"^2.1.1\",\n        \"is-wsl\": \"^2.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/optionator\": {\n      \"version\": \"0.9.3\",\n      \"resolved\": \"https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz\",\n      \"integrity\": \"sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@aashutoshrathi/word-wrap\": \"^1.2.3\",\n        \"deep-is\": \"^0.1.3\",\n        \"fast-levenshtein\": \"^2.0.6\",\n        \"levn\": \"^0.4.1\",\n        \"prelude-ls\": \"^1.2.1\",\n        \"type-check\": \"^0.4.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/ora\": {\n      \"version\": \"5.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/ora/-/ora-5.4.1.tgz\",\n      \"integrity\": \"sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"bl\": \"^4.1.0\",\n        \"chalk\": \"^4.1.0\",\n        \"cli-cursor\": \"^3.1.0\",\n        \"cli-spinners\": \"^2.5.0\",\n        \"is-interactive\": \"^1.0.0\",\n        \"is-unicode-supported\": \"^0.1.0\",\n        \"log-symbols\": \"^4.1.0\",\n        \"strip-ansi\": \"^6.0.0\",\n        \"wcwidth\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/ora/node_modules/is-unicode-supported\": {\n      \"version\": \"0.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz\",\n      \"integrity\": \"sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/ora/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/os-homedir\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz\",\n      \"integrity\": \"sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/os-tmpdir\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz\",\n      \"integrity\": \"sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/osenv\": {\n      \"version\": \"0.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz\",\n      \"integrity\": \"sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==\",\n      \"dependencies\": {\n        \"os-homedir\": \"^1.0.0\",\n        \"os-tmpdir\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/outdent\": {\n      \"version\": \"0.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/outdent/-/outdent-0.8.0.tgz\",\n      \"integrity\": \"sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==\"\n    },\n    \"node_modules/p-cancelable\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz\",\n      \"integrity\": \"sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/p-defer\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz\",\n      \"integrity\": \"sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/p-finally\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz\",\n      \"integrity\": \"sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/p-is-promise\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz\",\n      \"integrity\": \"sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/p-limit\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz\",\n      \"integrity\": \"sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"yocto-queue\": \"^0.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/p-locate\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz\",\n      \"integrity\": \"sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"p-limit\": \"^3.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/p-map\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz\",\n      \"integrity\": \"sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"aggregate-error\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/p-retry\": {\n      \"version\": \"4.6.2\",\n      \"resolved\": \"https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz\",\n      \"integrity\": \"sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/retry\": \"0.12.0\",\n        \"retry\": \"^0.13.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/p-retry/node_modules/retry\": {\n      \"version\": \"0.13.1\",\n      \"resolved\": \"https://registry.npmjs.org/retry/-/retry-0.13.1.tgz\",\n      \"integrity\": \"sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 4\"\n      }\n    },\n    \"node_modules/p-try\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz\",\n      \"integrity\": \"sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/pac-proxy-agent\": {\n      \"version\": \"7.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz\",\n      \"integrity\": \"sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@tootallnate/quickjs-emscripten\": \"^0.23.0\",\n        \"agent-base\": \"^7.0.2\",\n        \"debug\": \"^4.3.4\",\n        \"get-uri\": \"^6.0.1\",\n        \"http-proxy-agent\": \"^7.0.0\",\n        \"https-proxy-agent\": \"^7.0.2\",\n        \"pac-resolver\": \"^7.0.0\",\n        \"socks-proxy-agent\": \"^8.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/pac-proxy-agent/node_modules/https-proxy-agent\": {\n      \"version\": \"7.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz\",\n      \"integrity\": \"sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"agent-base\": \"^7.0.2\",\n        \"debug\": \"4\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/pac-proxy-agent/node_modules/socks-proxy-agent\": {\n      \"version\": \"8.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz\",\n      \"integrity\": \"sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"agent-base\": \"^7.1.1\",\n        \"debug\": \"^4.3.4\",\n        \"socks\": \"^2.7.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/pac-resolver\": {\n      \"version\": \"7.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz\",\n      \"integrity\": \"sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"degenerator\": \"^5.0.0\",\n        \"netmask\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/package-json\": {\n      \"version\": \"6.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz\",\n      \"integrity\": \"sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==\",\n      \"dependencies\": {\n        \"got\": \"^9.6.0\",\n        \"registry-auth-token\": \"^4.0.0\",\n        \"registry-url\": \"^5.0.0\",\n        \"semver\": \"^6.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/package-json/node_modules/@sindresorhus/is\": {\n      \"version\": \"0.14.0\",\n      \"resolved\": \"https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz\",\n      \"integrity\": \"sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/package-json/node_modules/@szmarczak/http-timer\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz\",\n      \"integrity\": \"sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==\",\n      \"dependencies\": {\n        \"defer-to-connect\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/package-json/node_modules/cacheable-request\": {\n      \"version\": \"6.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz\",\n      \"integrity\": \"sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==\",\n      \"dependencies\": {\n        \"clone-response\": \"^1.0.2\",\n        \"get-stream\": \"^5.1.0\",\n        \"http-cache-semantics\": \"^4.0.0\",\n        \"keyv\": \"^3.0.0\",\n        \"lowercase-keys\": \"^2.0.0\",\n        \"normalize-url\": \"^4.1.0\",\n        \"responselike\": \"^1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/package-json/node_modules/cacheable-request/node_modules/get-stream\": {\n      \"version\": \"5.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz\",\n      \"integrity\": \"sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==\",\n      \"dependencies\": {\n        \"pump\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/package-json/node_modules/decompress-response\": {\n      \"version\": \"3.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz\",\n      \"integrity\": \"sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==\",\n      \"dependencies\": {\n        \"mimic-response\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/package-json/node_modules/defer-to-connect\": {\n      \"version\": \"1.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz\",\n      \"integrity\": \"sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==\"\n    },\n    \"node_modules/package-json/node_modules/get-stream\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz\",\n      \"integrity\": \"sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==\",\n      \"dependencies\": {\n        \"pump\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/package-json/node_modules/got\": {\n      \"version\": \"9.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/got/-/got-9.6.0.tgz\",\n      \"integrity\": \"sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==\",\n      \"dependencies\": {\n        \"@sindresorhus/is\": \"^0.14.0\",\n        \"@szmarczak/http-timer\": \"^1.1.2\",\n        \"cacheable-request\": \"^6.0.0\",\n        \"decompress-response\": \"^3.3.0\",\n        \"duplexer3\": \"^0.1.4\",\n        \"get-stream\": \"^4.1.0\",\n        \"lowercase-keys\": \"^1.0.1\",\n        \"mimic-response\": \"^1.0.1\",\n        \"p-cancelable\": \"^1.0.0\",\n        \"to-readable-stream\": \"^1.0.0\",\n        \"url-parse-lax\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8.6\"\n      }\n    },\n    \"node_modules/package-json/node_modules/got/node_modules/lowercase-keys\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz\",\n      \"integrity\": \"sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/package-json/node_modules/json-buffer\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz\",\n      \"integrity\": \"sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==\"\n    },\n    \"node_modules/package-json/node_modules/keyv\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz\",\n      \"integrity\": \"sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==\",\n      \"dependencies\": {\n        \"json-buffer\": \"3.0.0\"\n      }\n    },\n    \"node_modules/package-json/node_modules/normalize-url\": {\n      \"version\": \"4.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz\",\n      \"integrity\": \"sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/package-json/node_modules/p-cancelable\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz\",\n      \"integrity\": \"sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/package-json/node_modules/prepend-http\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz\",\n      \"integrity\": \"sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/package-json/node_modules/responselike\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz\",\n      \"integrity\": \"sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==\",\n      \"dependencies\": {\n        \"lowercase-keys\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/package-json/node_modules/responselike/node_modules/lowercase-keys\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz\",\n      \"integrity\": \"sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/package-json/node_modules/semver\": {\n      \"version\": \"6.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n      \"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n      \"bin\": {\n        \"semver\": \"bin/semver.js\"\n      }\n    },\n    \"node_modules/package-json/node_modules/url-parse-lax\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz\",\n      \"integrity\": \"sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==\",\n      \"dependencies\": {\n        \"prepend-http\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/param-case\": {\n      \"version\": \"3.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz\",\n      \"integrity\": \"sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"dot-case\": \"^3.0.4\",\n        \"tslib\": \"^2.0.3\"\n      }\n    },\n    \"node_modules/parent-module\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz\",\n      \"integrity\": \"sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"callsites\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/parse-author\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz\",\n      \"integrity\": \"sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"author-regex\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/parse-color\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz\",\n      \"integrity\": \"sha512-fuDHYgFHJGbpGMgw9skY/bj3HL/Jrn4l/5rSspy00DoT4RyLnDcRvPxdZ+r6OFwIsgAuhDh4I09tAId4mI12bw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"color-convert\": \"~0.5.0\"\n      }\n    },\n    \"node_modules/parse-color/node_modules/color-convert\": {\n      \"version\": \"0.5.3\",\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz\",\n      \"integrity\": \"sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==\",\n      \"dev\": true,\n      \"optional\": true\n    },\n    \"node_modules/parse-entities\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz\",\n      \"integrity\": \"sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==\",\n      \"dependencies\": {\n        \"character-entities\": \"^1.0.0\",\n        \"character-entities-legacy\": \"^1.0.0\",\n        \"character-reference-invalid\": \"^1.0.0\",\n        \"is-alphanumerical\": \"^1.0.0\",\n        \"is-decimal\": \"^1.0.0\",\n        \"is-hexadecimal\": \"^1.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/parse-git-config\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/parse-git-config/-/parse-git-config-1.1.1.tgz\",\n      \"integrity\": \"sha512-S3LGXJZVSy/hswvbSkfdbKBRVsnqKrVu6j8fcvdtJ4TxosSELyQDsJPuGPXuZ+EyuYuJd3O4uAF8gcISR0OFrQ==\",\n      \"dependencies\": {\n        \"extend-shallow\": \"^2.0.1\",\n        \"fs-exists-sync\": \"^0.1.0\",\n        \"git-config-path\": \"^1.0.1\",\n        \"ini\": \"^1.3.4\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/parse-github-url\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz\",\n      \"integrity\": \"sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==\",\n      \"bin\": {\n        \"parse-github-url\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/parse-json\": {\n      \"version\": \"5.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz\",\n      \"integrity\": \"sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/code-frame\": \"^7.0.0\",\n        \"error-ex\": \"^1.3.1\",\n        \"json-parse-even-better-errors\": \"^2.3.0\",\n        \"lines-and-columns\": \"^1.1.6\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/parse-ms\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz\",\n      \"integrity\": \"sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/parse-passwd\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz\",\n      \"integrity\": \"sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/parse5\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz\",\n      \"integrity\": \"sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==\"\n    },\n    \"node_modules/parseurl\": {\n      \"version\": \"1.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz\",\n      \"integrity\": \"sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/partitioninfo\": {\n      \"version\": \"6.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/partitioninfo/-/partitioninfo-6.0.3.tgz\",\n      \"integrity\": \"sha512-4B88aRAwZm/KYT9dxvdTbrqZ24AiUOnVfkuKVqjQWO3tNvnD2o8g6afZzQnd6+JUuCZWzMq7JrfxtfbL8EyPNQ==\",\n      \"dependencies\": {\n        \"file-disk\": \"^8.0.1\",\n        \"gpt\": \"^2.0.4\",\n        \"mbr\": \"^1.1.3\",\n        \"tslib\": \"^2.0.0\",\n        \"typed-error\": \"^3.2.0\"\n      }\n    },\n    \"node_modules/pascal-case\": {\n      \"version\": \"3.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz\",\n      \"integrity\": \"sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"no-case\": \"^3.0.4\",\n        \"tslib\": \"^2.0.3\"\n      }\n    },\n    \"node_modules/path-exists\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz\",\n      \"integrity\": \"sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/path-is-absolute\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz\",\n      \"integrity\": \"sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/path-is-inside\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz\",\n      \"integrity\": \"sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==\"\n    },\n    \"node_modules/path-key\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz\",\n      \"integrity\": \"sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/path-parse\": {\n      \"version\": \"1.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz\",\n      \"integrity\": \"sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==\",\n      \"dev\": true\n    },\n    \"node_modules/path-scurry\": {\n      \"version\": \"1.10.2\",\n      \"resolved\": \"https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz\",\n      \"integrity\": \"sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==\",\n      \"dependencies\": {\n        \"lru-cache\": \"^10.2.0\",\n        \"minipass\": \"^5.0.0 || ^6.0.2 || ^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/path-scurry/node_modules/lru-cache\": {\n      \"version\": \"10.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.1.tgz\",\n      \"integrity\": \"sha512-tS24spDe/zXhWbNPErCHs/AGOzbKGHT+ybSBqmdLm8WZ1xXLWvH8Qn71QPAlqVhd0qUTWjy+Kl9JmISgDdEjsA==\",\n      \"engines\": {\n        \"node\": \"14 || >=16.14\"\n      }\n    },\n    \"node_modules/path-to-regexp\": {\n      \"version\": \"0.1.7\",\n      \"resolved\": \"https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz\",\n      \"integrity\": \"sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==\",\n      \"dev\": true\n    },\n    \"node_modules/path-type\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz\",\n      \"integrity\": \"sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/pathe\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz\",\n      \"integrity\": \"sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==\",\n      \"dev\": true\n    },\n    \"node_modules/pathval\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz\",\n      \"integrity\": \"sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/pe-library\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/pe-library/-/pe-library-1.0.1.tgz\",\n      \"integrity\": \"sha512-nh39Mo1eGWmZS7y+mK/dQIqg7S1lp38DpRxkyoHf0ZcUs/HDc+yyTjuOtTvSMZHmfSLuSQaX945u05Y2Q6UWZg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=14\",\n        \"npm\": \">=7\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/jet2jet\"\n      }\n    },\n    \"node_modules/peek-readable\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz\",\n      \"integrity\": \"sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/Borewit\"\n      }\n    },\n    \"node_modules/pend\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/pend/-/pend-1.2.0.tgz\",\n      \"integrity\": \"sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==\"\n    },\n    \"node_modules/performance-now\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz\",\n      \"integrity\": \"sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==\"\n    },\n    \"node_modules/picocolors\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz\",\n      \"integrity\": \"sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==\"\n    },\n    \"node_modules/picomatch\": {\n      \"version\": \"2.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz\",\n      \"integrity\": \"sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==\",\n      \"engines\": {\n        \"node\": \">=8.6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/jonschlinkert\"\n      }\n    },\n    \"node_modules/pify\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/pify/-/pify-2.3.0.tgz\",\n      \"integrity\": \"sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/pinejs-client-core\": {\n      \"version\": \"5.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/pinejs-client-core/-/pinejs-client-core-5.8.0.tgz\",\n      \"integrity\": \"sha512-O+tDtZMnj63WqMQd9LRJC6qJJn6fFHdpOt0Sm3W6MQWDUmFUu02VYR0p0PCegePC8XPp0TMR0TSejYRrg4NMtQ==\",\n      \"dependencies\": {\n        \"@balena/es-version\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/pinejs-client-fetch\": {\n      \"version\": \"0.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/pinejs-client-fetch/-/pinejs-client-fetch-0.2.2.tgz\",\n      \"integrity\": \"sha512-HNCcJR5bhh1zia29qwhRw0KPd2NLSVwgbAU/goyO7sDahnV2eCGIONRHILi4WLgDoxOdS9nU96sKkRjKuN+sxw==\",\n      \"dependencies\": {\n        \"pinejs-client-core\": \"^5.7.0\"\n      }\n    },\n    \"node_modules/please-upgrade-node\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz\",\n      \"integrity\": \"sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"semver-compare\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/plist\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/plist/-/plist-3.1.0.tgz\",\n      \"integrity\": \"sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@xmldom/xmldom\": \"^0.8.8\",\n        \"base64-js\": \"^1.5.1\",\n        \"xmlbuilder\": \"^15.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=10.4.0\"\n      }\n    },\n    \"node_modules/possible-typed-array-names\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz\",\n      \"integrity\": \"sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/postcss\": {\n      \"version\": \"8.4.38\",\n      \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz\",\n      \"integrity\": \"sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"opencollective\",\n          \"url\": \"https://opencollective.com/postcss/\"\n        },\n        {\n          \"type\": \"tidelift\",\n          \"url\": \"https://tidelift.com/funding/github/npm/postcss\"\n        },\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/ai\"\n        }\n      ],\n      \"dependencies\": {\n        \"nanoid\": \"^3.3.7\",\n        \"picocolors\": \"^1.0.0\",\n        \"source-map-js\": \"^1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \"^10 || ^12 || >=14\"\n      }\n    },\n    \"node_modules/postcss-modules-extract-imports\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz\",\n      \"integrity\": \"sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^10 || ^12 || >= 14\"\n      },\n      \"peerDependencies\": {\n        \"postcss\": \"^8.1.0\"\n      }\n    },\n    \"node_modules/postcss-modules-local-by-default\": {\n      \"version\": \"4.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz\",\n      \"integrity\": \"sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"icss-utils\": \"^5.0.0\",\n        \"postcss-selector-parser\": \"^6.0.2\",\n        \"postcss-value-parser\": \"^4.1.0\"\n      },\n      \"engines\": {\n        \"node\": \"^10 || ^12 || >= 14\"\n      },\n      \"peerDependencies\": {\n        \"postcss\": \"^8.1.0\"\n      }\n    },\n    \"node_modules/postcss-modules-scope\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz\",\n      \"integrity\": \"sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"postcss-selector-parser\": \"^6.0.4\"\n      },\n      \"engines\": {\n        \"node\": \"^10 || ^12 || >= 14\"\n      },\n      \"peerDependencies\": {\n        \"postcss\": \"^8.1.0\"\n      }\n    },\n    \"node_modules/postcss-modules-values\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz\",\n      \"integrity\": \"sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"icss-utils\": \"^5.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^10 || ^12 || >= 14\"\n      },\n      \"peerDependencies\": {\n        \"postcss\": \"^8.1.0\"\n      }\n    },\n    \"node_modules/postcss-selector-parser\": {\n      \"version\": \"6.0.16\",\n      \"resolved\": \"https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz\",\n      \"integrity\": \"sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"cssesc\": \"^3.0.0\",\n        \"util-deprecate\": \"^1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/postcss-value-parser\": {\n      \"version\": \"4.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz\",\n      \"integrity\": \"sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==\"\n    },\n    \"node_modules/postject\": {\n      \"version\": \"1.0.0-alpha.6\",\n      \"resolved\": \"https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz\",\n      \"integrity\": \"sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"commander\": \"^9.4.0\"\n      },\n      \"bin\": {\n        \"postject\": \"dist/cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/postject/node_modules/commander\": {\n      \"version\": \"9.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-9.5.0.tgz\",\n      \"integrity\": \"sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.20.0 || >=14\"\n      }\n    },\n    \"node_modules/prebuild-install\": {\n      \"version\": \"7.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz\",\n      \"integrity\": \"sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==\",\n      \"dependencies\": {\n        \"detect-libc\": \"^2.0.0\",\n        \"expand-template\": \"^2.0.3\",\n        \"github-from-package\": \"0.0.0\",\n        \"minimist\": \"^1.2.3\",\n        \"mkdirp-classic\": \"^0.5.3\",\n        \"napi-build-utils\": \"^1.0.1\",\n        \"node-abi\": \"^3.3.0\",\n        \"pump\": \"^3.0.0\",\n        \"rc\": \"^1.2.7\",\n        \"simple-get\": \"^4.0.0\",\n        \"tar-fs\": \"^2.0.0\",\n        \"tunnel-agent\": \"^0.6.0\"\n      },\n      \"bin\": {\n        \"prebuild-install\": \"bin.js\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/prebuild-install/node_modules/chownr\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz\",\n      \"integrity\": \"sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==\"\n    },\n    \"node_modules/prebuild-install/node_modules/tar-fs\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz\",\n      \"integrity\": \"sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==\",\n      \"dependencies\": {\n        \"chownr\": \"^1.1.1\",\n        \"mkdirp-classic\": \"^0.5.2\",\n        \"pump\": \"^3.0.0\",\n        \"tar-stream\": \"^2.1.4\"\n      }\n    },\n    \"node_modules/prebuild-install/node_modules/tar-stream\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz\",\n      \"integrity\": \"sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==\",\n      \"dependencies\": {\n        \"bl\": \"^4.0.3\",\n        \"end-of-stream\": \"^1.4.1\",\n        \"fs-constants\": \"^1.0.0\",\n        \"inherits\": \"^2.0.3\",\n        \"readable-stream\": \"^3.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/prebuildify\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/prebuildify/-/prebuildify-6.0.1.tgz\",\n      \"integrity\": \"sha512-8Y2oOOateom/s8dNBsGIcnm6AxPmLH4/nanQzL5lQMU+sC0CMhzARZHizwr36pUPLdvBnOkCNQzxg4djuFSgIw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"minimist\": \"^1.2.5\",\n        \"mkdirp-classic\": \"^0.5.3\",\n        \"node-abi\": \"^3.3.0\",\n        \"npm-run-path\": \"^3.1.0\",\n        \"pump\": \"^3.0.0\",\n        \"tar-fs\": \"^2.1.0\"\n      },\n      \"bin\": {\n        \"prebuildify\": \"bin.js\"\n      }\n    },\n    \"node_modules/prebuildify/node_modules/chownr\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz\",\n      \"integrity\": \"sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/prebuildify/node_modules/npm-run-path\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz\",\n      \"integrity\": \"sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"path-key\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/prebuildify/node_modules/tar-fs\": {\n      \"version\": \"2.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz\",\n      \"integrity\": \"sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"chownr\": \"^1.1.1\",\n        \"mkdirp-classic\": \"^0.5.2\",\n        \"pump\": \"^3.0.0\",\n        \"tar-stream\": \"^2.1.4\"\n      }\n    },\n    \"node_modules/prebuildify/node_modules/tar-stream\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz\",\n      \"integrity\": \"sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"bl\": \"^4.0.3\",\n        \"end-of-stream\": \"^1.4.1\",\n        \"fs-constants\": \"^1.0.0\",\n        \"inherits\": \"^2.0.3\",\n        \"readable-stream\": \"^3.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/prelude-ls\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz\",\n      \"integrity\": \"sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/prepend-http\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz\",\n      \"integrity\": \"sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/prettier\": {\n      \"version\": \"3.2.5\",\n      \"resolved\": \"https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz\",\n      \"integrity\": \"sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==\",\n      \"dev\": true,\n      \"bin\": {\n        \"prettier\": \"bin/prettier.cjs\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/prettier/prettier?sponsor=1\"\n      }\n    },\n    \"node_modules/pretty-bytes\": {\n      \"version\": \"6.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz\",\n      \"integrity\": \"sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==\",\n      \"engines\": {\n        \"node\": \"^14.13.1 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/pretty-error\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz\",\n      \"integrity\": \"sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"lodash\": \"^4.17.20\",\n        \"renderkid\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/pretty-format\": {\n      \"version\": \"29.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz\",\n      \"integrity\": \"sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jest/schemas\": \"^29.6.3\",\n        \"ansi-styles\": \"^5.0.0\",\n        \"react-is\": \"^18.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/pretty-format/node_modules/ansi-styles\": {\n      \"version\": \"5.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz\",\n      \"integrity\": \"sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/pretty-ms\": {\n      \"version\": \"7.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz\",\n      \"integrity\": \"sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"parse-ms\": \"^2.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/prismjs\": {\n      \"version\": \"1.29.0\",\n      \"resolved\": \"https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz\",\n      \"integrity\": \"sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/proc-log\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz\",\n      \"integrity\": \"sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \"^12.13.0 || ^14.15.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/process\": {\n      \"version\": \"0.11.10\",\n      \"resolved\": \"https://registry.npmjs.org/process/-/process-0.11.10.tgz\",\n      \"integrity\": \"sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.6.0\"\n      }\n    },\n    \"node_modules/process-nextick-args\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz\",\n      \"integrity\": \"sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==\",\n      \"dev\": true\n    },\n    \"node_modules/progress\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/progress/-/progress-2.0.3.tgz\",\n      \"integrity\": \"sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==\",\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/promise\": {\n      \"version\": \"8.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/promise/-/promise-8.3.0.tgz\",\n      \"integrity\": \"sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==\",\n      \"dependencies\": {\n        \"asap\": \"~2.0.6\"\n      }\n    },\n    \"node_modules/promise-inflight\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz\",\n      \"integrity\": \"sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==\",\n      \"dev\": true,\n      \"license\": \"ISC\"\n    },\n    \"node_modules/promise-retry\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz\",\n      \"integrity\": \"sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"err-code\": \"^2.0.2\",\n        \"retry\": \"^0.12.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/prop-ini\": {\n      \"version\": \"0.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/prop-ini/-/prop-ini-0.0.2.tgz\",\n      \"integrity\": \"sha512-qyU57WvAvZDbzmRy9xDbJGVwrGJhmA+rYnVjy4xtX4Ny9c7gzvpmf/j7A3oq9ChbPh15MZQKjPep2mNdnAhtig==\",\n      \"dependencies\": {\n        \"extend\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/prop-types\": {\n      \"version\": \"15.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz\",\n      \"integrity\": \"sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==\",\n      \"dependencies\": {\n        \"loose-envify\": \"^1.4.0\",\n        \"object-assign\": \"^4.1.1\",\n        \"react-is\": \"^16.13.1\"\n      }\n    },\n    \"node_modules/prop-types/node_modules/react-is\": {\n      \"version\": \"16.13.1\",\n      \"resolved\": \"https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz\",\n      \"integrity\": \"sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==\"\n    },\n    \"node_modules/property-information\": {\n      \"version\": \"5.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz\",\n      \"integrity\": \"sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==\",\n      \"dependencies\": {\n        \"xtend\": \"^4.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/proxy-addr\": {\n      \"version\": \"2.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz\",\n      \"integrity\": \"sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"forwarded\": \"0.2.0\",\n        \"ipaddr.js\": \"1.9.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.10\"\n      }\n    },\n    \"node_modules/proxy-agent\": {\n      \"version\": \"6.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.1.tgz\",\n      \"integrity\": \"sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"agent-base\": \"^7.0.2\",\n        \"debug\": \"^4.3.4\",\n        \"http-proxy-agent\": \"^7.0.0\",\n        \"https-proxy-agent\": \"^7.0.2\",\n        \"lru-cache\": \"^7.14.1\",\n        \"pac-proxy-agent\": \"^7.0.1\",\n        \"proxy-from-env\": \"^1.1.0\",\n        \"socks-proxy-agent\": \"^8.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/proxy-agent/node_modules/https-proxy-agent\": {\n      \"version\": \"7.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz\",\n      \"integrity\": \"sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"agent-base\": \"^7.0.2\",\n        \"debug\": \"4\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/proxy-agent/node_modules/lru-cache\": {\n      \"version\": \"7.18.3\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz\",\n      \"integrity\": \"sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/proxy-agent/node_modules/socks-proxy-agent\": {\n      \"version\": \"8.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz\",\n      \"integrity\": \"sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"agent-base\": \"^7.1.1\",\n        \"debug\": \"^4.3.4\",\n        \"socks\": \"^2.7.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/proxy-from-env\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz\",\n      \"integrity\": \"sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==\"\n    },\n    \"node_modules/pseudomap\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz\",\n      \"integrity\": \"sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==\"\n    },\n    \"node_modules/pump\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/pump/-/pump-3.0.0.tgz\",\n      \"integrity\": \"sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==\",\n      \"dependencies\": {\n        \"end-of-stream\": \"^1.1.0\",\n        \"once\": \"^1.3.1\"\n      }\n    },\n    \"node_modules/punycode\": {\n      \"version\": \"2.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz\",\n      \"integrity\": \"sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/pupa\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz\",\n      \"integrity\": \"sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==\",\n      \"dependencies\": {\n        \"escape-goat\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/puppeteer-core\": {\n      \"version\": \"20.9.0\",\n      \"resolved\": \"https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz\",\n      \"integrity\": \"sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@puppeteer/browsers\": \"1.4.6\",\n        \"chromium-bidi\": \"0.4.16\",\n        \"cross-fetch\": \"4.0.0\",\n        \"debug\": \"4.3.4\",\n        \"devtools-protocol\": \"0.0.1147663\",\n        \"ws\": \"8.13.0\"\n      },\n      \"engines\": {\n        \"node\": \">=16.3.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">= 4.7.4\"\n      },\n      \"peerDependenciesMeta\": {\n        \"typescript\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/puppeteer-core/node_modules/@puppeteer/browsers\": {\n      \"version\": \"1.4.6\",\n      \"resolved\": \"https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz\",\n      \"integrity\": \"sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"debug\": \"4.3.4\",\n        \"extract-zip\": \"2.0.1\",\n        \"progress\": \"2.0.3\",\n        \"proxy-agent\": \"6.3.0\",\n        \"tar-fs\": \"3.0.4\",\n        \"unbzip2-stream\": \"1.4.3\",\n        \"yargs\": \"17.7.1\"\n      },\n      \"bin\": {\n        \"browsers\": \"lib/cjs/main-cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=16.3.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">= 4.7.4\"\n      },\n      \"peerDependenciesMeta\": {\n        \"typescript\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/puppeteer-core/node_modules/devtools-protocol\": {\n      \"version\": \"0.0.1147663\",\n      \"resolved\": \"https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz\",\n      \"integrity\": \"sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==\",\n      \"dev\": true\n    },\n    \"node_modules/puppeteer-core/node_modules/https-proxy-agent\": {\n      \"version\": \"7.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz\",\n      \"integrity\": \"sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"agent-base\": \"^7.0.2\",\n        \"debug\": \"4\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/puppeteer-core/node_modules/lru-cache\": {\n      \"version\": \"7.18.3\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz\",\n      \"integrity\": \"sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/puppeteer-core/node_modules/proxy-agent\": {\n      \"version\": \"6.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz\",\n      \"integrity\": \"sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"agent-base\": \"^7.0.2\",\n        \"debug\": \"^4.3.4\",\n        \"http-proxy-agent\": \"^7.0.0\",\n        \"https-proxy-agent\": \"^7.0.0\",\n        \"lru-cache\": \"^7.14.1\",\n        \"pac-proxy-agent\": \"^7.0.0\",\n        \"proxy-from-env\": \"^1.1.0\",\n        \"socks-proxy-agent\": \"^8.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/puppeteer-core/node_modules/socks-proxy-agent\": {\n      \"version\": \"8.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz\",\n      \"integrity\": \"sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"agent-base\": \"^7.1.1\",\n        \"debug\": \"^4.3.4\",\n        \"socks\": \"^2.7.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/puppeteer-core/node_modules/ws\": {\n      \"version\": \"8.13.0\",\n      \"resolved\": \"https://registry.npmjs.org/ws/-/ws-8.13.0.tgz\",\n      \"integrity\": \"sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10.0.0\"\n      },\n      \"peerDependencies\": {\n        \"bufferutil\": \"^4.0.1\",\n        \"utf-8-validate\": \">=5.0.2\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bufferutil\": {\n          \"optional\": true\n        },\n        \"utf-8-validate\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/puppeteer-core/node_modules/y18n\": {\n      \"version\": \"5.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz\",\n      \"integrity\": \"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/puppeteer-core/node_modules/yargs\": {\n      \"version\": \"17.7.1\",\n      \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz\",\n      \"integrity\": \"sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"cliui\": \"^8.0.1\",\n        \"escalade\": \"^3.1.1\",\n        \"get-caller-file\": \"^2.0.5\",\n        \"require-directory\": \"^2.1.1\",\n        \"string-width\": \"^4.2.3\",\n        \"y18n\": \"^5.0.5\",\n        \"yargs-parser\": \"^21.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/qs\": {\n      \"version\": \"6.11.0\",\n      \"resolved\": \"https://registry.npmjs.org/qs/-/qs-6.11.0.tgz\",\n      \"integrity\": \"sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==\",\n      \"dependencies\": {\n        \"side-channel\": \"^1.0.4\"\n      },\n      \"engines\": {\n        \"node\": \">=0.6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/query-selector-shadow-dom\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz\",\n      \"integrity\": \"sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==\",\n      \"dev\": true\n    },\n    \"node_modules/queue-microtask\": {\n      \"version\": \"1.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz\",\n      \"integrity\": \"sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ]\n    },\n    \"node_modules/queue-tick\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz\",\n      \"integrity\": \"sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==\",\n      \"dev\": true\n    },\n    \"node_modules/quick-lru\": {\n      \"version\": \"5.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz\",\n      \"integrity\": \"sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==\",\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/raf\": {\n      \"version\": \"3.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/raf/-/raf-3.4.1.tgz\",\n      \"integrity\": \"sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==\",\n      \"dependencies\": {\n        \"performance-now\": \"^2.1.0\"\n      }\n    },\n    \"node_modules/random-path\": {\n      \"version\": \"0.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/random-path/-/random-path-0.1.2.tgz\",\n      \"integrity\": \"sha512-4jY0yoEaQ5v9StCl5kZbNIQlg1QheIDBrdkDn53EynpPb9FgO6//p3X/tgMnrC45XN6QZCzU1Xz/+pSSsJBpRw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"base32-encode\": \"^0.1.0 || ^1.0.0\",\n        \"murmur-32\": \"^0.1.0 || ^0.2.0\"\n      }\n    },\n    \"node_modules/randombytes\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz\",\n      \"integrity\": \"sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"safe-buffer\": \"^5.1.0\"\n      }\n    },\n    \"node_modules/range-parser\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz\",\n      \"integrity\": \"sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/raw-body\": {\n      \"version\": \"2.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz\",\n      \"integrity\": \"sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"bytes\": \"3.1.2\",\n        \"http-errors\": \"2.0.0\",\n        \"iconv-lite\": \"0.4.24\",\n        \"unpipe\": \"1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/rc\": {\n      \"version\": \"1.2.8\",\n      \"resolved\": \"https://registry.npmjs.org/rc/-/rc-1.2.8.tgz\",\n      \"integrity\": \"sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==\",\n      \"dependencies\": {\n        \"deep-extend\": \"^0.6.0\",\n        \"ini\": \"~1.3.0\",\n        \"minimist\": \"^1.2.0\",\n        \"strip-json-comments\": \"~2.0.1\"\n      },\n      \"bin\": {\n        \"rc\": \"cli.js\"\n      }\n    },\n    \"node_modules/rc/node_modules/strip-json-comments\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz\",\n      \"integrity\": \"sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/react\": {\n      \"version\": \"17.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/react/-/react-17.0.2.tgz\",\n      \"integrity\": \"sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==\",\n      \"dependencies\": {\n        \"loose-envify\": \"^1.1.0\",\n        \"object-assign\": \"^4.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/react-app-polyfill\": {\n      \"version\": \"1.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz\",\n      \"integrity\": \"sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g==\",\n      \"dependencies\": {\n        \"core-js\": \"^3.5.0\",\n        \"object-assign\": \"^4.1.1\",\n        \"promise\": \"^8.0.3\",\n        \"raf\": \"^3.4.1\",\n        \"regenerator-runtime\": \"^0.13.3\",\n        \"whatwg-fetch\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/react-app-polyfill/node_modules/core-js\": {\n      \"version\": \"3.37.0\",\n      \"resolved\": \"https://registry.npmjs.org/core-js/-/core-js-3.37.0.tgz\",\n      \"integrity\": \"sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug==\",\n      \"hasInstallScript\": true,\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/core-js\"\n      }\n    },\n    \"node_modules/react-app-polyfill/node_modules/regenerator-runtime\": {\n      \"version\": \"0.13.11\",\n      \"resolved\": \"https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz\",\n      \"integrity\": \"sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==\"\n    },\n    \"node_modules/react-async-script\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/react-async-script/-/react-async-script-1.2.0.tgz\",\n      \"integrity\": \"sha512-bCpkbm9JiAuMGhkqoAiC0lLkb40DJ0HOEJIku+9JDjxX3Rcs+ztEOG13wbrOskt3n2DTrjshhaQ/iay+SnGg5Q==\",\n      \"dependencies\": {\n        \"hoist-non-react-statics\": \"^3.3.0\",\n        \"prop-types\": \"^15.5.0\"\n      },\n      \"peerDependencies\": {\n        \"react\": \">=16.4.1\"\n      }\n    },\n    \"node_modules/react-dom\": {\n      \"version\": \"17.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz\",\n      \"integrity\": \"sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==\",\n      \"dependencies\": {\n        \"loose-envify\": \"^1.1.0\",\n        \"object-assign\": \"^4.1.1\",\n        \"scheduler\": \"^0.20.2\"\n      },\n      \"peerDependencies\": {\n        \"react\": \"17.0.2\"\n      }\n    },\n    \"node_modules/react-fast-compare\": {\n      \"version\": \"3.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz\",\n      \"integrity\": \"sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==\"\n    },\n    \"node_modules/react-google-recaptcha\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/react-google-recaptcha/-/react-google-recaptcha-2.1.0.tgz\",\n      \"integrity\": \"sha512-K9jr7e0CWFigi8KxC3WPvNqZZ47df2RrMAta6KmRoE4RUi7Ys6NmNjytpXpg4HI/svmQJLKR+PncEPaNJ98DqQ==\",\n      \"dependencies\": {\n        \"prop-types\": \"^15.5.0\",\n        \"react-async-script\": \"^1.1.1\"\n      },\n      \"peerDependencies\": {\n        \"react\": \">=16.4.1\"\n      }\n    },\n    \"node_modules/react-helmet\": {\n      \"version\": \"6.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz\",\n      \"integrity\": \"sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==\",\n      \"dependencies\": {\n        \"object-assign\": \"^4.1.1\",\n        \"prop-types\": \"^15.7.2\",\n        \"react-fast-compare\": \"^3.1.1\",\n        \"react-side-effect\": \"^2.1.0\"\n      },\n      \"peerDependencies\": {\n        \"react\": \">=16.3.0\"\n      }\n    },\n    \"node_modules/react-i18next\": {\n      \"version\": \"13.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/react-i18next/-/react-i18next-13.5.0.tgz\",\n      \"integrity\": \"sha512-CFJ5NDGJ2MUyBohEHxljOq/39NQ972rh1ajnadG9BjTk+UXbHLq4z5DKEbEQBDoIhUmmbuS/fIMJKo6VOax1HA==\",\n      \"dependencies\": {\n        \"@babel/runtime\": \"^7.22.5\",\n        \"html-parse-stringify\": \"^3.0.1\"\n      },\n      \"peerDependencies\": {\n        \"i18next\": \">= 23.2.3\",\n        \"react\": \">= 16.8.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"react-dom\": {\n          \"optional\": true\n        },\n        \"react-native\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/react-is\": {\n      \"version\": \"18.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/react-is/-/react-is-18.3.0.tgz\",\n      \"integrity\": \"sha512-wRiUsea88TjKDc4FBEn+sLvIDesp6brMbGWnJGjew2waAc9evdhja/2LvePc898HJbHw0L+MTWy7NhpnELAvLQ==\"\n    },\n    \"node_modules/react-notifications-component\": {\n      \"version\": \"3.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/react-notifications-component/-/react-notifications-component-3.4.1.tgz\",\n      \"integrity\": \"sha512-vS/RLdz+VlXZz0dbK+LCcdhgUdUPi1BvSo7mVp58AQDpixI9emGwI0uISXhiTSjqFn/cPibPlJOJQ8kcvgmUrQ==\",\n      \"peerDependencies\": {\n        \"react\": \"^17.0.1\"\n      }\n    },\n    \"node_modules/react-side-effect\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz\",\n      \"integrity\": \"sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==\",\n      \"peerDependencies\": {\n        \"react\": \"^16.3.0 || ^17.0.0 || ^18.0.0\"\n      }\n    },\n    \"node_modules/react-simplemde-editor\": {\n      \"version\": \"4.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/react-simplemde-editor/-/react-simplemde-editor-4.1.5.tgz\",\n      \"integrity\": \"sha512-6e+kxxpw2kNg59TgJYOTkk5OrPI+rag/I30VBnXXQrZ7ISnNp7fjPW1OGoLwK/LlPQHZXg0znYTxBQpeG+/Wfg==\",\n      \"dependencies\": {\n        \"@types/codemirror\": \"^0.0.88\",\n        \"@types/marked\": \"^0.7.4\",\n        \"easymde\": \"^2.10.1\"\n      },\n      \"peerDependencies\": {\n        \"react\": \">=15\",\n        \"react-dom\": \">=15\"\n      }\n    },\n    \"node_modules/read-binary-file-arch\": {\n      \"version\": \"1.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz\",\n      \"integrity\": \"sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"debug\": \"^4.3.4\"\n      },\n      \"bin\": {\n        \"read-binary-file-arch\": \"cli.js\"\n      }\n    },\n    \"node_modules/read-package-up\": {\n      \"version\": \"11.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz\",\n      \"integrity\": \"sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"find-up-simple\": \"^1.0.0\",\n        \"read-pkg\": \"^9.0.0\",\n        \"type-fest\": \"^4.6.0\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/read-package-up/node_modules/parse-json\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz\",\n      \"integrity\": \"sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/code-frame\": \"^7.22.13\",\n        \"index-to-position\": \"^0.1.2\",\n        \"type-fest\": \"^4.7.1\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/read-package-up/node_modules/read-pkg\": {\n      \"version\": \"9.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz\",\n      \"integrity\": \"sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/normalize-package-data\": \"^2.4.3\",\n        \"normalize-package-data\": \"^6.0.0\",\n        \"parse-json\": \"^8.0.0\",\n        \"type-fest\": \"^4.6.0\",\n        \"unicorn-magic\": \"^0.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/read-package-up/node_modules/type-fest\": {\n      \"version\": \"4.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-4.17.0.tgz\",\n      \"integrity\": \"sha512-9flrz1zkfLRH3jO3bLflmTxryzKMxVa7841VeMgBaNQGY6vH4RCcpN/sQLB7mQQYh1GZ5utT2deypMuCy4yicw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=16\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/read-pkg\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz\",\n      \"integrity\": \"sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/normalize-package-data\": \"^2.4.1\",\n        \"normalize-package-data\": \"^6.0.0\",\n        \"parse-json\": \"^7.0.0\",\n        \"type-fest\": \"^4.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">=16\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/read-pkg-up\": {\n      \"version\": \"10.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.0.0.tgz\",\n      \"integrity\": \"sha512-jgmKiS//w2Zs+YbX039CorlkOp8FIVbSAN8r8GJHDsGlmNPXo+VeHkqAwCiQVTTx5/LwLZTcEw59z3DvcLbr0g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"find-up\": \"^6.3.0\",\n        \"read-pkg\": \"^8.0.0\",\n        \"type-fest\": \"^3.12.0\"\n      },\n      \"engines\": {\n        \"node\": \">=16\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/read-pkg-up/node_modules/find-up\": {\n      \"version\": \"6.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz\",\n      \"integrity\": \"sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"locate-path\": \"^7.1.0\",\n        \"path-exists\": \"^5.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/read-pkg-up/node_modules/locate-path\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz\",\n      \"integrity\": \"sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"p-locate\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/read-pkg-up/node_modules/p-limit\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz\",\n      \"integrity\": \"sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"yocto-queue\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/read-pkg-up/node_modules/p-locate\": {\n      \"version\": \"6.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz\",\n      \"integrity\": \"sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"p-limit\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/read-pkg-up/node_modules/path-exists\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz\",\n      \"integrity\": \"sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      }\n    },\n    \"node_modules/read-pkg-up/node_modules/type-fest\": {\n      \"version\": \"3.13.1\",\n      \"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz\",\n      \"integrity\": \"sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14.16\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/read-pkg-up/node_modules/yocto-queue\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz\",\n      \"integrity\": \"sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12.20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/read-pkg/node_modules/json-parse-even-better-errors\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz\",\n      \"integrity\": \"sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^14.17.0 || ^16.13.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/read-pkg/node_modules/lines-and-columns\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz\",\n      \"integrity\": \"sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      }\n    },\n    \"node_modules/read-pkg/node_modules/parse-json\": {\n      \"version\": \"7.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/parse-json/-/parse-json-7.1.1.tgz\",\n      \"integrity\": \"sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/code-frame\": \"^7.21.4\",\n        \"error-ex\": \"^1.3.2\",\n        \"json-parse-even-better-errors\": \"^3.0.0\",\n        \"lines-and-columns\": \"^2.0.3\",\n        \"type-fest\": \"^3.8.0\"\n      },\n      \"engines\": {\n        \"node\": \">=16\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/read-pkg/node_modules/parse-json/node_modules/type-fest\": {\n      \"version\": \"3.13.1\",\n      \"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz\",\n      \"integrity\": \"sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14.16\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/read-pkg/node_modules/type-fest\": {\n      \"version\": \"4.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-4.17.0.tgz\",\n      \"integrity\": \"sha512-9flrz1zkfLRH3jO3bLflmTxryzKMxVa7841VeMgBaNQGY6vH4RCcpN/sQLB7mQQYh1GZ5utT2deypMuCy4yicw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=16\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/readable-stream\": {\n      \"version\": \"3.6.2\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz\",\n      \"integrity\": \"sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==\",\n      \"dependencies\": {\n        \"inherits\": \"^2.0.3\",\n        \"string_decoder\": \"^1.1.1\",\n        \"util-deprecate\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/readable-web-to-node-stream\": {\n      \"version\": \"3.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz\",\n      \"integrity\": \"sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==\",\n      \"dependencies\": {\n        \"readable-stream\": \"^3.6.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/Borewit\"\n      }\n    },\n    \"node_modules/readdir-glob\": {\n      \"version\": \"1.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz\",\n      \"integrity\": \"sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"minimatch\": \"^5.1.0\"\n      }\n    },\n    \"node_modules/readdir-glob/node_modules/brace-expansion\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz\",\n      \"integrity\": \"sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/readdir-glob/node_modules/minimatch\": {\n      \"version\": \"5.1.6\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz\",\n      \"integrity\": \"sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/readdirp\": {\n      \"version\": \"3.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz\",\n      \"integrity\": \"sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"picomatch\": \"^2.2.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8.10.0\"\n      }\n    },\n    \"node_modules/readme-badger\": {\n      \"version\": \"0.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/readme-badger/-/readme-badger-0.3.0.tgz\",\n      \"integrity\": \"sha512-+sMOLSs1imZUISZ2Rhz7qqVd77QtpcAPbGeIraFdgJmijb04YtdlPjGNBvDChTNtLbeQ6JNGQy3pOgslWfaP3g==\",\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/rechoir\": {\n      \"version\": \"0.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz\",\n      \"integrity\": \"sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"resolve\": \"^1.20.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.13.0\"\n      }\n    },\n    \"node_modules/recursive-readdir\": {\n      \"version\": \"2.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz\",\n      \"integrity\": \"sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"minimatch\": \"^3.0.5\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/redux\": {\n      \"version\": \"4.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/redux/-/redux-4.2.1.tgz\",\n      \"integrity\": \"sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==\",\n      \"dependencies\": {\n        \"@babel/runtime\": \"^7.9.2\"\n      }\n    },\n    \"node_modules/reflect.getprototypeof\": {\n      \"version\": \"1.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz\",\n      \"integrity\": \"sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.7\",\n        \"define-properties\": \"^1.2.1\",\n        \"es-abstract\": \"^1.23.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.4\",\n        \"globalthis\": \"^1.0.3\",\n        \"which-builtin-type\": \"^1.1.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/refractor\": {\n      \"version\": \"3.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz\",\n      \"integrity\": \"sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==\",\n      \"dependencies\": {\n        \"hastscript\": \"^6.0.0\",\n        \"parse-entities\": \"^2.0.0\",\n        \"prismjs\": \"~1.27.0\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/refractor/node_modules/prismjs\": {\n      \"version\": \"1.27.0\",\n      \"resolved\": \"https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz\",\n      \"integrity\": \"sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/regenerate\": {\n      \"version\": \"1.4.2\",\n      \"resolved\": \"https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz\",\n      \"integrity\": \"sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==\",\n      \"dev\": true\n    },\n    \"node_modules/regenerate-unicode-properties\": {\n      \"version\": \"10.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz\",\n      \"integrity\": \"sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"regenerate\": \"^1.4.2\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/regenerator-runtime\": {\n      \"version\": \"0.14.1\",\n      \"resolved\": \"https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz\",\n      \"integrity\": \"sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==\"\n    },\n    \"node_modules/regenerator-transform\": {\n      \"version\": \"0.15.2\",\n      \"resolved\": \"https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz\",\n      \"integrity\": \"sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/runtime\": \"^7.8.4\"\n      }\n    },\n    \"node_modules/regex-parser\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz\",\n      \"integrity\": \"sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==\"\n    },\n    \"node_modules/regexp-match-indices\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/regexp-match-indices/-/regexp-match-indices-1.0.2.tgz\",\n      \"integrity\": \"sha512-DwZuAkt8NF5mKwGGER1EGh2PRqyvhRhhLviH+R8y8dIuaQROlUfXjt4s9ZTXstIsSkptf06BSvwcEmmfheJJWQ==\",\n      \"dependencies\": {\n        \"regexp-tree\": \"^0.1.11\"\n      }\n    },\n    \"node_modules/regexp-tree\": {\n      \"version\": \"0.1.27\",\n      \"resolved\": \"https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz\",\n      \"integrity\": \"sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==\",\n      \"bin\": {\n        \"regexp-tree\": \"bin/regexp-tree\"\n      }\n    },\n    \"node_modules/regexp.prototype.flags\": {\n      \"version\": \"1.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz\",\n      \"integrity\": \"sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.6\",\n        \"define-properties\": \"^1.2.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"set-function-name\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/regexpu-core\": {\n      \"version\": \"5.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz\",\n      \"integrity\": \"sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/regjsgen\": \"^0.8.0\",\n        \"regenerate\": \"^1.4.2\",\n        \"regenerate-unicode-properties\": \"^10.1.0\",\n        \"regjsparser\": \"^0.9.1\",\n        \"unicode-match-property-ecmascript\": \"^2.0.0\",\n        \"unicode-match-property-value-ecmascript\": \"^2.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/registry-auth-token\": {\n      \"version\": \"4.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz\",\n      \"integrity\": \"sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==\",\n      \"dependencies\": {\n        \"rc\": \"1.2.8\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/registry-url\": {\n      \"version\": \"5.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz\",\n      \"integrity\": \"sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==\",\n      \"dependencies\": {\n        \"rc\": \"^1.2.8\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/regjsparser\": {\n      \"version\": \"0.9.1\",\n      \"resolved\": \"https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz\",\n      \"integrity\": \"sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"jsesc\": \"~0.5.0\"\n      },\n      \"bin\": {\n        \"regjsparser\": \"bin/parser\"\n      }\n    },\n    \"node_modules/regjsparser/node_modules/jsesc\": {\n      \"version\": \"0.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz\",\n      \"integrity\": \"sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==\",\n      \"dev\": true,\n      \"bin\": {\n        \"jsesc\": \"bin/jsesc\"\n      }\n    },\n    \"node_modules/rehype-autolink-headings\": {\n      \"version\": \"5.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/rehype-autolink-headings/-/rehype-autolink-headings-5.1.0.tgz\",\n      \"integrity\": \"sha512-ujU4/ALnWLJQubobQaMdC0h9nkzi7HlW9SOuCxZOkkJqhc/TrQ1cigIjMFQ2Tfc/es0KiFopKvwCUGw7Gw+mFw==\",\n      \"dependencies\": {\n        \"extend\": \"^3.0.0\",\n        \"hast-util-has-property\": \"^1.0.0\",\n        \"hast-util-heading-rank\": \"^1.0.0\",\n        \"unist-util-visit\": \"^2.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/rehype-raw\": {\n      \"version\": \"5.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/rehype-raw/-/rehype-raw-5.1.0.tgz\",\n      \"integrity\": \"sha512-MDvHAb/5mUnif2R+0IPCYJU8WjHa9UzGtM/F4AVy5GixPlDZ1z3HacYy4xojDU+uBa+0X/3PIfyQI26/2ljJNA==\",\n      \"dependencies\": {\n        \"hast-util-raw\": \"^6.1.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/rehype-react\": {\n      \"version\": \"6.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/rehype-react/-/rehype-react-6.2.1.tgz\",\n      \"integrity\": \"sha512-f9KIrjktvLvmbGc7si25HepocOg4z0MuNOtweigKzBcDjiGSTGhyz6VSgaV5K421Cq1O+z4/oxRJ5G9owo0KVg==\",\n      \"dependencies\": {\n        \"@mapbox/hast-util-table-cell-style\": \"^0.2.0\",\n        \"hast-to-hyperscript\": \"^9.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/rehype-sanitize\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/rehype-sanitize/-/rehype-sanitize-3.0.1.tgz\",\n      \"integrity\": \"sha512-tOXwIVmrFsjwFfhWPF2FYaIJ0LPEfGngQZvRfmqCsCGVCNbRlTMMcJPaLNwdUrNkKPNh/VdmA2ZzzivbQTfIMw==\",\n      \"dependencies\": {\n        \"hast-util-sanitize\": \"^2.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/rehype-sanitize/node_modules/hast-util-sanitize\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-2.0.3.tgz\",\n      \"integrity\": \"sha512-RILqWHmzU0Anmfw1KEP41LbCsJuJUVM0lQWAbTDk9+0bWqzRFXDaMdqIoRocLlOfR5NfcWyhFfZw/mGsuftwYA==\",\n      \"dependencies\": {\n        \"xtend\": \"^4.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/rehype-slug\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/rehype-slug/-/rehype-slug-4.0.1.tgz\",\n      \"integrity\": \"sha512-KIlJALf9WfHFF21icwTd2yI2IP+RQRweaxH9ChVGQwRYy36+hiomG4ZSe0yQRyCt+D/vE39LbAcOI/h4O4GPhA==\",\n      \"dependencies\": {\n        \"github-slugger\": \"^1.1.1\",\n        \"hast-util-has-property\": \"^1.0.0\",\n        \"hast-util-heading-rank\": \"^1.0.0\",\n        \"hast-util-to-string\": \"^1.0.0\",\n        \"unist-util-visit\": \"^2.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/relateurl\": {\n      \"version\": \"0.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz\",\n      \"integrity\": \"sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.10\"\n      }\n    },\n    \"node_modules/remark-breaks\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/remark-breaks/-/remark-breaks-2.0.2.tgz\",\n      \"integrity\": \"sha512-LsQnPPQ7Fzp9RTjj4IwdEmjPOr9bxe9zYKWhs9ZQOg9hMg8rOfeeqQ410cvVdIK87Famqza1CKRxNkepp2EvUA==\",\n      \"dependencies\": {\n        \"unist-util-visit\": \"^2.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/remark-parse\": {\n      \"version\": \"8.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz\",\n      \"integrity\": \"sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==\",\n      \"dependencies\": {\n        \"ccount\": \"^1.0.0\",\n        \"collapse-white-space\": \"^1.0.2\",\n        \"is-alphabetical\": \"^1.0.0\",\n        \"is-decimal\": \"^1.0.0\",\n        \"is-whitespace-character\": \"^1.0.0\",\n        \"is-word-character\": \"^1.0.0\",\n        \"markdown-escapes\": \"^1.0.0\",\n        \"parse-entities\": \"^2.0.0\",\n        \"repeat-string\": \"^1.5.4\",\n        \"state-toggle\": \"^1.0.0\",\n        \"trim\": \"0.0.1\",\n        \"trim-trailing-lines\": \"^1.0.0\",\n        \"unherit\": \"^1.0.4\",\n        \"unist-util-remove-position\": \"^2.0.0\",\n        \"vfile-location\": \"^3.0.0\",\n        \"xtend\": \"^4.0.1\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/remark-rehype\": {\n      \"version\": \"7.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/remark-rehype/-/remark-rehype-7.0.0.tgz\",\n      \"integrity\": \"sha512-uqQ/VbaTdxyu/da6npHAso6hA00cMqhA3a59RziQdOLN2KEIkPykAVy52IcmZEVTuauXO0VtpxkyCey4phtHzQ==\",\n      \"dependencies\": {\n        \"mdast-util-to-hast\": \"^9.1.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/remote-origin-url\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/remote-origin-url/-/remote-origin-url-1.0.0.tgz\",\n      \"integrity\": \"sha512-xHDM6IBqivpiQ1e4WOuFpM/T6rbzA/WBsu+3WLtgPOhHyjA0nYlijV3NprlTb4FcXlQ5+Q+z174sQ1NnUF5FwA==\",\n      \"dependencies\": {\n        \"parse-git-config\": \"^1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/renderkid\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz\",\n      \"integrity\": \"sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"css-select\": \"^4.1.3\",\n        \"dom-converter\": \"^0.2.0\",\n        \"htmlparser2\": \"^6.1.0\",\n        \"lodash\": \"^4.17.21\",\n        \"strip-ansi\": \"^6.0.1\"\n      }\n    },\n    \"node_modules/renderkid/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/rendition\": {\n      \"version\": \"35.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/rendition/-/rendition-35.2.0.tgz\",\n      \"integrity\": \"sha512-dQD/HINUOEuFhGvgD7A8ZE6kRjtr3HmfzUtNUjmAP+A5jQhJhFgS0EzUXCZhTajgXLls8XCnSleZVHrOLt/uLw==\",\n      \"dependencies\": {\n        \"@fortawesome/fontawesome-svg-core\": \"^6.1.1\",\n        \"@fortawesome/free-regular-svg-icons\": \"^6.1.1\",\n        \"@fortawesome/free-solid-svg-icons\": \"^6.1.1\",\n        \"@fortawesome/react-fontawesome\": \"^0.1.18\",\n        \"@mapbox/rehype-prism\": \"^0.8.0\",\n        \"@react-google-maps/api\": \"^2.12.0\",\n        \"@rjsf/core\": \"^2.5.1\",\n        \"@types/ajv-keywords\": \"^3.4.0\",\n        \"@types/color\": \"^3.0.3\",\n        \"@types/json-schema\": \"^7.0.11\",\n        \"@types/lodash\": \"^4.14.185\",\n        \"@types/memoizee\": \"^0.4.8\",\n        \"@types/node\": \"^14.18.29\",\n        \"@types/prop-types\": \"^15.7.5\",\n        \"@types/react-helmet\": \"^6.1.5\",\n        \"@types/styled-components\": \"^5.1.26\",\n        \"@types/styled-system\": \"^4.2.2\",\n        \"@types/uuid\": \"^3.4.10\",\n        \"ajv\": \"^6.12.6\",\n        \"ajv-keywords\": \"^3.5.2\",\n        \"color\": \"^3.2.1\",\n        \"color-hash\": \"^1.1.1\",\n        \"copy-to-clipboard\": \"^3.3.2\",\n        \"date-fns\": \"^3.0.5\",\n        \"grommet\": \"~2.18.0\",\n        \"hast-util-sanitize\": \"^3.0.2\",\n        \"json-e\": \"^4.4.3\",\n        \"lodash\": \"^4.17.21\",\n        \"memoizee\": \"^0.4.15\",\n        \"mermaid\": \"~9.2.2\",\n        \"pinejs-client-fetch\": \"^0.2.2\",\n        \"prismjs\": \"^1.25.0\",\n        \"prop-types\": \"^15.7.2\",\n        \"qs\": \"^6.10.3\",\n        \"react-google-recaptcha\": \"^2.1.0\",\n        \"react-helmet\": \"^6.1.0\",\n        \"react-notifications-component\": \"^3.0.0\",\n        \"react-simplemde-editor\": \"^4.1.5\",\n        \"regex-parser\": \"^2.2.11\",\n        \"regexp-match-indices\": \"^1.0.2\",\n        \"rehype-autolink-headings\": \"^5.1.0\",\n        \"rehype-raw\": \"^5.1.0\",\n        \"rehype-react\": \"^6.2.1\",\n        \"rehype-sanitize\": \"^3.0.1\",\n        \"rehype-slug\": \"^4.0.1\",\n        \"remark-breaks\": \"^2.0.2\",\n        \"remark-parse\": \"^8.0.3\",\n        \"remark-rehype\": \"^7.0.0\",\n        \"semver\": \"^7.3.8\",\n        \"skhema\": \"^5.3.4\",\n        \"styled-components\": \"^5.3.5\",\n        \"styled-system\": \"^4.2.4\",\n        \"tslib\": \"^2.3.1\",\n        \"unified\": \"^9.2.2\",\n        \"unist-util-visit-parents\": \"^3.1.0\",\n        \"uuid\": \"^3.4.0\",\n        \"xterm\": \"^4.18.0\",\n        \"xterm-addon-fit\": \"^0.5.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\",\n        \"npm\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/rendition/node_modules/@types/node\": {\n      \"version\": \"14.18.63\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz\",\n      \"integrity\": \"sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==\"\n    },\n    \"node_modules/rendition/node_modules/uuid\": {\n      \"version\": \"3.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz\",\n      \"integrity\": \"sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==\",\n      \"deprecated\": \"Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.\",\n      \"bin\": {\n        \"uuid\": \"bin/uuid\"\n      }\n    },\n    \"node_modules/repeat-string\": {\n      \"version\": \"1.6.1\",\n      \"resolved\": \"https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz\",\n      \"integrity\": \"sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==\",\n      \"engines\": {\n        \"node\": \">=0.10\"\n      }\n    },\n    \"node_modules/require-directory\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz\",\n      \"integrity\": \"sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/require-from-string\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz\",\n      \"integrity\": \"sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/require-main-filename\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz\",\n      \"integrity\": \"sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==\"\n    },\n    \"node_modules/require-package-name\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/require-package-name/-/require-package-name-2.0.1.tgz\",\n      \"integrity\": \"sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==\",\n      \"dev\": true\n    },\n    \"node_modules/requires-port\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz\",\n      \"integrity\": \"sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==\",\n      \"dev\": true\n    },\n    \"node_modules/resedit\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/resedit/-/resedit-2.0.3.tgz\",\n      \"integrity\": \"sha512-oTeemxwoMuxxTYxXUwjkrOPfngTQehlv0/HoYFNkB4uzsP1Un1A9nI8JQKGOFkxpqkC7qkMs0lUsGrvUlbLNUA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"pe-library\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=14\",\n        \"npm\": \">=7\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/jet2jet\"\n      }\n    },\n    \"node_modules/resolve\": {\n      \"version\": \"1.22.8\",\n      \"resolved\": \"https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz\",\n      \"integrity\": \"sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"is-core-module\": \"^2.13.0\",\n        \"path-parse\": \"^1.0.7\",\n        \"supports-preserve-symlinks-flag\": \"^1.0.0\"\n      },\n      \"bin\": {\n        \"resolve\": \"bin/resolve\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/resolve-alpn\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz\",\n      \"integrity\": \"sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==\"\n    },\n    \"node_modules/resolve-dir\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz\",\n      \"integrity\": \"sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"expand-tilde\": \"^2.0.0\",\n        \"global-modules\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/resolve-from\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz\",\n      \"integrity\": \"sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/resolve/node_modules/is-core-module\": {\n      \"version\": \"2.13.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz\",\n      \"integrity\": \"sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"hasown\": \"^2.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/responselike\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz\",\n      \"integrity\": \"sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==\",\n      \"dependencies\": {\n        \"lowercase-keys\": \"^2.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/resq\": {\n      \"version\": \"1.11.0\",\n      \"resolved\": \"https://registry.npmjs.org/resq/-/resq-1.11.0.tgz\",\n      \"integrity\": \"sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"fast-deep-equal\": \"^2.0.1\"\n      }\n    },\n    \"node_modules/resq/node_modules/fast-deep-equal\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz\",\n      \"integrity\": \"sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==\",\n      \"dev\": true\n    },\n    \"node_modules/restore-cursor\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz\",\n      \"integrity\": \"sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==\",\n      \"dependencies\": {\n        \"onetime\": \"^5.1.0\",\n        \"signal-exit\": \"^3.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/restore-cursor/node_modules/mimic-fn\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz\",\n      \"integrity\": \"sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/restore-cursor/node_modules/onetime\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz\",\n      \"integrity\": \"sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==\",\n      \"dependencies\": {\n        \"mimic-fn\": \"^2.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/restore-cursor/node_modules/signal-exit\": {\n      \"version\": \"3.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz\",\n      \"integrity\": \"sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==\"\n    },\n    \"node_modules/retry\": {\n      \"version\": \"0.12.0\",\n      \"resolved\": \"https://registry.npmjs.org/retry/-/retry-0.12.0.tgz\",\n      \"integrity\": \"sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 4\"\n      }\n    },\n    \"node_modules/reusify\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz\",\n      \"integrity\": \"sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"iojs\": \">=1.0.0\",\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/rfdc\": {\n      \"version\": \"1.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz\",\n      \"integrity\": \"sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==\",\n      \"dev\": true\n    },\n    \"node_modules/rgb2hex\": {\n      \"version\": \"0.2.5\",\n      \"resolved\": \"https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.2.5.tgz\",\n      \"integrity\": \"sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==\",\n      \"dev\": true\n    },\n    \"node_modules/rimraf\": {\n      \"version\": \"3.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz\",\n      \"integrity\": \"sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"glob\": \"^7.1.3\"\n      },\n      \"bin\": {\n        \"rimraf\": \"bin.js\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/rimraf/node_modules/glob\": {\n      \"version\": \"7.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-7.2.3.tgz\",\n      \"integrity\": \"sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"fs.realpath\": \"^1.0.0\",\n        \"inflight\": \"^1.0.4\",\n        \"inherits\": \"2\",\n        \"minimatch\": \"^3.1.1\",\n        \"once\": \"^1.3.0\",\n        \"path-is-absolute\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/roarr\": {\n      \"version\": \"2.15.4\",\n      \"resolved\": \"https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz\",\n      \"integrity\": \"sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"boolean\": \"^3.0.1\",\n        \"detect-node\": \"^2.0.4\",\n        \"globalthis\": \"^1.0.1\",\n        \"json-stringify-safe\": \"^5.0.1\",\n        \"semver-compare\": \"^1.0.0\",\n        \"sprintf-js\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">=8.0\"\n      }\n    },\n    \"node_modules/robust-predicates\": {\n      \"version\": \"3.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz\",\n      \"integrity\": \"sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==\"\n    },\n    \"node_modules/run-async\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz\",\n      \"integrity\": \"sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.12.0\"\n      }\n    },\n    \"node_modules/run-parallel\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz\",\n      \"integrity\": \"sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"dependencies\": {\n        \"queue-microtask\": \"^1.2.2\"\n      }\n    },\n    \"node_modules/rw\": {\n      \"version\": \"1.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/rw/-/rw-1.3.3.tgz\",\n      \"integrity\": \"sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==\"\n    },\n    \"node_modules/rwmutex\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/rwmutex/-/rwmutex-1.0.0.tgz\",\n      \"integrity\": \"sha512-1sLNznM7PB0Grdi3NjddvfzP+dWMlaeKPf98W6On5l1yNcuKkqJ8FYCEFHhMRwoqp2iTGaDMPrsRgnKiSKbwQQ==\",\n      \"dependencies\": {\n        \"debug\": \"^3.0.1\"\n      }\n    },\n    \"node_modules/rwmutex/node_modules/debug\": {\n      \"version\": \"3.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-3.2.7.tgz\",\n      \"integrity\": \"sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==\",\n      \"dependencies\": {\n        \"ms\": \"^2.1.1\"\n      }\n    },\n    \"node_modules/rxjs\": {\n      \"version\": \"7.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz\",\n      \"integrity\": \"sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"tslib\": \"^2.1.0\"\n      }\n    },\n    \"node_modules/safaridriver\": {\n      \"version\": \"0.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safaridriver/-/safaridriver-0.1.2.tgz\",\n      \"integrity\": \"sha512-4R309+gWflJktzPXBQCobbWEHlzC4aK3a+Ov3tz2Ib2aBxiwd11phkdIBH1l0EO22x24CJMUQkpKFumRriCSRg==\",\n      \"dev\": true\n    },\n    \"node_modules/safe-array-concat\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz\",\n      \"integrity\": \"sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.7\",\n        \"get-intrinsic\": \"^1.2.4\",\n        \"has-symbols\": \"^1.0.3\",\n        \"isarray\": \"^2.0.5\"\n      },\n      \"engines\": {\n        \"node\": \">=0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/safe-buffer\": {\n      \"version\": \"5.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz\",\n      \"integrity\": \"sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ]\n    },\n    \"node_modules/safe-regex-test\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz\",\n      \"integrity\": \"sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.6\",\n        \"es-errors\": \"^1.3.0\",\n        \"is-regex\": \"^1.1.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/safer-buffer\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz\",\n      \"integrity\": \"sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==\"\n    },\n    \"node_modules/sax\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/sax/-/sax-1.3.0.tgz\",\n      \"integrity\": \"sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==\"\n    },\n    \"node_modules/scheduler\": {\n      \"version\": \"0.20.2\",\n      \"resolved\": \"https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz\",\n      \"integrity\": \"sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==\",\n      \"dependencies\": {\n        \"loose-envify\": \"^1.1.0\",\n        \"object-assign\": \"^4.1.1\"\n      }\n    },\n    \"node_modules/schema-utils\": {\n      \"version\": \"3.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz\",\n      \"integrity\": \"sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/json-schema\": \"^7.0.8\",\n        \"ajv\": \"^6.12.5\",\n        \"ajv-keywords\": \"^3.5.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.13.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/webpack\"\n      }\n    },\n    \"node_modules/schemapack\": {\n      \"version\": \"1.4.2\",\n      \"resolved\": \"https://registry.npmjs.org/schemapack/-/schemapack-1.4.2.tgz\",\n      \"integrity\": \"sha512-jVc7vmXDjj9DlPQjD79+S8Mqt29kRFqGeZV1to7vVtFoadKAYHqsvtsxWFpQRSvfH00uuqZ+wkKLcrSYB+kEQA==\",\n      \"engines\": {\n        \"node\": \">=0.11.15\"\n      }\n    },\n    \"node_modules/select-hose\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz\",\n      \"integrity\": \"sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==\",\n      \"dev\": true\n    },\n    \"node_modules/selfsigned\": {\n      \"version\": \"2.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz\",\n      \"integrity\": \"sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/node-forge\": \"^1.3.0\",\n        \"node-forge\": \"^1\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/semver\": {\n      \"version\": \"7.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-7.6.0.tgz\",\n      \"integrity\": \"sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==\",\n      \"dependencies\": {\n        \"lru-cache\": \"^6.0.0\"\n      },\n      \"bin\": {\n        \"semver\": \"bin/semver.js\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/semver-compare\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz\",\n      \"integrity\": \"sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==\",\n      \"devOptional\": true\n    },\n    \"node_modules/semver-diff\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz\",\n      \"integrity\": \"sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==\",\n      \"dependencies\": {\n        \"semver\": \"^6.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/semver-diff/node_modules/semver\": {\n      \"version\": \"6.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n      \"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n      \"bin\": {\n        \"semver\": \"bin/semver.js\"\n      }\n    },\n    \"node_modules/semver-regex\": {\n      \"version\": \"4.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz\",\n      \"integrity\": \"sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/semver-utils\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz\",\n      \"integrity\": \"sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==\"\n    },\n    \"node_modules/semver/node_modules/lru-cache\": {\n      \"version\": \"6.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz\",\n      \"integrity\": \"sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==\",\n      \"dependencies\": {\n        \"yallist\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/semver/node_modules/yallist\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz\",\n      \"integrity\": \"sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==\"\n    },\n    \"node_modules/send\": {\n      \"version\": \"0.18.0\",\n      \"resolved\": \"https://registry.npmjs.org/send/-/send-0.18.0.tgz\",\n      \"integrity\": \"sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"debug\": \"2.6.9\",\n        \"depd\": \"2.0.0\",\n        \"destroy\": \"1.2.0\",\n        \"encodeurl\": \"~1.0.2\",\n        \"escape-html\": \"~1.0.3\",\n        \"etag\": \"~1.8.1\",\n        \"fresh\": \"0.5.2\",\n        \"http-errors\": \"2.0.0\",\n        \"mime\": \"1.6.0\",\n        \"ms\": \"2.1.3\",\n        \"on-finished\": \"2.4.1\",\n        \"range-parser\": \"~1.2.1\",\n        \"statuses\": \"2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/send/node_modules/debug\": {\n      \"version\": \"2.6.9\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-2.6.9.tgz\",\n      \"integrity\": \"sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ms\": \"2.0.0\"\n      }\n    },\n    \"node_modules/send/node_modules/debug/node_modules/ms\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz\",\n      \"integrity\": \"sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==\",\n      \"dev\": true\n    },\n    \"node_modules/send/node_modules/ms\": {\n      \"version\": \"2.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n      \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\n      \"dev\": true\n    },\n    \"node_modules/serialize-error\": {\n      \"version\": \"7.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz\",\n      \"integrity\": \"sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"type-fest\": \"^0.13.1\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/serialize-error/node_modules/type-fest\": {\n      \"version\": \"0.13.1\",\n      \"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz\",\n      \"integrity\": \"sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/serialize-javascript\": {\n      \"version\": \"6.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz\",\n      \"integrity\": \"sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"randombytes\": \"^2.1.0\"\n      }\n    },\n    \"node_modules/serve-index\": {\n      \"version\": \"1.9.1\",\n      \"resolved\": \"https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz\",\n      \"integrity\": \"sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"accepts\": \"~1.3.4\",\n        \"batch\": \"0.6.1\",\n        \"debug\": \"2.6.9\",\n        \"escape-html\": \"~1.0.3\",\n        \"http-errors\": \"~1.6.2\",\n        \"mime-types\": \"~2.1.17\",\n        \"parseurl\": \"~1.3.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/serve-index/node_modules/debug\": {\n      \"version\": \"2.6.9\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-2.6.9.tgz\",\n      \"integrity\": \"sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ms\": \"2.0.0\"\n      }\n    },\n    \"node_modules/serve-index/node_modules/depd\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/depd/-/depd-1.1.2.tgz\",\n      \"integrity\": \"sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/serve-index/node_modules/http-errors\": {\n      \"version\": \"1.6.3\",\n      \"resolved\": \"https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz\",\n      \"integrity\": \"sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"depd\": \"~1.1.2\",\n        \"inherits\": \"2.0.3\",\n        \"setprototypeof\": \"1.1.0\",\n        \"statuses\": \">= 1.4.0 < 2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/serve-index/node_modules/inherits\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz\",\n      \"integrity\": \"sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==\",\n      \"dev\": true\n    },\n    \"node_modules/serve-index/node_modules/ms\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz\",\n      \"integrity\": \"sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==\",\n      \"dev\": true\n    },\n    \"node_modules/serve-index/node_modules/setprototypeof\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz\",\n      \"integrity\": \"sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==\",\n      \"dev\": true\n    },\n    \"node_modules/serve-index/node_modules/statuses\": {\n      \"version\": \"1.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz\",\n      \"integrity\": \"sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/serve-static\": {\n      \"version\": \"1.15.0\",\n      \"resolved\": \"https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz\",\n      \"integrity\": \"sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"encodeurl\": \"~1.0.2\",\n        \"escape-html\": \"~1.0.3\",\n        \"parseurl\": \"~1.3.3\",\n        \"send\": \"0.18.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/set-blocking\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz\",\n      \"integrity\": \"sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==\"\n    },\n    \"node_modules/set-function-length\": {\n      \"version\": \"1.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz\",\n      \"integrity\": \"sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==\",\n      \"dependencies\": {\n        \"define-data-property\": \"^1.1.4\",\n        \"es-errors\": \"^1.3.0\",\n        \"function-bind\": \"^1.1.2\",\n        \"get-intrinsic\": \"^1.2.4\",\n        \"gopd\": \"^1.0.1\",\n        \"has-property-descriptors\": \"^1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/set-function-name\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz\",\n      \"integrity\": \"sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"define-data-property\": \"^1.1.4\",\n        \"es-errors\": \"^1.3.0\",\n        \"functions-have-names\": \"^1.2.3\",\n        \"has-property-descriptors\": \"^1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/setimmediate\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz\",\n      \"integrity\": \"sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==\",\n      \"dev\": true\n    },\n    \"node_modules/setprototypeof\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz\",\n      \"integrity\": \"sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==\",\n      \"dev\": true\n    },\n    \"node_modules/shallow-clone\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz\",\n      \"integrity\": \"sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"kind-of\": \"^6.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/shallowequal\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz\",\n      \"integrity\": \"sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==\"\n    },\n    \"node_modules/shebang-command\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz\",\n      \"integrity\": \"sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==\",\n      \"dependencies\": {\n        \"shebang-regex\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/shebang-regex\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz\",\n      \"integrity\": \"sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/shell-quote\": {\n      \"version\": \"1.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz\",\n      \"integrity\": \"sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==\",\n      \"dev\": true,\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/shortid\": {\n      \"version\": \"2.2.16\",\n      \"resolved\": \"https://registry.npmjs.org/shortid/-/shortid-2.2.16.tgz\",\n      \"integrity\": \"sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==\",\n      \"deprecated\": \"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.\",\n      \"dependencies\": {\n        \"nanoid\": \"^2.1.0\"\n      }\n    },\n    \"node_modules/shortid/node_modules/nanoid\": {\n      \"version\": \"2.1.11\",\n      \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz\",\n      \"integrity\": \"sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==\"\n    },\n    \"node_modules/side-channel\": {\n      \"version\": \"1.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz\",\n      \"integrity\": \"sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==\",\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.7\",\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.4\",\n        \"object-inspect\": \"^1.13.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/sigmund\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz\",\n      \"integrity\": \"sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==\"\n    },\n    \"node_modules/signal-exit\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz\",\n      \"integrity\": \"sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==\",\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/simple-concat\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz\",\n      \"integrity\": \"sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ]\n    },\n    \"node_modules/simple-get\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz\",\n      \"integrity\": \"sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"dependencies\": {\n        \"decompress-response\": \"^6.0.0\",\n        \"once\": \"^1.3.1\",\n        \"simple-concat\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/simple-swizzle\": {\n      \"version\": \"0.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz\",\n      \"integrity\": \"sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==\",\n      \"dependencies\": {\n        \"is-arrayish\": \"^0.3.1\"\n      }\n    },\n    \"node_modules/simple-swizzle/node_modules/is-arrayish\": {\n      \"version\": \"0.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz\",\n      \"integrity\": \"sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==\"\n    },\n    \"node_modules/sinon\": {\n      \"version\": \"17.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/sinon/-/sinon-17.0.1.tgz\",\n      \"integrity\": \"sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@sinonjs/commons\": \"^3.0.0\",\n        \"@sinonjs/fake-timers\": \"^11.2.2\",\n        \"@sinonjs/samsam\": \"^8.0.0\",\n        \"diff\": \"^5.1.0\",\n        \"nise\": \"^5.1.5\",\n        \"supports-color\": \"^7.2.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/sinon\"\n      }\n    },\n    \"node_modules/skhema\": {\n      \"version\": \"5.3.4\",\n      \"resolved\": \"https://registry.npmjs.org/skhema/-/skhema-5.3.4.tgz\",\n      \"integrity\": \"sha512-2xYL0EwAjqFfbr414RP/wKfM1fRd30kJAS2RsOA+UDq/vvszZeLXZWK9yTPYrr31rQzrczLMvLuD4z74EC3VBw==\",\n      \"dependencies\": {\n        \"@types/json-schema\": \"^6.0.1\",\n        \"ajv\": \"^6.5.1\",\n        \"ajv-keywords\": \"^3.2.0\",\n        \"deep-copy\": \"^1.4.2\",\n        \"fast-memoize\": \"^2.5.1\",\n        \"json-schema-faker\": \"^0.5.0-rc16\",\n        \"json-schema-merge-allof\": \"^0.6.0\",\n        \"lodash\": \"^4.17.19\",\n        \"lru-cache\": \"^5.1.1\",\n        \"typed-error\": \"^3.2.0\"\n      }\n    },\n    \"node_modules/skhema/node_modules/@types/json-schema\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/@types/json-schema/-/json-schema-6.0.1.tgz\",\n      \"integrity\": \"sha512-vuL/tG01yKO//gmCmnV3OZhx2hs538t+7FpQq//sUV1sF6xiKi5V8F60dvAxe/HkC4+QaMCHqrm/akqlppTAkQ==\"\n    },\n    \"node_modules/slash\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/slash/-/slash-3.0.0.tgz\",\n      \"integrity\": \"sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/slice-ansi\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz\",\n      \"integrity\": \"sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-styles\": \"^6.0.0\",\n        \"is-fullwidth-code-point\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/slice-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/slice-ansi/node_modules/ansi-styles\": {\n      \"version\": \"6.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz\",\n      \"integrity\": \"sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/smart-buffer\": {\n      \"version\": \"4.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz\",\n      \"integrity\": \"sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==\",\n      \"engines\": {\n        \"node\": \">= 6.0.0\",\n        \"npm\": \">= 3.0.0\"\n      }\n    },\n    \"node_modules/smpltmpl\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/smpltmpl/-/smpltmpl-1.0.2.tgz\",\n      \"integrity\": \"sha512-Hq23NNgeZigOzIiX1dkb6W3gFn2/XQj43KhPxu65IMieG/gIwf/lQb1IudjYv0c/5LwJeS/mPayYzyo+8WJMxQ==\",\n      \"dependencies\": {\n        \"babel-code-frame\": \"^6.26.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/snake-case\": {\n      \"version\": \"3.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz\",\n      \"integrity\": \"sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"dot-case\": \"^3.0.4\",\n        \"tslib\": \"^2.0.3\"\n      }\n    },\n    \"node_modules/sockjs\": {\n      \"version\": \"0.3.24\",\n      \"resolved\": \"https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz\",\n      \"integrity\": \"sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"faye-websocket\": \"^0.11.3\",\n        \"uuid\": \"^8.3.2\",\n        \"websocket-driver\": \"^0.7.4\"\n      }\n    },\n    \"node_modules/sockjs/node_modules/uuid\": {\n      \"version\": \"8.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz\",\n      \"integrity\": \"sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==\",\n      \"dev\": true,\n      \"bin\": {\n        \"uuid\": \"dist/bin/uuid\"\n      }\n    },\n    \"node_modules/socks\": {\n      \"version\": \"2.8.3\",\n      \"resolved\": \"https://registry.npmjs.org/socks/-/socks-2.8.3.tgz\",\n      \"integrity\": \"sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ip-address\": \"^9.0.5\",\n        \"smart-buffer\": \"^4.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.0.0\",\n        \"npm\": \">= 3.0.0\"\n      }\n    },\n    \"node_modules/socks-proxy-agent\": {\n      \"version\": \"7.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz\",\n      \"integrity\": \"sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"agent-base\": \"^6.0.2\",\n        \"debug\": \"^4.3.3\",\n        \"socks\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/socks-proxy-agent/node_modules/agent-base\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz\",\n      \"integrity\": \"sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"debug\": \"4\"\n      },\n      \"engines\": {\n        \"node\": \">= 6.0.0\"\n      }\n    },\n    \"node_modules/source-map\": {\n      \"version\": \"0.6.1\",\n      \"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz\",\n      \"integrity\": \"sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/source-map-js\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz\",\n      \"integrity\": \"sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/source-map-support\": {\n      \"version\": \"0.5.21\",\n      \"resolved\": \"https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz\",\n      \"integrity\": \"sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"buffer-from\": \"^1.0.0\",\n        \"source-map\": \"^0.6.0\"\n      }\n    },\n    \"node_modules/space-separated-tokens\": {\n      \"version\": \"1.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz\",\n      \"integrity\": \"sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/spacetrim\": {\n      \"version\": \"0.11.20\",\n      \"resolved\": \"https://registry.npmjs.org/spacetrim/-/spacetrim-0.11.20.tgz\",\n      \"integrity\": \"sha512-YGGUh6s1exCagGQyG4z2cZcSwB6tsMFBKS6xUI9AuYBgkr5WHYoWx0KoBh33U2zKIQSRQZsQkRP/dI9Ly10k3g==\",\n      \"dev\": true\n    },\n    \"node_modules/spdx-correct\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz\",\n      \"integrity\": \"sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"spdx-expression-parse\": \"^3.0.0\",\n        \"spdx-license-ids\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/spdx-correct/node_modules/spdx-expression-parse\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz\",\n      \"integrity\": \"sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"spdx-exceptions\": \"^2.1.0\",\n        \"spdx-license-ids\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/spdx-exceptions\": {\n      \"version\": \"2.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz\",\n      \"integrity\": \"sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==\",\n      \"dev\": true\n    },\n    \"node_modules/spdx-expression-parse\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz\",\n      \"integrity\": \"sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"spdx-exceptions\": \"^2.1.0\",\n        \"spdx-license-ids\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/spdx-license-ids\": {\n      \"version\": \"3.0.17\",\n      \"resolved\": \"https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz\",\n      \"integrity\": \"sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==\",\n      \"dev\": true\n    },\n    \"node_modules/spdy\": {\n      \"version\": \"4.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz\",\n      \"integrity\": \"sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"debug\": \"^4.1.0\",\n        \"handle-thing\": \"^2.0.0\",\n        \"http-deceiver\": \"^1.2.7\",\n        \"select-hose\": \"^2.0.0\",\n        \"spdy-transport\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/spdy-transport\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz\",\n      \"integrity\": \"sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"debug\": \"^4.1.0\",\n        \"detect-node\": \"^2.0.4\",\n        \"hpack.js\": \"^2.1.6\",\n        \"obuf\": \"^1.1.2\",\n        \"readable-stream\": \"^3.0.6\",\n        \"wbuf\": \"^1.7.3\"\n      }\n    },\n    \"node_modules/split-lines\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/split-lines/-/split-lines-2.1.0.tgz\",\n      \"integrity\": \"sha512-8dv+1zKgTpfTkOy8XZLFyWrfxO0NV/bj/3EaQ+hBrBxGv2DwiroljPjU8NlCr+59nLnsVm9WYT7lXKwe4TC6bw==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/split2\": {\n      \"version\": \"4.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/split2/-/split2-4.2.0.tgz\",\n      \"integrity\": \"sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 10.x\"\n      }\n    },\n    \"node_modules/sprintf-js\": {\n      \"version\": \"1.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz\",\n      \"integrity\": \"sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==\",\n      \"devOptional\": true\n    },\n    \"node_modules/ssri\": {\n      \"version\": \"9.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz\",\n      \"integrity\": \"sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"minipass\": \"^3.1.1\"\n      },\n      \"engines\": {\n        \"node\": \"^12.13.0 || ^14.15.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/ssri/node_modules/minipass\": {\n      \"version\": \"3.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz\",\n      \"integrity\": \"sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"yallist\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/ssri/node_modules/yallist\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz\",\n      \"integrity\": \"sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==\",\n      \"dev\": true,\n      \"license\": \"ISC\"\n    },\n    \"node_modules/stack-utils\": {\n      \"version\": \"2.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz\",\n      \"integrity\": \"sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"escape-string-regexp\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/stack-utils/node_modules/escape-string-regexp\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz\",\n      \"integrity\": \"sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/state-toggle\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz\",\n      \"integrity\": \"sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/statuses\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz\",\n      \"integrity\": \"sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/stream-buffers\": {\n      \"version\": \"3.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz\",\n      \"integrity\": \"sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.10.0\"\n      }\n    },\n    \"node_modules/stream-meter\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz\",\n      \"integrity\": \"sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"readable-stream\": \"^2.1.4\"\n      }\n    },\n    \"node_modules/stream-meter/node_modules/isarray\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz\",\n      \"integrity\": \"sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==\",\n      \"dev\": true\n    },\n    \"node_modules/stream-meter/node_modules/readable-stream\": {\n      \"version\": \"2.3.8\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz\",\n      \"integrity\": \"sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"core-util-is\": \"~1.0.0\",\n        \"inherits\": \"~2.0.3\",\n        \"isarray\": \"~1.0.0\",\n        \"process-nextick-args\": \"~2.0.0\",\n        \"safe-buffer\": \"~5.1.1\",\n        \"string_decoder\": \"~1.1.1\",\n        \"util-deprecate\": \"~1.0.1\"\n      }\n    },\n    \"node_modules/stream-meter/node_modules/safe-buffer\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz\",\n      \"integrity\": \"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==\",\n      \"dev\": true\n    },\n    \"node_modules/stream-meter/node_modules/string_decoder\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz\",\n      \"integrity\": \"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"safe-buffer\": \"~5.1.0\"\n      }\n    },\n    \"node_modules/streamx\": {\n      \"version\": \"2.16.1\",\n      \"resolved\": \"https://registry.npmjs.org/streamx/-/streamx-2.16.1.tgz\",\n      \"integrity\": \"sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"fast-fifo\": \"^1.1.0\",\n        \"queue-tick\": \"^1.0.1\"\n      },\n      \"optionalDependencies\": {\n        \"bare-events\": \"^2.2.0\"\n      }\n    },\n    \"node_modules/string_decoder\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz\",\n      \"integrity\": \"sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==\",\n      \"dependencies\": {\n        \"safe-buffer\": \"~5.2.0\"\n      }\n    },\n    \"node_modules/string-replace-loader\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/string-replace-loader/-/string-replace-loader-3.1.0.tgz\",\n      \"integrity\": \"sha512-5AOMUZeX5HE/ylKDnEa/KKBqvlnFmRZudSOjVJHxhoJg9QYTwl1rECx7SLR8BBH7tfxb4Rp7EM2XVfQFxIhsbQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"loader-utils\": \"^2.0.0\",\n        \"schema-utils\": \"^3.0.0\"\n      },\n      \"peerDependencies\": {\n        \"webpack\": \"^5\"\n      }\n    },\n    \"node_modules/string-width\": {\n      \"version\": \"4.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n      \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n      \"dependencies\": {\n        \"emoji-regex\": \"^8.0.0\",\n        \"is-fullwidth-code-point\": \"^3.0.0\",\n        \"strip-ansi\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/string-width-cjs\": {\n      \"name\": \"string-width\",\n      \"version\": \"4.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n      \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n      \"dependencies\": {\n        \"emoji-regex\": \"^8.0.0\",\n        \"is-fullwidth-code-point\": \"^3.0.0\",\n        \"strip-ansi\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/string-width-cjs/node_modules/is-fullwidth-code-point\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n      \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/string-width-cjs/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/string-width/node_modules/is-fullwidth-code-point\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n      \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/string-width/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/string.prototype.matchall\": {\n      \"version\": \"4.0.11\",\n      \"resolved\": \"https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz\",\n      \"integrity\": \"sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.7\",\n        \"define-properties\": \"^1.2.1\",\n        \"es-abstract\": \"^1.23.2\",\n        \"es-errors\": \"^1.3.0\",\n        \"es-object-atoms\": \"^1.0.0\",\n        \"get-intrinsic\": \"^1.2.4\",\n        \"gopd\": \"^1.0.1\",\n        \"has-symbols\": \"^1.0.3\",\n        \"internal-slot\": \"^1.0.7\",\n        \"regexp.prototype.flags\": \"^1.5.2\",\n        \"set-function-name\": \"^2.0.2\",\n        \"side-channel\": \"^1.0.6\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/string.prototype.trim\": {\n      \"version\": \"1.2.9\",\n      \"resolved\": \"https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz\",\n      \"integrity\": \"sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.7\",\n        \"define-properties\": \"^1.2.1\",\n        \"es-abstract\": \"^1.23.0\",\n        \"es-object-atoms\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/string.prototype.trimend\": {\n      \"version\": \"1.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz\",\n      \"integrity\": \"sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.7\",\n        \"define-properties\": \"^1.2.1\",\n        \"es-object-atoms\": \"^1.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/string.prototype.trimstart\": {\n      \"version\": \"1.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz\",\n      \"integrity\": \"sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.7\",\n        \"define-properties\": \"^1.2.1\",\n        \"es-object-atoms\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/strip-ansi\": {\n      \"version\": \"7.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz\",\n      \"integrity\": \"sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/strip-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/strip-ansi-cjs\": {\n      \"name\": \"strip-ansi\",\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/strip-ansi/node_modules/ansi-regex\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz\",\n      \"integrity\": \"sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==\",\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-regex?sponsor=1\"\n      }\n    },\n    \"node_modules/strip-bom\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz\",\n      \"integrity\": \"sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/strip-eof\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz\",\n      \"integrity\": \"sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/strip-final-newline\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz\",\n      \"integrity\": \"sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/strip-json-comments\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz\",\n      \"integrity\": \"sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/strip-outer\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz\",\n      \"integrity\": \"sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"escape-string-regexp\": \"^1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/strip-outer/node_modules/escape-string-regexp\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz\",\n      \"integrity\": \"sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.8.0\"\n      }\n    },\n    \"node_modules/strnum\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz\",\n      \"integrity\": \"sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==\"\n    },\n    \"node_modules/strtok3\": {\n      \"version\": \"6.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz\",\n      \"integrity\": \"sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==\",\n      \"dependencies\": {\n        \"@tokenizer/token\": \"^0.3.0\",\n        \"peek-readable\": \"^4.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/Borewit\"\n      }\n    },\n    \"node_modules/struct-fu\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/struct-fu/-/struct-fu-1.2.1.tgz\",\n      \"integrity\": \"sha512-QrtfoBRe+RixlBJl852/Gu7tLLTdx3kWs3MFzY1OHNrSsYYK7aIAnzqsncYRWrKGG/QSItDmOTlELMxehw4Gjw==\"\n    },\n    \"node_modules/style-loader\": {\n      \"version\": \"3.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz\",\n      \"integrity\": \"sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 12.13.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/webpack\"\n      },\n      \"peerDependencies\": {\n        \"webpack\": \"^5.0.0\"\n      }\n    },\n    \"node_modules/style-to-object\": {\n      \"version\": \"0.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz\",\n      \"integrity\": \"sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==\",\n      \"dependencies\": {\n        \"inline-style-parser\": \"0.1.1\"\n      }\n    },\n    \"node_modules/styled-components\": {\n      \"version\": \"5.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/styled-components/-/styled-components-5.3.6.tgz\",\n      \"integrity\": \"sha512-hGTZquGAaTqhGWldX7hhfzjnIYBZ0IXQXkCYdvF1Sq3DsUaLx6+NTHC5Jj1ooM2F68sBiVz3lvhfwQs/S3l6qg==\",\n      \"hasInstallScript\": true,\n      \"dependencies\": {\n        \"@babel/helper-module-imports\": \"^7.0.0\",\n        \"@babel/traverse\": \"^7.4.5\",\n        \"@emotion/is-prop-valid\": \"^1.1.0\",\n        \"@emotion/stylis\": \"^0.8.4\",\n        \"@emotion/unitless\": \"^0.7.4\",\n        \"babel-plugin-styled-components\": \">= 1.12.0\",\n        \"css-to-react-native\": \"^3.0.0\",\n        \"hoist-non-react-statics\": \"^3.0.0\",\n        \"shallowequal\": \"^1.1.0\",\n        \"supports-color\": \"^5.5.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/styled-components\"\n      },\n      \"peerDependencies\": {\n        \"react\": \">= 16.8.0\",\n        \"react-dom\": \">= 16.8.0\",\n        \"react-is\": \">= 16.8.0\"\n      }\n    },\n    \"node_modules/styled-components/node_modules/has-flag\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz\",\n      \"integrity\": \"sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/styled-components/node_modules/supports-color\": {\n      \"version\": \"5.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz\",\n      \"integrity\": \"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==\",\n      \"dependencies\": {\n        \"has-flag\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/styled-system\": {\n      \"version\": \"4.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/styled-system/-/styled-system-4.2.4.tgz\",\n      \"integrity\": \"sha512-44X7n09gDvwx7yjquEXsjiNALK0dxGgAJdpO5cb/PdL+D4mhSLKWig4/EhH4vHJLbwu/kumURHyvKxygaBfg0A==\",\n      \"dependencies\": {\n        \"@babel/runtime\": \"^7.4.2\",\n        \"prop-types\": \"^15.7.2\"\n      }\n    },\n    \"node_modules/stylis\": {\n      \"version\": \"4.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz\",\n      \"integrity\": \"sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==\"\n    },\n    \"node_modules/sudo-prompt\": {\n      \"version\": \"9.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz\",\n      \"integrity\": \"sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==\",\n      \"deprecated\": \"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/sumchecker\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz\",\n      \"integrity\": \"sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==\",\n      \"dependencies\": {\n        \"debug\": \"^4.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 8.0\"\n      }\n    },\n    \"node_modules/supercluster\": {\n      \"version\": \"8.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz\",\n      \"integrity\": \"sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==\",\n      \"dependencies\": {\n        \"kdbush\": \"^4.0.2\"\n      }\n    },\n    \"node_modules/supports-color\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz\",\n      \"integrity\": \"sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==\",\n      \"dependencies\": {\n        \"has-flag\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/supports-preserve-symlinks-flag\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz\",\n      \"integrity\": \"sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/svg-parser\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz\",\n      \"integrity\": \"sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==\",\n      \"dev\": true\n    },\n    \"node_modules/svgo\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/svgo/-/svgo-3.2.0.tgz\",\n      \"integrity\": \"sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@trysound/sax\": \"0.2.0\",\n        \"commander\": \"^7.2.0\",\n        \"css-select\": \"^5.1.0\",\n        \"css-tree\": \"^2.3.1\",\n        \"css-what\": \"^6.1.0\",\n        \"csso\": \"^5.0.5\",\n        \"picocolors\": \"^1.0.0\"\n      },\n      \"bin\": {\n        \"svgo\": \"bin/svgo\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/svgo\"\n      }\n    },\n    \"node_modules/svgo/node_modules/commander\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-7.2.0.tgz\",\n      \"integrity\": \"sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/svgo/node_modules/css-select\": {\n      \"version\": \"5.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz\",\n      \"integrity\": \"sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"boolbase\": \"^1.0.0\",\n        \"css-what\": \"^6.1.0\",\n        \"domhandler\": \"^5.0.2\",\n        \"domutils\": \"^3.0.1\",\n        \"nth-check\": \"^2.0.1\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/fb55\"\n      }\n    },\n    \"node_modules/svgo/node_modules/dom-serializer\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz\",\n      \"integrity\": \"sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.2\",\n        \"entities\": \"^4.2.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/cheeriojs/dom-serializer?sponsor=1\"\n      }\n    },\n    \"node_modules/svgo/node_modules/domhandler\": {\n      \"version\": \"5.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz\",\n      \"integrity\": \"sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"domelementtype\": \"^2.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/domhandler?sponsor=1\"\n      }\n    },\n    \"node_modules/svgo/node_modules/domutils\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz\",\n      \"integrity\": \"sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"dom-serializer\": \"^2.0.0\",\n        \"domelementtype\": \"^2.3.0\",\n        \"domhandler\": \"^5.0.3\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/domutils?sponsor=1\"\n      }\n    },\n    \"node_modules/sys-class-rgb-led\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/sys-class-rgb-led/-/sys-class-rgb-led-3.0.1.tgz\",\n      \"integrity\": \"sha512-t/zODbTMtT1CUKUYRnCbKTTEbs300JSxJpM6Ds+DzAoZ6GCG31xFO1JhMS5wp3CWJU0zn9ufc1bZ90vgKhJ5mw==\"\n    },\n    \"node_modules/tapable\": {\n      \"version\": \"2.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz\",\n      \"integrity\": \"sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/tar\": {\n      \"version\": \"6.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/tar/-/tar-6.2.1.tgz\",\n      \"integrity\": \"sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"chownr\": \"^2.0.0\",\n        \"fs-minipass\": \"^2.0.0\",\n        \"minipass\": \"^5.0.0\",\n        \"minizlib\": \"^2.1.1\",\n        \"mkdirp\": \"^1.0.3\",\n        \"yallist\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/tar-fs\": {\n      \"version\": \"3.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz\",\n      \"integrity\": \"sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"mkdirp-classic\": \"^0.5.2\",\n        \"pump\": \"^3.0.0\",\n        \"tar-stream\": \"^3.1.5\"\n      }\n    },\n    \"node_modules/tar-stream\": {\n      \"version\": \"3.1.7\",\n      \"resolved\": \"https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz\",\n      \"integrity\": \"sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"b4a\": \"^1.6.4\",\n        \"fast-fifo\": \"^1.2.0\",\n        \"streamx\": \"^2.15.0\"\n      }\n    },\n    \"node_modules/tar/node_modules/minipass\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz\",\n      \"integrity\": \"sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/tar/node_modules/yallist\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz\",\n      \"integrity\": \"sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==\",\n      \"dev\": true,\n      \"license\": \"ISC\"\n    },\n    \"node_modules/temp\": {\n      \"version\": \"0.9.4\",\n      \"resolved\": \"https://registry.npmjs.org/temp/-/temp-0.9.4.tgz\",\n      \"integrity\": \"sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"mkdirp\": \"^0.5.1\",\n        \"rimraf\": \"~2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/temp/node_modules/glob\": {\n      \"version\": \"7.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-7.2.3.tgz\",\n      \"integrity\": \"sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"fs.realpath\": \"^1.0.0\",\n        \"inflight\": \"^1.0.4\",\n        \"inherits\": \"2\",\n        \"minimatch\": \"^3.1.1\",\n        \"once\": \"^1.3.0\",\n        \"path-is-absolute\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/temp/node_modules/mkdirp\": {\n      \"version\": \"0.5.6\",\n      \"resolved\": \"https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz\",\n      \"integrity\": \"sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"minimist\": \"^1.2.6\"\n      },\n      \"bin\": {\n        \"mkdirp\": \"bin/cmd.js\"\n      }\n    },\n    \"node_modules/temp/node_modules/rimraf\": {\n      \"version\": \"2.6.3\",\n      \"resolved\": \"https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz\",\n      \"integrity\": \"sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"glob\": \"^7.1.3\"\n      },\n      \"bin\": {\n        \"rimraf\": \"bin.js\"\n      }\n    },\n    \"node_modules/term-size\": {\n      \"version\": \"2.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz\",\n      \"integrity\": \"sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/terser\": {\n      \"version\": \"5.30.4\",\n      \"resolved\": \"https://registry.npmjs.org/terser/-/terser-5.30.4.tgz\",\n      \"integrity\": \"sha512-xRdd0v64a8mFK9bnsKVdoNP9GQIKUAaJPTaqEQDL4w/J8WaW4sWXXoMZ+6SimPkfT5bElreXf8m9HnmPc3E1BQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/source-map\": \"^0.3.3\",\n        \"acorn\": \"^8.8.2\",\n        \"commander\": \"^2.20.0\",\n        \"source-map-support\": \"~0.5.20\"\n      },\n      \"bin\": {\n        \"terser\": \"bin/terser\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/terser-webpack-plugin\": {\n      \"version\": \"5.3.10\",\n      \"resolved\": \"https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz\",\n      \"integrity\": \"sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/trace-mapping\": \"^0.3.20\",\n        \"jest-worker\": \"^27.4.5\",\n        \"schema-utils\": \"^3.1.1\",\n        \"serialize-javascript\": \"^6.0.1\",\n        \"terser\": \"^5.26.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.13.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/webpack\"\n      },\n      \"peerDependencies\": {\n        \"webpack\": \"^5.1.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"@swc/core\": {\n          \"optional\": true\n        },\n        \"esbuild\": {\n          \"optional\": true\n        },\n        \"uglify-js\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/terser-webpack-plugin/node_modules/serialize-javascript\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz\",\n      \"integrity\": \"sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"randombytes\": \"^2.1.0\"\n      }\n    },\n    \"node_modules/terser/node_modules/commander\": {\n      \"version\": \"2.20.3\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-2.20.3.tgz\",\n      \"integrity\": \"sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==\",\n      \"dev\": true\n    },\n    \"node_modules/text-table\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz\",\n      \"integrity\": \"sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==\",\n      \"dev\": true\n    },\n    \"node_modules/through\": {\n      \"version\": \"2.3.8\",\n      \"resolved\": \"https://registry.npmjs.org/through/-/through-2.3.8.tgz\",\n      \"integrity\": \"sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==\"\n    },\n    \"node_modules/thunky\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz\",\n      \"integrity\": \"sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==\",\n      \"dev\": true\n    },\n    \"node_modules/timed-out\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz\",\n      \"integrity\": \"sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/timers-ext\": {\n      \"version\": \"0.1.7\",\n      \"resolved\": \"https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz\",\n      \"integrity\": \"sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==\",\n      \"dependencies\": {\n        \"es5-ext\": \"~0.10.46\",\n        \"next-tick\": \"1\"\n      }\n    },\n    \"node_modules/tiny-each-async\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz\",\n      \"integrity\": \"sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA==\",\n      \"dev\": true,\n      \"optional\": true\n    },\n    \"node_modules/tiny-typed-emitter\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz\",\n      \"integrity\": \"sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==\"\n    },\n    \"node_modules/tinyspy\": {\n      \"version\": \"2.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz\",\n      \"integrity\": \"sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/tmp\": {\n      \"version\": \"0.0.33\",\n      \"resolved\": \"https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz\",\n      \"integrity\": \"sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==\",\n      \"dependencies\": {\n        \"os-tmpdir\": \"~1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=0.6.0\"\n      }\n    },\n    \"node_modules/tmp-promise\": {\n      \"version\": \"3.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz\",\n      \"integrity\": \"sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"tmp\": \"^0.2.0\"\n      }\n    },\n    \"node_modules/tmp-promise/node_modules/tmp\": {\n      \"version\": \"0.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz\",\n      \"integrity\": \"sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=14.14\"\n      }\n    },\n    \"node_modules/tn1150\": {\n      \"version\": \"0.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/tn1150/-/tn1150-0.1.0.tgz\",\n      \"integrity\": \"sha512-DbplOfQFkqG5IHcDyyrs/lkvSr3mPUVsFf/RbDppOshs22yTPnSJWEe6FkYd1txAwU/zcnR905ar2fi4kwF29w==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"unorm\": \"^1.4.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.12\"\n      }\n    },\n    \"node_modules/to-data-view\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/to-data-view/-/to-data-view-1.1.0.tgz\",\n      \"integrity\": \"sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/to-fast-properties\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz\",\n      \"integrity\": \"sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/to-readable-stream\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz\",\n      \"integrity\": \"sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/to-regex-range\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz\",\n      \"integrity\": \"sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"is-number\": \"^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8.0\"\n      }\n    },\n    \"node_modules/toggle-selection\": {\n      \"version\": \"1.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz\",\n      \"integrity\": \"sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==\"\n    },\n    \"node_modules/toidentifier\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz\",\n      \"integrity\": \"sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.6\"\n      }\n    },\n    \"node_modules/token-types\": {\n      \"version\": \"4.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz\",\n      \"integrity\": \"sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==\",\n      \"dependencies\": {\n        \"@tokenizer/token\": \"^0.3.0\",\n        \"ieee754\": \"^1.2.1\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/Borewit\"\n      }\n    },\n    \"node_modules/tr46\": {\n      \"version\": \"0.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz\",\n      \"integrity\": \"sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==\",\n      \"dev\": true\n    },\n    \"node_modules/traverse\": {\n      \"version\": \"0.3.9\",\n      \"resolved\": \"https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz\",\n      \"integrity\": \"sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==\",\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/trim\": {\n      \"version\": \"0.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/trim/-/trim-0.0.1.tgz\",\n      \"integrity\": \"sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==\",\n      \"deprecated\": \"Use String.prototype.trim() instead\"\n    },\n    \"node_modules/trim-repeated\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz\",\n      \"integrity\": \"sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"escape-string-regexp\": \"^1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/trim-repeated/node_modules/escape-string-regexp\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz\",\n      \"integrity\": \"sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.8.0\"\n      }\n    },\n    \"node_modules/trim-trailing-lines\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz\",\n      \"integrity\": \"sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/trough\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/trough/-/trough-1.0.5.tgz\",\n      \"integrity\": \"sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/ts-api-utils\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz\",\n      \"integrity\": \"sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=16\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=4.2.0\"\n      }\n    },\n    \"node_modules/ts-loader\": {\n      \"version\": \"9.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz\",\n      \"integrity\": \"sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"chalk\": \"^4.1.0\",\n        \"enhanced-resolve\": \"^5.0.0\",\n        \"micromatch\": \"^4.0.0\",\n        \"semver\": \"^7.3.4\",\n        \"source-map\": \"^0.7.4\"\n      },\n      \"engines\": {\n        \"node\": \">=12.0.0\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \"*\",\n        \"webpack\": \"^5.0.0\"\n      }\n    },\n    \"node_modules/ts-loader/node_modules/source-map\": {\n      \"version\": \"0.7.4\",\n      \"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz\",\n      \"integrity\": \"sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/ts-node\": {\n      \"version\": \"10.9.2\",\n      \"resolved\": \"https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz\",\n      \"integrity\": \"sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@cspotcode/source-map-support\": \"^0.8.0\",\n        \"@tsconfig/node10\": \"^1.0.7\",\n        \"@tsconfig/node12\": \"^1.0.7\",\n        \"@tsconfig/node14\": \"^1.0.0\",\n        \"@tsconfig/node16\": \"^1.0.2\",\n        \"acorn\": \"^8.4.1\",\n        \"acorn-walk\": \"^8.1.1\",\n        \"arg\": \"^4.1.0\",\n        \"create-require\": \"^1.1.0\",\n        \"diff\": \"^4.0.1\",\n        \"make-error\": \"^1.1.1\",\n        \"v8-compile-cache-lib\": \"^3.0.1\",\n        \"yn\": \"3.1.1\"\n      },\n      \"bin\": {\n        \"ts-node\": \"dist/bin.js\",\n        \"ts-node-cwd\": \"dist/bin-cwd.js\",\n        \"ts-node-esm\": \"dist/bin-esm.js\",\n        \"ts-node-script\": \"dist/bin-script.js\",\n        \"ts-node-transpile-only\": \"dist/bin-transpile.js\",\n        \"ts-script\": \"dist/bin-script-deprecated.js\"\n      },\n      \"peerDependencies\": {\n        \"@swc/core\": \">=1.2.50\",\n        \"@swc/wasm\": \">=1.2.50\",\n        \"@types/node\": \"*\",\n        \"typescript\": \">=2.7\"\n      },\n      \"peerDependenciesMeta\": {\n        \"@swc/core\": {\n          \"optional\": true\n        },\n        \"@swc/wasm\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/ts-node/node_modules/diff\": {\n      \"version\": \"4.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/diff/-/diff-4.0.2.tgz\",\n      \"integrity\": \"sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.3.1\"\n      }\n    },\n    \"node_modules/tslib\": {\n      \"version\": \"2.6.2\",\n      \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz\",\n      \"integrity\": \"sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==\"\n    },\n    \"node_modules/tunnel-agent\": {\n      \"version\": \"0.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz\",\n      \"integrity\": \"sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==\",\n      \"dependencies\": {\n        \"safe-buffer\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/type\": {\n      \"version\": \"2.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/type/-/type-2.7.2.tgz\",\n      \"integrity\": \"sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==\"\n    },\n    \"node_modules/type-check\": {\n      \"version\": \"0.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz\",\n      \"integrity\": \"sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"prelude-ls\": \"^1.2.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/type-detect\": {\n      \"version\": \"4.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz\",\n      \"integrity\": \"sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/type-fest\": {\n      \"version\": \"0.21.3\",\n      \"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz\",\n      \"integrity\": \"sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==\",\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/type-is\": {\n      \"version\": \"1.6.18\",\n      \"resolved\": \"https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz\",\n      \"integrity\": \"sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"media-typer\": \"0.3.0\",\n        \"mime-types\": \"~2.1.24\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/typed-array-buffer\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz\",\n      \"integrity\": \"sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.7\",\n        \"es-errors\": \"^1.3.0\",\n        \"is-typed-array\": \"^1.1.13\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/typed-array-byte-length\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz\",\n      \"integrity\": \"sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.7\",\n        \"for-each\": \"^0.3.3\",\n        \"gopd\": \"^1.0.1\",\n        \"has-proto\": \"^1.0.3\",\n        \"is-typed-array\": \"^1.1.13\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/typed-array-byte-offset\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz\",\n      \"integrity\": \"sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"available-typed-arrays\": \"^1.0.7\",\n        \"call-bind\": \"^1.0.7\",\n        \"for-each\": \"^0.3.3\",\n        \"gopd\": \"^1.0.1\",\n        \"has-proto\": \"^1.0.3\",\n        \"is-typed-array\": \"^1.1.13\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/typed-array-length\": {\n      \"version\": \"1.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz\",\n      \"integrity\": \"sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.7\",\n        \"for-each\": \"^0.3.3\",\n        \"gopd\": \"^1.0.1\",\n        \"has-proto\": \"^1.0.3\",\n        \"is-typed-array\": \"^1.1.13\",\n        \"possible-typed-array-names\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/typed-error\": {\n      \"version\": \"3.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/typed-error/-/typed-error-3.2.2.tgz\",\n      \"integrity\": \"sha512-Z48LU67/qJ+vyA7lh3ozELqpTp3pvQoY5RtLi5wQ/UGSrEidBhlVSqhjr8B3iqbGpjqAoJYrtSYXWMDtidWGkA==\",\n      \"engines\": {\n        \"node\": \">=6.0.0\",\n        \"npm\": \">=3.0.0\"\n      }\n    },\n    \"node_modules/typedarray-to-buffer\": {\n      \"version\": \"3.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz\",\n      \"integrity\": \"sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==\",\n      \"dependencies\": {\n        \"is-typedarray\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/typescript\": {\n      \"version\": \"5.4.5\",\n      \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz\",\n      \"integrity\": \"sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==\",\n      \"dev\": true,\n      \"bin\": {\n        \"tsc\": \"bin/tsc\",\n        \"tsserver\": \"bin/tsserver\"\n      },\n      \"engines\": {\n        \"node\": \">=14.17\"\n      }\n    },\n    \"node_modules/typo-js\": {\n      \"version\": \"1.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/typo-js/-/typo-js-1.2.4.tgz\",\n      \"integrity\": \"sha512-Oy/k+tFle5NAA3J/yrrYGfvEnPVrDZ8s8/WCwjUE75k331QyKIsFss7byQ/PzBmXLY6h1moRnZbnaxWBe3I3CA==\"\n    },\n    \"node_modules/unbox-primitive\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz\",\n      \"integrity\": \"sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"call-bind\": \"^1.0.2\",\n        \"has-bigints\": \"^1.0.2\",\n        \"has-symbols\": \"^1.0.3\",\n        \"which-boxed-primitive\": \"^1.0.2\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/unbzip2-stream\": {\n      \"version\": \"1.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz\",\n      \"integrity\": \"sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==\",\n      \"dependencies\": {\n        \"buffer\": \"^5.2.1\",\n        \"through\": \"^2.3.8\"\n      }\n    },\n    \"node_modules/undici-types\": {\n      \"version\": \"5.26.5\",\n      \"resolved\": \"https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz\",\n      \"integrity\": \"sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==\"\n    },\n    \"node_modules/unherit\": {\n      \"version\": \"1.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz\",\n      \"integrity\": \"sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==\",\n      \"dependencies\": {\n        \"inherits\": \"^2.0.0\",\n        \"xtend\": \"^4.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/unicode-canonical-property-names-ecmascript\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz\",\n      \"integrity\": \"sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/unicode-match-property-ecmascript\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz\",\n      \"integrity\": \"sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"unicode-canonical-property-names-ecmascript\": \"^2.0.0\",\n        \"unicode-property-aliases-ecmascript\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/unicode-match-property-value-ecmascript\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz\",\n      \"integrity\": \"sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/unicode-property-aliases-ecmascript\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz\",\n      \"integrity\": \"sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/unicorn-magic\": {\n      \"version\": \"0.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz\",\n      \"integrity\": \"sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/unified\": {\n      \"version\": \"9.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/unified/-/unified-9.2.2.tgz\",\n      \"integrity\": \"sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==\",\n      \"dependencies\": {\n        \"bail\": \"^1.0.0\",\n        \"extend\": \"^3.0.0\",\n        \"is-buffer\": \"^2.0.0\",\n        \"is-plain-obj\": \"^2.0.0\",\n        \"trough\": \"^1.0.0\",\n        \"vfile\": \"^4.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/unique-filename\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz\",\n      \"integrity\": \"sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"unique-slug\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^12.13.0 || ^14.15.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/unique-random\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/unique-random/-/unique-random-1.0.0.tgz\",\n      \"integrity\": \"sha512-K1sUkPf9EXCZFNIlMCoX4icAqcvkR4FMPH4Z61HbyiWhQl1ZGo0zYeV2bJmocK8Cp6tnKYrCnpkeKGebXZoRTQ==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/unique-random-array\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/unique-random-array/-/unique-random-array-1.0.0.tgz\",\n      \"integrity\": \"sha512-vtj2yltjcHPa69nFjNJ3xnhsEwE8pMyjqUQDw2myz/iSezqf4YCAcygwFQEsOgMid5VNW/dCPbnb2BcmaDCCKg==\",\n      \"dependencies\": {\n        \"unique-random\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/unique-slug\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz\",\n      \"integrity\": \"sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"imurmurhash\": \"^0.1.4\"\n      },\n      \"engines\": {\n        \"node\": \"^12.13.0 || ^14.15.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/unique-string\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz\",\n      \"integrity\": \"sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==\",\n      \"dependencies\": {\n        \"crypto-random-string\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/unist-builder\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz\",\n      \"integrity\": \"sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==\",\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/unist-util-generated\": {\n      \"version\": \"1.1.6\",\n      \"resolved\": \"https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz\",\n      \"integrity\": \"sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==\",\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/unist-util-is\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz\",\n      \"integrity\": \"sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==\",\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/unist-util-position\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz\",\n      \"integrity\": \"sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==\",\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/unist-util-remove-position\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz\",\n      \"integrity\": \"sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==\",\n      \"dependencies\": {\n        \"unist-util-visit\": \"^2.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/unist-util-stringify-position\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz\",\n      \"integrity\": \"sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==\",\n      \"dependencies\": {\n        \"@types/unist\": \"^2.0.2\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/unist-util-visit\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz\",\n      \"integrity\": \"sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==\",\n      \"dependencies\": {\n        \"@types/unist\": \"^2.0.0\",\n        \"unist-util-is\": \"^4.0.0\",\n        \"unist-util-visit-parents\": \"^3.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/unist-util-visit-parents\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz\",\n      \"integrity\": \"sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==\",\n      \"dependencies\": {\n        \"@types/unist\": \"^2.0.0\",\n        \"unist-util-is\": \"^4.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/universalify\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz\",\n      \"integrity\": \"sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==\",\n      \"engines\": {\n        \"node\": \">= 10.0.0\"\n      }\n    },\n    \"node_modules/unorm\": {\n      \"version\": \"1.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz\",\n      \"integrity\": \"sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==\",\n      \"dev\": true,\n      \"license\": \"MIT or GPL-2.0\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">= 0.4.0\"\n      }\n    },\n    \"node_modules/unpipe\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz\",\n      \"integrity\": \"sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/unzip-response\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz\",\n      \"integrity\": \"sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/unzip-stream\": {\n      \"version\": \"0.3.4\",\n      \"resolved\": \"https://registry.npmjs.org/unzip-stream/-/unzip-stream-0.3.4.tgz\",\n      \"integrity\": \"sha512-PyofABPVv+d7fL7GOpusx7eRT9YETY2X04PhwbSipdj6bMxVCFJrr+nm0Mxqbf9hUiTin/UsnuFWBXlDZFy0Cw==\",\n      \"dependencies\": {\n        \"binary\": \"^0.3.0\",\n        \"mkdirp\": \"^0.5.1\"\n      }\n    },\n    \"node_modules/unzip-stream/node_modules/mkdirp\": {\n      \"version\": \"0.5.6\",\n      \"resolved\": \"https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz\",\n      \"integrity\": \"sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==\",\n      \"dependencies\": {\n        \"minimist\": \"^1.2.6\"\n      },\n      \"bin\": {\n        \"mkdirp\": \"bin/cmd.js\"\n      }\n    },\n    \"node_modules/unzipper\": {\n      \"version\": \"0.10.14\",\n      \"resolved\": \"https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz\",\n      \"integrity\": \"sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"big-integer\": \"^1.6.17\",\n        \"binary\": \"~0.3.0\",\n        \"bluebird\": \"~3.4.1\",\n        \"buffer-indexof-polyfill\": \"~1.0.0\",\n        \"duplexer2\": \"~0.1.4\",\n        \"fstream\": \"^1.0.12\",\n        \"graceful-fs\": \"^4.2.2\",\n        \"listenercount\": \"~1.0.1\",\n        \"readable-stream\": \"~2.3.6\",\n        \"setimmediate\": \"~1.0.4\"\n      }\n    },\n    \"node_modules/unzipper/node_modules/bluebird\": {\n      \"version\": \"3.4.7\",\n      \"resolved\": \"https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz\",\n      \"integrity\": \"sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==\",\n      \"dev\": true\n    },\n    \"node_modules/unzipper/node_modules/isarray\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz\",\n      \"integrity\": \"sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==\",\n      \"dev\": true\n    },\n    \"node_modules/unzipper/node_modules/readable-stream\": {\n      \"version\": \"2.3.8\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz\",\n      \"integrity\": \"sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"core-util-is\": \"~1.0.0\",\n        \"inherits\": \"~2.0.3\",\n        \"isarray\": \"~1.0.0\",\n        \"process-nextick-args\": \"~2.0.0\",\n        \"safe-buffer\": \"~5.1.1\",\n        \"string_decoder\": \"~1.1.1\",\n        \"util-deprecate\": \"~1.0.1\"\n      }\n    },\n    \"node_modules/unzipper/node_modules/safe-buffer\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz\",\n      \"integrity\": \"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==\",\n      \"dev\": true\n    },\n    \"node_modules/unzipper/node_modules/string_decoder\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz\",\n      \"integrity\": \"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"safe-buffer\": \"~5.1.0\"\n      }\n    },\n    \"node_modules/update-browserslist-db\": {\n      \"version\": \"1.0.13\",\n      \"resolved\": \"https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz\",\n      \"integrity\": \"sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==\",\n      \"funding\": [\n        {\n          \"type\": \"opencollective\",\n          \"url\": \"https://opencollective.com/browserslist\"\n        },\n        {\n          \"type\": \"tidelift\",\n          \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n        },\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/ai\"\n        }\n      ],\n      \"dependencies\": {\n        \"escalade\": \"^3.1.1\",\n        \"picocolors\": \"^1.0.0\"\n      },\n      \"bin\": {\n        \"update-browserslist-db\": \"cli.js\"\n      },\n      \"peerDependencies\": {\n        \"browserslist\": \">= 4.21.0\"\n      }\n    },\n    \"node_modules/update-notifier\": {\n      \"version\": \"4.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz\",\n      \"integrity\": \"sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==\",\n      \"dependencies\": {\n        \"boxen\": \"^4.2.0\",\n        \"chalk\": \"^3.0.0\",\n        \"configstore\": \"^5.0.1\",\n        \"has-yarn\": \"^2.1.0\",\n        \"import-lazy\": \"^2.1.0\",\n        \"is-ci\": \"^2.0.0\",\n        \"is-installed-globally\": \"^0.3.1\",\n        \"is-npm\": \"^4.0.0\",\n        \"is-yarn-global\": \"^0.3.0\",\n        \"latest-version\": \"^5.0.0\",\n        \"pupa\": \"^2.0.1\",\n        \"semver-diff\": \"^3.1.1\",\n        \"xdg-basedir\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/yeoman/update-notifier?sponsor=1\"\n      }\n    },\n    \"node_modules/update-notifier/node_modules/chalk\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz\",\n      \"integrity\": \"sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.1.0\",\n        \"supports-color\": \"^7.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/uri-js\": {\n      \"version\": \"4.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz\",\n      \"integrity\": \"sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==\",\n      \"dependencies\": {\n        \"punycode\": \"^2.1.0\"\n      }\n    },\n    \"node_modules/url-loader\": {\n      \"version\": \"4.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz\",\n      \"integrity\": \"sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"loader-utils\": \"^2.0.0\",\n        \"mime-types\": \"^2.1.27\",\n        \"schema-utils\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.13.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/webpack\"\n      },\n      \"peerDependencies\": {\n        \"file-loader\": \"*\",\n        \"webpack\": \"^4.0.0 || ^5.0.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"file-loader\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/url-parse-lax\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz\",\n      \"integrity\": \"sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==\",\n      \"dependencies\": {\n        \"prepend-http\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/usb\": {\n      \"version\": \"2.12.1\",\n      \"resolved\": \"https://registry.npmjs.org/usb/-/usb-2.12.1.tgz\",\n      \"integrity\": \"sha512-hgtoSQUFuMXVJBApelpUTiX7ZB83MQCbYeHTBsHftA2JG7YZ76ycwIgKQhkhKqVY76C8K6xJscHpF7Ep0eG3pQ==\",\n      \"hasInstallScript\": true,\n      \"dependencies\": {\n        \"@types/w3c-web-usb\": \"^1.0.6\",\n        \"node-addon-api\": \"^7.0.0\",\n        \"node-gyp-build\": \"^4.5.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12.22.0 <13.0 || >=14.17.0\"\n      }\n    },\n    \"node_modules/usb/node_modules/node-addon-api\": {\n      \"version\": \"7.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz\",\n      \"integrity\": \"sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==\",\n      \"engines\": {\n        \"node\": \"^16 || ^18 || >= 20\"\n      }\n    },\n    \"node_modules/user-home\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz\",\n      \"integrity\": \"sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ==\",\n      \"dependencies\": {\n        \"os-homedir\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/user-meta\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/user-meta/-/user-meta-1.0.0.tgz\",\n      \"integrity\": \"sha512-Q/opMgFhVbBkdlTs44UKzV7L5Uj2zrJ4MVPXTTzJmrU1bHb2cX6wJzBIqEf1gROTzZIH8u39WmHsa5EvfnMPrw==\",\n      \"dependencies\": {\n        \"rc\": \"^1.2.1\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/userhome\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/userhome/-/userhome-1.0.0.tgz\",\n      \"integrity\": \"sha512-ayFKY3H+Pwfy4W98yPdtH1VqH4psDeyW8lYYFzfecR9d6hqLpqhecktvYR3SEEXt7vG0S1JEpciI3g94pMErig==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/username\": {\n      \"version\": \"5.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/username/-/username-5.1.0.tgz\",\n      \"integrity\": \"sha512-PCKbdWw85JsYMvmCv5GH3kXmM66rCd9m1hBEDutPNv94b/pqCMT4NtcKyeWYvLFiE8b+ha1Jdl8XAaUdPn5QTg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"execa\": \"^1.0.0\",\n        \"mem\": \"^4.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/username/node_modules/cross-spawn\": {\n      \"version\": \"6.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz\",\n      \"integrity\": \"sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"nice-try\": \"^1.0.4\",\n        \"path-key\": \"^2.0.1\",\n        \"semver\": \"^5.5.0\",\n        \"shebang-command\": \"^1.2.0\",\n        \"which\": \"^1.2.9\"\n      },\n      \"engines\": {\n        \"node\": \">=4.8\"\n      }\n    },\n    \"node_modules/username/node_modules/execa\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/execa/-/execa-1.0.0.tgz\",\n      \"integrity\": \"sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"cross-spawn\": \"^6.0.0\",\n        \"get-stream\": \"^4.0.0\",\n        \"is-stream\": \"^1.1.0\",\n        \"npm-run-path\": \"^2.0.0\",\n        \"p-finally\": \"^1.0.0\",\n        \"signal-exit\": \"^3.0.0\",\n        \"strip-eof\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/username/node_modules/get-stream\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz\",\n      \"integrity\": \"sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"pump\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/username/node_modules/is-stream\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz\",\n      \"integrity\": \"sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/username/node_modules/npm-run-path\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz\",\n      \"integrity\": \"sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"path-key\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/username/node_modules/path-key\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz\",\n      \"integrity\": \"sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/username/node_modules/semver\": {\n      \"version\": \"5.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-5.7.2.tgz\",\n      \"integrity\": \"sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"bin\": {\n        \"semver\": \"bin/semver\"\n      }\n    },\n    \"node_modules/username/node_modules/shebang-command\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz\",\n      \"integrity\": \"sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"shebang-regex\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/username/node_modules/shebang-regex\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz\",\n      \"integrity\": \"sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/username/node_modules/signal-exit\": {\n      \"version\": \"3.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz\",\n      \"integrity\": \"sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==\",\n      \"dev\": true,\n      \"license\": \"ISC\"\n    },\n    \"node_modules/username/node_modules/which\": {\n      \"version\": \"1.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/which/-/which-1.3.1.tgz\",\n      \"integrity\": \"sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"isexe\": \"^2.0.0\"\n      },\n      \"bin\": {\n        \"which\": \"bin/which\"\n      }\n    },\n    \"node_modules/utf-8-validate\": {\n      \"version\": \"5.0.10\",\n      \"resolved\": \"https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz\",\n      \"integrity\": \"sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==\",\n      \"hasInstallScript\": true,\n      \"optional\": true,\n      \"dependencies\": {\n        \"node-gyp-build\": \"^4.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.14.2\"\n      }\n    },\n    \"node_modules/util-deprecate\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz\",\n      \"integrity\": \"sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==\"\n    },\n    \"node_modules/utila\": {\n      \"version\": \"0.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/utila/-/utila-0.4.0.tgz\",\n      \"integrity\": \"sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==\",\n      \"dev\": true\n    },\n    \"node_modules/utils-merge\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz\",\n      \"integrity\": \"sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.4.0\"\n      }\n    },\n    \"node_modules/uuid\": {\n      \"version\": \"9.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz\",\n      \"integrity\": \"sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==\",\n      \"funding\": [\n        \"https://github.com/sponsors/broofa\",\n        \"https://github.com/sponsors/ctavan\"\n      ],\n      \"bin\": {\n        \"uuid\": \"dist/bin/uuid\"\n      }\n    },\n    \"node_modules/v8-compile-cache-lib\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz\",\n      \"integrity\": \"sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==\",\n      \"dev\": true\n    },\n    \"node_modules/validate-npm-package-license\": {\n      \"version\": \"3.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz\",\n      \"integrity\": \"sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"spdx-correct\": \"^3.0.0\",\n        \"spdx-expression-parse\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/validate-npm-package-license/node_modules/spdx-expression-parse\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz\",\n      \"integrity\": \"sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"spdx-exceptions\": \"^2.1.0\",\n        \"spdx-license-ids\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/validate-npm-package-name\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz\",\n      \"integrity\": \"sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==\",\n      \"dependencies\": {\n        \"builtins\": \"^1.0.3\"\n      }\n    },\n    \"node_modules/validate.io-array\": {\n      \"version\": \"1.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz\",\n      \"integrity\": \"sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==\"\n    },\n    \"node_modules/validate.io-function\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz\",\n      \"integrity\": \"sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==\"\n    },\n    \"node_modules/validate.io-integer\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz\",\n      \"integrity\": \"sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==\",\n      \"dependencies\": {\n        \"validate.io-number\": \"^1.0.3\"\n      }\n    },\n    \"node_modules/validate.io-integer-array\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz\",\n      \"integrity\": \"sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==\",\n      \"dependencies\": {\n        \"validate.io-array\": \"^1.0.3\",\n        \"validate.io-integer\": \"^1.0.4\"\n      }\n    },\n    \"node_modules/validate.io-number\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz\",\n      \"integrity\": \"sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==\"\n    },\n    \"node_modules/vary\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/vary/-/vary-1.1.2.tgz\",\n      \"integrity\": \"sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/vfile\": {\n      \"version\": \"4.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz\",\n      \"integrity\": \"sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==\",\n      \"dependencies\": {\n        \"@types/unist\": \"^2.0.0\",\n        \"is-buffer\": \"^2.0.0\",\n        \"unist-util-stringify-position\": \"^2.0.0\",\n        \"vfile-message\": \"^2.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/vfile-location\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz\",\n      \"integrity\": \"sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==\",\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/vfile-message\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz\",\n      \"integrity\": \"sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==\",\n      \"dependencies\": {\n        \"@types/unist\": \"^2.0.0\",\n        \"unist-util-stringify-position\": \"^2.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/void-elements\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz\",\n      \"integrity\": \"sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/wait-port\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/wait-port/-/wait-port-1.1.0.tgz\",\n      \"integrity\": \"sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"chalk\": \"^4.1.2\",\n        \"commander\": \"^9.3.0\",\n        \"debug\": \"^4.3.4\"\n      },\n      \"bin\": {\n        \"wait-port\": \"bin/wait-port.js\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/wait-port/node_modules/commander\": {\n      \"version\": \"9.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-9.5.0.tgz\",\n      \"integrity\": \"sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.20.0 || >=14\"\n      }\n    },\n    \"node_modules/watchpack\": {\n      \"version\": \"2.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz\",\n      \"integrity\": \"sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"glob-to-regexp\": \"^0.4.1\",\n        \"graceful-fs\": \"^4.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">=10.13.0\"\n      }\n    },\n    \"node_modules/wbuf\": {\n      \"version\": \"1.7.3\",\n      \"resolved\": \"https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz\",\n      \"integrity\": \"sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"minimalistic-assert\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/wcwidth\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz\",\n      \"integrity\": \"sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"defaults\": \"^1.0.3\"\n      }\n    },\n    \"node_modules/wdio-electron-service\": {\n      \"version\": \"6.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/wdio-electron-service/-/wdio-electron-service-6.4.1.tgz\",\n      \"integrity\": \"sha512-mYF3ZXuQc9BJlWK89taFMJy5bTKEjjU/ISR//D48lMnSksUhIy7NMPhGf6rob7EaU5XCzgLvqXbpX2ZviNk2YQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@vitest/spy\": \"^1.2.0\",\n        \"@wdio/logger\": \"^8.16.17\",\n        \"compare-versions\": \"^6.1.0\",\n        \"debug\": \"^4.3.4\",\n        \"electron-to-chromium\": \"^1.4.630\",\n        \"fast-copy\": \"^3.0.1\",\n        \"find-versions\": \"^5.1.0\",\n        \"node-fetch\": \"^3.3.2\",\n        \"read-package-up\": \"^11.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^16.13 || >=18 || >=20\"\n      },\n      \"peerDependencies\": {\n        \"electron\": \"*\",\n        \"webdriverio\": \">8.15.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"electron\": {\n          \"optional\": true\n        },\n        \"webdriverio\": {\n          \"optional\": false\n        }\n      }\n    },\n    \"node_modules/wdio-electron-service/node_modules/data-uri-to-buffer\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz\",\n      \"integrity\": \"sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 12\"\n      }\n    },\n    \"node_modules/wdio-electron-service/node_modules/node-fetch\": {\n      \"version\": \"3.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz\",\n      \"integrity\": \"sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"data-uri-to-buffer\": \"^4.0.0\",\n        \"fetch-blob\": \"^3.1.4\",\n        \"formdata-polyfill\": \"^4.0.10\"\n      },\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/node-fetch\"\n      }\n    },\n    \"node_modules/web-namespaces\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz\",\n      \"integrity\": \"sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/web-streams-polyfill\": {\n      \"version\": \"3.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz\",\n      \"integrity\": \"sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/webdriver\": {\n      \"version\": \"8.36.1\",\n      \"resolved\": \"https://registry.npmjs.org/webdriver/-/webdriver-8.36.1.tgz\",\n      \"integrity\": \"sha512-547RivYCHStVqtiGQBBcABAkzJbPnAWsxpXGzmj5KL+TOM2JF41N2iQRtUxXqr0jme1Nzzye7WS7Y7iSnK6i1g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/node\": \"^20.1.0\",\n        \"@types/ws\": \"^8.5.3\",\n        \"@wdio/config\": \"8.36.1\",\n        \"@wdio/logger\": \"8.28.0\",\n        \"@wdio/protocols\": \"8.32.0\",\n        \"@wdio/types\": \"8.36.1\",\n        \"@wdio/utils\": \"8.36.1\",\n        \"deepmerge-ts\": \"^5.1.0\",\n        \"got\": \"^12.6.1\",\n        \"ky\": \"^0.33.0\",\n        \"ws\": \"^8.8.0\"\n      },\n      \"engines\": {\n        \"node\": \"^16.13 || >=18\"\n      }\n    },\n    \"node_modules/webdriver/node_modules/@sindresorhus/is\": {\n      \"version\": \"5.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz\",\n      \"integrity\": \"sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14.16\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sindresorhus/is?sponsor=1\"\n      }\n    },\n    \"node_modules/webdriver/node_modules/@szmarczak/http-timer\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz\",\n      \"integrity\": \"sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"defer-to-connect\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=14.16\"\n      }\n    },\n    \"node_modules/webdriver/node_modules/cacheable-lookup\": {\n      \"version\": \"7.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz\",\n      \"integrity\": \"sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14.16\"\n      }\n    },\n    \"node_modules/webdriver/node_modules/cacheable-request\": {\n      \"version\": \"10.2.14\",\n      \"resolved\": \"https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz\",\n      \"integrity\": \"sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/http-cache-semantics\": \"^4.0.2\",\n        \"get-stream\": \"^6.0.1\",\n        \"http-cache-semantics\": \"^4.1.1\",\n        \"keyv\": \"^4.5.3\",\n        \"mimic-response\": \"^4.0.0\",\n        \"normalize-url\": \"^8.0.0\",\n        \"responselike\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14.16\"\n      }\n    },\n    \"node_modules/webdriver/node_modules/get-stream\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz\",\n      \"integrity\": \"sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/webdriver/node_modules/got\": {\n      \"version\": \"12.6.1\",\n      \"resolved\": \"https://registry.npmjs.org/got/-/got-12.6.1.tgz\",\n      \"integrity\": \"sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@sindresorhus/is\": \"^5.2.0\",\n        \"@szmarczak/http-timer\": \"^5.0.1\",\n        \"cacheable-lookup\": \"^7.0.0\",\n        \"cacheable-request\": \"^10.2.8\",\n        \"decompress-response\": \"^6.0.0\",\n        \"form-data-encoder\": \"^2.1.2\",\n        \"get-stream\": \"^6.0.1\",\n        \"http2-wrapper\": \"^2.1.10\",\n        \"lowercase-keys\": \"^3.0.0\",\n        \"p-cancelable\": \"^3.0.0\",\n        \"responselike\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14.16\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sindresorhus/got?sponsor=1\"\n      }\n    },\n    \"node_modules/webdriver/node_modules/lowercase-keys\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz\",\n      \"integrity\": \"sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/webdriver/node_modules/mimic-response\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz\",\n      \"integrity\": \"sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/webdriver/node_modules/normalize-url\": {\n      \"version\": \"8.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz\",\n      \"integrity\": \"sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14.16\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/webdriver/node_modules/p-cancelable\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz\",\n      \"integrity\": \"sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12.20\"\n      }\n    },\n    \"node_modules/webdriver/node_modules/responselike\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz\",\n      \"integrity\": \"sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"lowercase-keys\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14.16\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/webdriverio\": {\n      \"version\": \"8.36.1\",\n      \"resolved\": \"https://registry.npmjs.org/webdriverio/-/webdriverio-8.36.1.tgz\",\n      \"integrity\": \"sha512-vzE09oFQeMbOYJ/75jZ13sDIljzC3HH7uoUJKAMAEtyrn/bu1F9Sg/4IDEsvQaRD3pz3ae6SkRld33lcQk6HJA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/node\": \"^20.1.0\",\n        \"@wdio/config\": \"8.36.1\",\n        \"@wdio/logger\": \"8.28.0\",\n        \"@wdio/protocols\": \"8.32.0\",\n        \"@wdio/repl\": \"8.24.12\",\n        \"@wdio/types\": \"8.36.1\",\n        \"@wdio/utils\": \"8.36.1\",\n        \"archiver\": \"^7.0.0\",\n        \"aria-query\": \"^5.0.0\",\n        \"css-shorthand-properties\": \"^1.1.1\",\n        \"css-value\": \"^0.0.1\",\n        \"devtools-protocol\": \"^0.0.1282316\",\n        \"grapheme-splitter\": \"^1.0.2\",\n        \"import-meta-resolve\": \"^4.0.0\",\n        \"is-plain-obj\": \"^4.1.0\",\n        \"lodash.clonedeep\": \"^4.5.0\",\n        \"lodash.zip\": \"^4.2.0\",\n        \"minimatch\": \"^9.0.0\",\n        \"puppeteer-core\": \"^20.9.0\",\n        \"query-selector-shadow-dom\": \"^1.0.0\",\n        \"resq\": \"^1.9.1\",\n        \"rgb2hex\": \"0.2.5\",\n        \"serialize-error\": \"^11.0.1\",\n        \"webdriver\": \"8.36.1\"\n      },\n      \"engines\": {\n        \"node\": \"^16.13 || >=18\"\n      },\n      \"peerDependencies\": {\n        \"devtools\": \"^8.14.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"devtools\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/webdriverio/node_modules/brace-expansion\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz\",\n      \"integrity\": \"sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/webdriverio/node_modules/is-plain-obj\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz\",\n      \"integrity\": \"sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/webdriverio/node_modules/minimatch\": {\n      \"version\": \"9.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz\",\n      \"integrity\": \"sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/webdriverio/node_modules/serialize-error\": {\n      \"version\": \"11.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/serialize-error/-/serialize-error-11.0.3.tgz\",\n      \"integrity\": \"sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"type-fest\": \"^2.12.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.16\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/webdriverio/node_modules/type-fest\": {\n      \"version\": \"2.19.0\",\n      \"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz\",\n      \"integrity\": \"sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12.20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/webidl-conversions\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz\",\n      \"integrity\": \"sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==\",\n      \"dev\": true\n    },\n    \"node_modules/webpack\": {\n      \"version\": \"5.91.0\",\n      \"resolved\": \"https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz\",\n      \"integrity\": \"sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/eslint-scope\": \"^3.7.3\",\n        \"@types/estree\": \"^1.0.5\",\n        \"@webassemblyjs/ast\": \"^1.12.1\",\n        \"@webassemblyjs/wasm-edit\": \"^1.12.1\",\n        \"@webassemblyjs/wasm-parser\": \"^1.12.1\",\n        \"acorn\": \"^8.7.1\",\n        \"acorn-import-assertions\": \"^1.9.0\",\n        \"browserslist\": \"^4.21.10\",\n        \"chrome-trace-event\": \"^1.0.2\",\n        \"enhanced-resolve\": \"^5.16.0\",\n        \"es-module-lexer\": \"^1.2.1\",\n        \"eslint-scope\": \"5.1.1\",\n        \"events\": \"^3.2.0\",\n        \"glob-to-regexp\": \"^0.4.1\",\n        \"graceful-fs\": \"^4.2.11\",\n        \"json-parse-even-better-errors\": \"^2.3.1\",\n        \"loader-runner\": \"^4.2.0\",\n        \"mime-types\": \"^2.1.27\",\n        \"neo-async\": \"^2.6.2\",\n        \"schema-utils\": \"^3.2.0\",\n        \"tapable\": \"^2.1.1\",\n        \"terser-webpack-plugin\": \"^5.3.10\",\n        \"watchpack\": \"^2.4.1\",\n        \"webpack-sources\": \"^3.2.3\"\n      },\n      \"bin\": {\n        \"webpack\": \"bin/webpack.js\"\n      },\n      \"engines\": {\n        \"node\": \">=10.13.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/webpack\"\n      },\n      \"peerDependenciesMeta\": {\n        \"webpack-cli\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/webpack-dev-middleware\": {\n      \"version\": \"5.3.4\",\n      \"resolved\": \"https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz\",\n      \"integrity\": \"sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"colorette\": \"^2.0.10\",\n        \"memfs\": \"^3.4.3\",\n        \"mime-types\": \"^2.1.31\",\n        \"range-parser\": \"^1.2.1\",\n        \"schema-utils\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 12.13.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/webpack\"\n      },\n      \"peerDependencies\": {\n        \"webpack\": \"^4.0.0 || ^5.0.0\"\n      }\n    },\n    \"node_modules/webpack-dev-middleware/node_modules/ajv\": {\n      \"version\": \"8.12.0\",\n      \"resolved\": \"https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz\",\n      \"integrity\": \"sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"fast-deep-equal\": \"^3.1.1\",\n        \"json-schema-traverse\": \"^1.0.0\",\n        \"require-from-string\": \"^2.0.2\",\n        \"uri-js\": \"^4.2.2\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/epoberezkin\"\n      }\n    },\n    \"node_modules/webpack-dev-middleware/node_modules/ajv-keywords\": {\n      \"version\": \"5.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz\",\n      \"integrity\": \"sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"fast-deep-equal\": \"^3.1.3\"\n      },\n      \"peerDependencies\": {\n        \"ajv\": \"^8.8.2\"\n      }\n    },\n    \"node_modules/webpack-dev-middleware/node_modules/json-schema-traverse\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz\",\n      \"integrity\": \"sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==\",\n      \"dev\": true\n    },\n    \"node_modules/webpack-dev-middleware/node_modules/schema-utils\": {\n      \"version\": \"4.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz\",\n      \"integrity\": \"sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/json-schema\": \"^7.0.9\",\n        \"ajv\": \"^8.9.0\",\n        \"ajv-formats\": \"^2.1.1\",\n        \"ajv-keywords\": \"^5.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 12.13.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/webpack\"\n      }\n    },\n    \"node_modules/webpack-dev-server\": {\n      \"version\": \"4.15.2\",\n      \"resolved\": \"https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz\",\n      \"integrity\": \"sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/bonjour\": \"^3.5.9\",\n        \"@types/connect-history-api-fallback\": \"^1.3.5\",\n        \"@types/express\": \"^4.17.13\",\n        \"@types/serve-index\": \"^1.9.1\",\n        \"@types/serve-static\": \"^1.13.10\",\n        \"@types/sockjs\": \"^0.3.33\",\n        \"@types/ws\": \"^8.5.5\",\n        \"ansi-html-community\": \"^0.0.8\",\n        \"bonjour-service\": \"^1.0.11\",\n        \"chokidar\": \"^3.5.3\",\n        \"colorette\": \"^2.0.10\",\n        \"compression\": \"^1.7.4\",\n        \"connect-history-api-fallback\": \"^2.0.0\",\n        \"default-gateway\": \"^6.0.3\",\n        \"express\": \"^4.17.3\",\n        \"graceful-fs\": \"^4.2.6\",\n        \"html-entities\": \"^2.3.2\",\n        \"http-proxy-middleware\": \"^2.0.3\",\n        \"ipaddr.js\": \"^2.0.1\",\n        \"launch-editor\": \"^2.6.0\",\n        \"open\": \"^8.0.9\",\n        \"p-retry\": \"^4.5.0\",\n        \"rimraf\": \"^3.0.2\",\n        \"schema-utils\": \"^4.0.0\",\n        \"selfsigned\": \"^2.1.1\",\n        \"serve-index\": \"^1.9.1\",\n        \"sockjs\": \"^0.3.24\",\n        \"spdy\": \"^4.0.2\",\n        \"webpack-dev-middleware\": \"^5.3.4\",\n        \"ws\": \"^8.13.0\"\n      },\n      \"bin\": {\n        \"webpack-dev-server\": \"bin/webpack-dev-server.js\"\n      },\n      \"engines\": {\n        \"node\": \">= 12.13.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/webpack\"\n      },\n      \"peerDependencies\": {\n        \"webpack\": \"^4.37.0 || ^5.0.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"webpack\": {\n          \"optional\": true\n        },\n        \"webpack-cli\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/webpack-dev-server/node_modules/ajv\": {\n      \"version\": \"8.12.0\",\n      \"resolved\": \"https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz\",\n      \"integrity\": \"sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"fast-deep-equal\": \"^3.1.1\",\n        \"json-schema-traverse\": \"^1.0.0\",\n        \"require-from-string\": \"^2.0.2\",\n        \"uri-js\": \"^4.2.2\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/epoberezkin\"\n      }\n    },\n    \"node_modules/webpack-dev-server/node_modules/ajv-keywords\": {\n      \"version\": \"5.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz\",\n      \"integrity\": \"sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"fast-deep-equal\": \"^3.1.3\"\n      },\n      \"peerDependencies\": {\n        \"ajv\": \"^8.8.2\"\n      }\n    },\n    \"node_modules/webpack-dev-server/node_modules/ipaddr.js\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz\",\n      \"integrity\": \"sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/webpack-dev-server/node_modules/json-schema-traverse\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz\",\n      \"integrity\": \"sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==\",\n      \"dev\": true\n    },\n    \"node_modules/webpack-dev-server/node_modules/schema-utils\": {\n      \"version\": \"4.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz\",\n      \"integrity\": \"sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/json-schema\": \"^7.0.9\",\n        \"ajv\": \"^8.9.0\",\n        \"ajv-formats\": \"^2.1.1\",\n        \"ajv-keywords\": \"^5.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 12.13.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/webpack\"\n      }\n    },\n    \"node_modules/webpack-merge\": {\n      \"version\": \"5.10.0\",\n      \"resolved\": \"https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz\",\n      \"integrity\": \"sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"clone-deep\": \"^4.0.1\",\n        \"flat\": \"^5.0.2\",\n        \"wildcard\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10.0.0\"\n      }\n    },\n    \"node_modules/webpack-sources\": {\n      \"version\": \"3.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz\",\n      \"integrity\": \"sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10.13.0\"\n      }\n    },\n    \"node_modules/webpack/node_modules/eslint-scope\": {\n      \"version\": \"5.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz\",\n      \"integrity\": \"sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"esrecurse\": \"^4.3.0\",\n        \"estraverse\": \"^4.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8.0.0\"\n      }\n    },\n    \"node_modules/webpack/node_modules/estraverse\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz\",\n      \"integrity\": \"sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=4.0\"\n      }\n    },\n    \"node_modules/websocket-driver\": {\n      \"version\": \"0.7.4\",\n      \"resolved\": \"https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz\",\n      \"integrity\": \"sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"http-parser-js\": \">=0.5.1\",\n        \"safe-buffer\": \">=5.1.0\",\n        \"websocket-extensions\": \">=0.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.8.0\"\n      }\n    },\n    \"node_modules/websocket-extensions\": {\n      \"version\": \"0.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz\",\n      \"integrity\": \"sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.8.0\"\n      }\n    },\n    \"node_modules/whatwg-fetch\": {\n      \"version\": \"3.6.20\",\n      \"resolved\": \"https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz\",\n      \"integrity\": \"sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==\"\n    },\n    \"node_modules/whatwg-url\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz\",\n      \"integrity\": \"sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"tr46\": \"~0.0.3\",\n        \"webidl-conversions\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/which\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/which/-/which-2.0.2.tgz\",\n      \"integrity\": \"sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==\",\n      \"dependencies\": {\n        \"isexe\": \"^2.0.0\"\n      },\n      \"bin\": {\n        \"node-which\": \"bin/node-which\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/which-boxed-primitive\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz\",\n      \"integrity\": \"sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"is-bigint\": \"^1.0.1\",\n        \"is-boolean-object\": \"^1.1.0\",\n        \"is-number-object\": \"^1.0.4\",\n        \"is-string\": \"^1.0.5\",\n        \"is-symbol\": \"^1.0.3\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/which-builtin-type\": {\n      \"version\": \"1.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz\",\n      \"integrity\": \"sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"function.prototype.name\": \"^1.1.5\",\n        \"has-tostringtag\": \"^1.0.0\",\n        \"is-async-function\": \"^2.0.0\",\n        \"is-date-object\": \"^1.0.5\",\n        \"is-finalizationregistry\": \"^1.0.2\",\n        \"is-generator-function\": \"^1.0.10\",\n        \"is-regex\": \"^1.1.4\",\n        \"is-weakref\": \"^1.0.2\",\n        \"isarray\": \"^2.0.5\",\n        \"which-boxed-primitive\": \"^1.0.2\",\n        \"which-collection\": \"^1.0.1\",\n        \"which-typed-array\": \"^1.1.9\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/which-collection\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz\",\n      \"integrity\": \"sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"is-map\": \"^2.0.3\",\n        \"is-set\": \"^2.0.3\",\n        \"is-weakmap\": \"^2.0.2\",\n        \"is-weakset\": \"^2.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/which-module\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz\",\n      \"integrity\": \"sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==\"\n    },\n    \"node_modules/which-typed-array\": {\n      \"version\": \"1.1.15\",\n      \"resolved\": \"https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz\",\n      \"integrity\": \"sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"available-typed-arrays\": \"^1.0.7\",\n        \"call-bind\": \"^1.0.7\",\n        \"for-each\": \"^0.3.3\",\n        \"gopd\": \"^1.0.1\",\n        \"has-tostringtag\": \"^1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/widest-line\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz\",\n      \"integrity\": \"sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==\",\n      \"dependencies\": {\n        \"string-width\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/wildcard\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz\",\n      \"integrity\": \"sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==\",\n      \"dev\": true\n    },\n    \"node_modules/winusb-driver-generator\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/winusb-driver-generator/-/winusb-driver-generator-2.1.2.tgz\",\n      \"integrity\": \"sha512-x0bsG4OEtb4ppDqB1151qniwXxl3S5hPafxQsbfMZRcoYLB5mf6CdkwtYysEmI9+4XKTIv8XwQO13a1IC/wNxQ==\",\n      \"hasInstallScript\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"dependencies\": {\n        \"bindings\": \"^1.5.0\",\n        \"node-addon-api\": \"^5.0.0\",\n        \"prebuild-install\": \"^7.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=16 < 19\"\n      }\n    },\n    \"node_modules/winusb-driver-generator/node_modules/node-addon-api\": {\n      \"version\": \"5.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz\",\n      \"integrity\": \"sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==\",\n      \"optional\": true\n    },\n    \"node_modules/word-wrap\": {\n      \"version\": \"1.2.5\",\n      \"resolved\": \"https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz\",\n      \"integrity\": \"sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/workerpool\": {\n      \"version\": \"6.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz\",\n      \"integrity\": \"sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==\",\n      \"dev\": true\n    },\n    \"node_modules/wrap-ansi\": {\n      \"version\": \"6.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz\",\n      \"integrity\": \"sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.0.0\",\n        \"string-width\": \"^4.1.0\",\n        \"strip-ansi\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs\": {\n      \"name\": \"wrap-ansi\",\n      \"version\": \"7.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n      \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.0.0\",\n        \"string-width\": \"^4.1.0\",\n        \"strip-ansi\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/wrap-ansi/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/wrappy\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz\",\n      \"integrity\": \"sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==\"\n    },\n    \"node_modules/write-file-atomic\": {\n      \"version\": \"3.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz\",\n      \"integrity\": \"sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==\",\n      \"dependencies\": {\n        \"imurmurhash\": \"^0.1.4\",\n        \"is-typedarray\": \"^1.0.0\",\n        \"signal-exit\": \"^3.0.2\",\n        \"typedarray-to-buffer\": \"^3.1.5\"\n      }\n    },\n    \"node_modules/write-file-atomic/node_modules/signal-exit\": {\n      \"version\": \"3.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz\",\n      \"integrity\": \"sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==\"\n    },\n    \"node_modules/ws\": {\n      \"version\": \"8.16.0\",\n      \"resolved\": \"https://registry.npmjs.org/ws/-/ws-8.16.0.tgz\",\n      \"integrity\": \"sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==\",\n      \"engines\": {\n        \"node\": \">=10.0.0\"\n      },\n      \"peerDependencies\": {\n        \"bufferutil\": \"^4.0.1\",\n        \"utf-8-validate\": \">=5.0.2\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bufferutil\": {\n          \"optional\": true\n        },\n        \"utf-8-validate\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/xdg-basedir\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz\",\n      \"integrity\": \"sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/xml-js\": {\n      \"version\": \"1.6.11\",\n      \"resolved\": \"https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz\",\n      \"integrity\": \"sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==\",\n      \"dependencies\": {\n        \"sax\": \"^1.2.4\"\n      },\n      \"bin\": {\n        \"xml-js\": \"bin/cli.js\"\n      }\n    },\n    \"node_modules/xmlbuilder\": {\n      \"version\": \"15.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz\",\n      \"integrity\": \"sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8.0\"\n      }\n    },\n    \"node_modules/xok\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/xok/-/xok-1.0.0.tgz\",\n      \"integrity\": \"sha512-DVb6F65Oiq0/fQxLH4adxE92OeNl1njEd+A1pPknmujM/nJhid2iofGXhrU4subNbUi2F0whuKhLv8ReFsqg6g==\"\n    },\n    \"node_modules/xtend\": {\n      \"version\": \"4.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz\",\n      \"integrity\": \"sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==\",\n      \"engines\": {\n        \"node\": \">=0.4\"\n      }\n    },\n    \"node_modules/xterm\": {\n      \"version\": \"4.19.0\",\n      \"resolved\": \"https://registry.npmjs.org/xterm/-/xterm-4.19.0.tgz\",\n      \"integrity\": \"sha512-c3Cp4eOVsYY5Q839dR5IejghRPpxciGmLWWaP9g+ppfMeBChMeLa1DCA+pmX/jyDZ+zxFOmlJL/82qVdayVoGQ==\",\n      \"deprecated\": \"This package is now deprecated. Move to @xterm/xterm instead.\"\n    },\n    \"node_modules/xterm-addon-fit\": {\n      \"version\": \"0.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.5.0.tgz\",\n      \"integrity\": \"sha512-DsS9fqhXHacEmsPxBJZvfj2la30Iz9xk+UKjhQgnYNkrUIN5CYLbw7WEfz117c7+S86S/tpHPfvNxJsF5/G8wQ==\",\n      \"deprecated\": \"This package is now deprecated. Move to @xterm/addon-fit instead.\",\n      \"peerDependencies\": {\n        \"xterm\": \"^4.0.0\"\n      }\n    },\n    \"node_modules/xterm-addon-search\": {\n      \"version\": \"0.8.2\",\n      \"resolved\": \"https://registry.npmjs.org/xterm-addon-search/-/xterm-addon-search-0.8.2.tgz\",\n      \"integrity\": \"sha512-I1863mjn8P6uVrqm/X+btalVsqjAKLhnhpbP7SavAOpEkI1jJhbHU2UTp7NjeRtcKTks6UWk/ycgds5snDSejg==\",\n      \"deprecated\": \"This package is now deprecated. Move to @xterm/addon-search instead.\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"peerDependencies\": {\n        \"xterm\": \"^4.0.0\"\n      }\n    },\n    \"node_modules/xvfb-maybe\": {\n      \"version\": \"0.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/xvfb-maybe/-/xvfb-maybe-0.2.1.tgz\",\n      \"integrity\": \"sha512-9IyRz3l6Qyhl6LvnGRF5jMPB4oBEepQnuzvVAFTynP6ACLLSevqigICJ9d/+ofl29m2daeaVBChnPYUnaeJ7yA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"debug\": \"^2.2.0\",\n        \"which\": \"^1.2.4\"\n      },\n      \"bin\": {\n        \"xvfb-maybe\": \"src/xvfb-maybe.js\"\n      }\n    },\n    \"node_modules/xvfb-maybe/node_modules/debug\": {\n      \"version\": \"2.6.9\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-2.6.9.tgz\",\n      \"integrity\": \"sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ms\": \"2.0.0\"\n      }\n    },\n    \"node_modules/xvfb-maybe/node_modules/ms\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz\",\n      \"integrity\": \"sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==\",\n      \"dev\": true\n    },\n    \"node_modules/xvfb-maybe/node_modules/which\": {\n      \"version\": \"1.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/which/-/which-1.3.1.tgz\",\n      \"integrity\": \"sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"isexe\": \"^2.0.0\"\n      },\n      \"bin\": {\n        \"which\": \"bin/which\"\n      }\n    },\n    \"node_modules/xxhash-addon\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/xxhash-addon/-/xxhash-addon-2.0.3.tgz\",\n      \"integrity\": \"sha512-MIL+yTvK2HaVHe1VXfVtXd884pakIaNbjuNHAqIhVFrye87+ZCn0s3RSafqiYB1ASqrZoGsm8URjPiupGLuP+A==\",\n      \"hasInstallScript\": true,\n      \"engines\": {\n        \"node\": \">=8.6.0 <9.0.0 || >=10.0.0\"\n      }\n    },\n    \"node_modules/y18n\": {\n      \"version\": \"4.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz\",\n      \"integrity\": \"sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==\"\n    },\n    \"node_modules/yallist\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz\",\n      \"integrity\": \"sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==\"\n    },\n    \"node_modules/yaml\": {\n      \"version\": \"2.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz\",\n      \"integrity\": \"sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==\",\n      \"bin\": {\n        \"yaml\": \"bin.mjs\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/yargs\": {\n      \"version\": \"17.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz\",\n      \"integrity\": \"sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"cliui\": \"^8.0.1\",\n        \"escalade\": \"^3.1.1\",\n        \"get-caller-file\": \"^2.0.5\",\n        \"require-directory\": \"^2.1.1\",\n        \"string-width\": \"^4.2.3\",\n        \"y18n\": \"^5.0.5\",\n        \"yargs-parser\": \"^21.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/yargs-parser\": {\n      \"version\": \"21.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz\",\n      \"integrity\": \"sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/yargs-unparser\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz\",\n      \"integrity\": \"sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"camelcase\": \"^6.0.0\",\n        \"decamelize\": \"^4.0.0\",\n        \"flat\": \"^5.0.2\",\n        \"is-plain-obj\": \"^2.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/yargs-unparser/node_modules/decamelize\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz\",\n      \"integrity\": \"sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/yargs/node_modules/y18n\": {\n      \"version\": \"5.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz\",\n      \"integrity\": \"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/yauzl\": {\n      \"version\": \"2.10.0\",\n      \"resolved\": \"https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz\",\n      \"integrity\": \"sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==\",\n      \"dependencies\": {\n        \"buffer-crc32\": \"~0.2.3\",\n        \"fd-slicer\": \"~1.1.0\"\n      }\n    },\n    \"node_modules/yauzl/node_modules/buffer-crc32\": {\n      \"version\": \"0.2.13\",\n      \"resolved\": \"https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz\",\n      \"integrity\": \"sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==\",\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/yn\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/yn/-/yn-3.1.1.tgz\",\n      \"integrity\": \"sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/yocto-queue\": {\n      \"version\": \"0.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz\",\n      \"integrity\": \"sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/zip-part-stream\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/zip-part-stream/-/zip-part-stream-2.0.0.tgz\",\n      \"integrity\": \"sha512-d2ZgYcCHH7q5aaZ6m/UKJQWsUT6FY7+IuOv0eIuVRUdyh5i6bxTo+aLB4dhGpdYsYx475XBsUvyOO4dBbqZGNw==\",\n      \"dependencies\": {\n        \"@balena/node-crc-utils\": \"^3.0.0\",\n        \"combined-stream\": \"^1.0.8\",\n        \"crc32-stream\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/zip-stream\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz\",\n      \"integrity\": \"sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"archiver-utils\": \"^5.0.0\",\n        \"compress-commons\": \"^6.0.2\",\n        \"readable-stream\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/zip-stream/node_modules/buffer\": {\n      \"version\": \"6.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz\",\n      \"integrity\": \"sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"dependencies\": {\n        \"base64-js\": \"^1.3.1\",\n        \"ieee754\": \"^1.2.1\"\n      }\n    },\n    \"node_modules/zip-stream/node_modules/readable-stream\": {\n      \"version\": \"4.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz\",\n      \"integrity\": \"sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"abort-controller\": \"^3.0.0\",\n        \"buffer\": \"^6.0.3\",\n        \"events\": \"^3.3.0\",\n        \"process\": \"^0.11.10\",\n        \"string_decoder\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/zwitch\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz\",\n      \"integrity\": \"sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"balena-etcher\",\n  \"private\": true,\n  \"displayName\": \"balenaEtcher\",\n  \"productName\": \"balenaEtcher\",\n  \"version\": \"2.1.4\",\n  \"packageType\": \"local\",\n  \"main\": \".webpack/main\",\n  \"description\": \"Flash OS images to SD cards and USB drives, safely and easily.\",\n  \"productDescription\": \"Etcher is a powerful OS image flasher built with web technologies to ensure flashing an SDCard or USB drive is a pleasant and safe experience. It protects you from accidentally writing to your hard-drives, ensures every byte of data was written correctly and much more.\",\n  \"homepage\": \"https://github.com/balena-io/etcher\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git@github.com:balena-io/etcher.git\"\n  },\n  \"scripts\": {\n    \"prettify\": \"prettier --write lib/**/*.css && balena-lint --fix --typescript typings lib tests forge.config.ts forge.sidecar.ts webpack.config.ts\",\n    \"lint\": \"npm run prettify && catch-uncommitted\",\n    \"test\": \"echo 'Only use custom tests; if you want to test locally, use `npm run wdio`' && exit 0\",\n    \"package\": \"electron-forge package\",\n    \"start\": \"electron-forge start\",\n    \"make\": \"electron-forge make\",\n    \"wdio\": \"xvfb-maybe wdio run ./wdio.conf.ts\"\n  },\n  \"husky\": {\n    \"hooks\": {\n      \"pre-commit\": \"npm run prettify\"\n    }\n  },\n  \"author\": \"Balena Ltd. <hello@balena.io>\",\n  \"license\": \"Apache-2.0\",\n  \"dependencies\": {\n    \"@electron/remote\": \"^2.1.2\",\n    \"@fortawesome/fontawesome-free\": \"^6.5.2\",\n    \"@ronomon/direct-io\": \"^3.0.1\",\n    \"@sentry/electron\": \"^4.24.0\",\n    \"axios\": \"^1.6.8\",\n    \"debug\": \"4.3.4\",\n    \"drivelist\": \"^12.0.2\",\n    \"electron-squirrel-startup\": \"^1.0.0\",\n    \"electron-updater\": \"6.1.8\",\n    \"etcher-sdk\": \"10.0.0\",\n    \"i18next\": \"23.11.2\",\n    \"immutable\": \"3.8.2\",\n    \"lodash\": \"4.17.21\",\n    \"outdent\": \"0.8.0\",\n    \"path-is-inside\": \"1.0.2\",\n    \"pretty-bytes\": \"6.1.1\",\n    \"react\": \"17.0.2\",\n    \"react-dom\": \"17.0.2\",\n    \"react-i18next\": \"13.5.0\",\n    \"redux\": \"4.2.1\",\n    \"rendition\": \"35.2.0\",\n    \"semver\": \"7.6.0\",\n    \"styled-components\": \"5.3.6\",\n    \"sys-class-rgb-led\": \"3.0.1\",\n    \"uuid\": \"9.0.1\",\n    \"ws\": \"^8.16.0\"\n  },\n  \"devDependencies\": {\n    \"@balena/lint\": \"8.0.2\",\n    \"@electron-forge/cli\": \"7.8.1\",\n    \"@electron-forge/maker-deb\": \"7.8.1\",\n    \"@electron-forge/maker-dmg\": \"7.8.1\",\n    \"@electron-forge/maker-rpm\": \"7.8.1\",\n    \"@electron-forge/maker-squirrel\": \"7.8.1\",\n    \"@electron-forge/maker-zip\": \"7.8.1\",\n    \"@electron-forge/plugin-auto-unpack-natives\": \"7.8.1\",\n    \"@electron-forge/plugin-webpack\": \"7.8.1\",\n    \"@reforged/maker-appimage\": \"3.3.2\",\n    \"@svgr/webpack\": \"8.1.0\",\n    \"@types/chai\": \"4.3.14\",\n    \"@types/debug\": \"^4.1.12\",\n    \"@types/mime-types\": \"2.1.4\",\n    \"@types/node\": \"^20.11.6\",\n    \"@types/react\": \"17.0.2\",\n    \"@types/react-dom\": \"17.0.2\",\n    \"@types/semver\": \"7.5.8\",\n    \"@types/sinon\": \"17.0.3\",\n    \"@types/tmp\": \"0.2.6\",\n    \"@vercel/webpack-asset-relocator-loader\": \"1.7.3\",\n    \"@wdio/cli\": \"^8.36.1\",\n    \"@wdio/local-runner\": \"^8.36.1\",\n    \"@wdio/mocha-framework\": \"^8.36.1\",\n    \"@wdio/spec-reporter\": \"^8.36.1\",\n    \"@yao-pkg/pkg\": \"^5.11.5\",\n    \"catch-uncommitted\": \"^2.0.0\",\n    \"chai\": \"4.3.10\",\n    \"css-loader\": \"5.2.7\",\n    \"electron\": \"37.2.4\",\n    \"file-loader\": \"6.2.0\",\n    \"husky\": \"8.0.3\",\n    \"native-addon-loader\": \"2.0.1\",\n    \"node-loader\": \"^2.0.0\",\n    \"sinon\": \"^17.0.1\",\n    \"string-replace-loader\": \"3.1.0\",\n    \"style-loader\": \"3.3.3\",\n    \"ts-loader\": \"^9.5.1\",\n    \"ts-node\": \"^10.9.2\",\n    \"tslib\": \"2.6.2\",\n    \"typescript\": \"^5.3.3\",\n    \"url-loader\": \"4.1.1\",\n    \"wdio-electron-service\": \"^6.4.1\",\n    \"xvfb-maybe\": \"^0.2.1\"\n  },\n  \"hostDependencies\": {\n    \"debian\": [\n      \"libasound2\",\n      \"libatk1.0-0\",\n      \"libc6\",\n      \"libcairo2\",\n      \"libcups2\",\n      \"libdbus-1-3\",\n      \"libexpat1\",\n      \"libfontconfig1\",\n      \"libfreetype6\",\n      \"libgbm1\",\n      \"libgcc1\",\n      \"libgdk-pixbuf2.0-0\",\n      \"libglib2.0-0\",\n      \"libgtk-3-0\",\n      \"liblzma5\",\n      \"libnotify4\",\n      \"libnspr4\",\n      \"libnss3\",\n      \"libpango1.0-0 | libpango-1.0-0\",\n      \"libstdc++6\",\n      \"libx11-6\",\n      \"libxcomposite1\",\n      \"libxcursor1\",\n      \"libxdamage1\",\n      \"libxext6\",\n      \"libxfixes3\",\n      \"libxi6\",\n      \"libxrandr2\",\n      \"libxrender1\",\n      \"libxss1\",\n      \"libxtst6\",\n      \"polkit-1-auth-agent | policykit-1-gnome | polkit-kde-1\"\n    ]\n  },\n  \"engines\": {\n    \"node\": \">=20 <21\"\n  },\n  \"versionist\": {\n    \"publishedAt\": \"2025-07-29T12:17:34.228Z\"\n  },\n  \"optionalDependencies\": {\n    \"bufferutil\": \"^4.0.8\",\n    \"utf-8-validate\": \"^5.0.10\",\n    \"winusb-driver-generator\": \"2.1.2\"\n  }\n}\n"
  },
  {
    "path": "pkg-sidecar.json",
    "content": "{\n  \"assets\": [\n    \"node_modules/usb/**\",\n    \"node_modules/lzma-native/**\",\n    \"node_modules/drivelist/**\",\n    \"node_modules/mountutils/**\",\n    \"node_modules/winusb-driver-generator/**\",\n    \"node_modules/node-raspberrypi-usbboot/**\",\n    \"node_modules/xxhash-addon/**\",\n    \"node_modules/axios/**\"\n  ]\n}\n"
  },
  {
    "path": "repo.yml",
    "content": "---\ntype: electron\nrelease: github\npublishMetadata: true\nsentry:\n  org: balenaetcher\n  team: resinio\n  type: electron\ntriggerNotification:\n  version: 1.7.9\n  stagingPercentage: 100\nupstream:\n  - repo: etcher-sdk\n    url: https://github.com/balena-io-modules/etcher-sdk\n    module: etcher-sdk\n  - repo: sys-class-rgb-led\n    url: https://github.com/balena-io-modules/sys-class-rgb-led\n    module: sys-class-rgb-led\n  - repo: rendition\n    url: https://github.com/balena-io-modules/rendition\n    module: rendition\n"
  },
  {
    "path": "tests/.eslintrc.yml",
    "content": "rules:\n  require-jsdoc:\n    - off\n  no-undefined:\n    - off\n  init-declarations:\n    - off\n  no-unused-expressions:\n    - off\n  prefer-arrow-callback:\n    - off\n  no-magic-numbers:\n    - off\n  id-length:\n    - error\n    - min: 2\n      exceptions:\n        - \"_\"\n        - \"m\"\n"
  },
  {
    "path": "tests/gui/allow-renderer-process-reuse.ts",
    "content": "const { app } = require('electron');\n\nif (app !== undefined) {\n\tconst remoteMain = require('@electron/remote/main');\n\n\tremoteMain.initialize();\n\n\tapp.on('browser-window-created', (_event, window) =>\n\t\tremoteMain.enable(window.webContents),\n\t);\n}\n"
  },
  {
    "path": "tests/gui/models/available-drives.spec.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { expect } from 'chai';\nimport * as path from 'path';\n\nimport * as availableDrives from '../../../lib/gui/app/models/available-drives';\nimport * as selectionState from '../../../lib/gui/app/models/selection-state';\nimport * as constraints from '../../../lib/shared/drive-constraints';\n\ndescribe('Model: availableDrives', function () {\n\tdescribe('availableDrives', function () {\n\t\tit('should have no drives by default', function () {\n\t\t\texpect(availableDrives.getDrives()).to.deep.equal([]);\n\t\t});\n\n\t\tdescribe('.setDrives()', function () {\n\t\t\tit('should throw if no drives', function () {\n\t\t\t\texpect(function () {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tavailableDrives.setDrives();\n\t\t\t\t}).to.throw('Missing drives');\n\t\t\t});\n\n\t\t\tit('should throw if drives is not an array', function () {\n\t\t\t\texpect(function () {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tavailableDrives.setDrives(123);\n\t\t\t\t}).to.throw('Invalid drives: 123');\n\t\t\t});\n\n\t\t\tit('should throw if drives is not an array of objects', function () {\n\t\t\t\texpect(function () {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tavailableDrives.setDrives([123, 123, 123]);\n\t\t\t\t}).to.throw('Invalid drives: 123,123,123');\n\t\t\t});\n\t\t});\n\n\t\tdescribe('given no drives', function () {\n\t\t\tdescribe('.hasAvailableDrives()', function () {\n\t\t\t\tit('should return false', function () {\n\t\t\t\t\texpect(availableDrives.hasAvailableDrives()).to.be.false;\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe('.setDrives()', function () {\n\t\t\t\tit('should be able to set drives', function () {\n\t\t\t\t\tconst drives = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdevice: '/dev/sdb',\n\t\t\t\t\t\t\tdescription: 'Foo',\n\t\t\t\t\t\t\tsize: 14000000000,\n\t\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpath: '/mnt/foo',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tisSystem: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\n\t\t\t\t\tavailableDrives.setDrives(drives);\n\t\t\t\t\texpect(availableDrives.getDrives()).to.deep.equal(drives);\n\t\t\t\t});\n\n\t\t\t\tit('should be able to set drives with extra properties', function () {\n\t\t\t\t\tconst drives = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdevice: '/dev/sdb',\n\t\t\t\t\t\t\tdescription: 'Foo',\n\t\t\t\t\t\t\tsize: 14000000000,\n\t\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpath: '/mnt/foo',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tisSystem: false,\n\t\t\t\t\t\t\tfoo: {\n\t\t\t\t\t\t\t\tbar: 'baz',\n\t\t\t\t\t\t\t\tqux: 5,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tset: {},\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\n\t\t\t\t\tavailableDrives.setDrives(drives);\n\t\t\t\t\texpect(availableDrives.getDrives()).to.deep.equal(drives);\n\t\t\t\t});\n\n\t\t\t\tit('should be able to set drives with null sizes', function () {\n\t\t\t\t\tconst drives = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdevice: '/dev/sdb',\n\t\t\t\t\t\t\tdescription: 'Foo',\n\t\t\t\t\t\t\tsize: null,\n\t\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpath: '/mnt/foo',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tisSystem: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\n\t\t\t\t\tavailableDrives.setDrives(drives);\n\t\t\t\t\texpect(availableDrives.getDrives()).to.deep.equal(drives);\n\t\t\t\t});\n\n\t\t\t\tdescribe('given no selected image and no selected drive', function () {\n\t\t\t\t\tbeforeEach(function () {\n\t\t\t\t\t\tselectionState.clear();\n\t\t\t\t\t});\n\n\t\t\t\t\tit('should auto-select a single valid available drive', function () {\n\t\t\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\n\t\t\t\t\t\tavailableDrives.setDrives([\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdevice: '/dev/sdb',\n\t\t\t\t\t\t\t\tname: 'Foo',\n\t\t\t\t\t\t\t\tsize: 999999999,\n\t\t\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tpath: '/mnt/foo',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tisSystem: false,\n\t\t\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]);\n\n\t\t\t\t\t\texpect(selectionState.hasDrive()).to.be.true;\n\t\t\t\t\t\texpect(selectionState.getSelectedDevices()[0]).to.equal('/dev/sdb');\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tdescribe('given a selected image and no selected drive', function () {\n\t\t\t\t\tbeforeEach(function () {\n\t\t\t\t\t\tif (process.platform === 'win32') {\n\t\t\t\t\t\t\tthis.imagePath = 'E:\\\\bar\\\\foo.img';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.imagePath = '/mnt/bar/foo.img';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tselectionState.clear();\n\t\t\t\t\t\tselectionState.selectSource({\n\t\t\t\t\t\t\tdescription: this.imagePath.split('/').pop(),\n\t\t\t\t\t\t\tdisplayName: this.imagePath,\n\t\t\t\t\t\t\tpath: this.imagePath,\n\t\t\t\t\t\t\textension: 'img',\n\t\t\t\t\t\t\tsize: 999999999,\n\t\t\t\t\t\t\tisSizeEstimated: false,\n\t\t\t\t\t\t\tSourceType: 'File',\n\t\t\t\t\t\t\trecommendedDriveSize: 2000000000,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\n\t\t\t\t\tafterEach(function () {\n\t\t\t\t\t\tselectionState.deselectImage();\n\t\t\t\t\t});\n\n\t\t\t\t\tit('should not auto-select when there are multiple valid available drives', function () {\n\t\t\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\n\t\t\t\t\t\tavailableDrives.setDrives([\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdevice: '/dev/sdb',\n\t\t\t\t\t\t\t\tname: 'Foo',\n\t\t\t\t\t\t\t\tsize: 999999999,\n\t\t\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tpath: '/mnt/foo',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tisSystem: false,\n\t\t\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdevice: '/dev/sdc',\n\t\t\t\t\t\t\t\tname: 'Bar',\n\t\t\t\t\t\t\t\tsize: 999999999,\n\t\t\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tpath: '/mnt/bar',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tisSystem: false,\n\t\t\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]);\n\n\t\t\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\t\t\t\t\t});\n\n\t\t\t\t\tit('should auto-select a single valid available drive', function () {\n\t\t\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\n\t\t\t\t\t\tavailableDrives.setDrives([\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdevice: '/dev/sdb',\n\t\t\t\t\t\t\t\tname: 'Foo',\n\t\t\t\t\t\t\t\tsize: 2000000000,\n\t\t\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tpath: '/mnt/foo',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tisSystem: false,\n\t\t\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]);\n\n\t\t\t\t\t\texpect(selectionState.getSelectedDevices()[0]).to.equal('/dev/sdb');\n\t\t\t\t\t});\n\n\t\t\t\t\tit('should not auto-select a single too small drive', function () {\n\t\t\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\n\t\t\t\t\t\tavailableDrives.setDrives([\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdevice: '/dev/sdb',\n\t\t\t\t\t\t\t\tname: 'Foo',\n\t\t\t\t\t\t\t\tsize: 99999999,\n\t\t\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tpath: '/mnt/foo',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tisSystem: false,\n\t\t\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]);\n\n\t\t\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\t\t\t\t\t});\n\n\t\t\t\t\tit(\"should not auto-select a single drive that doesn't meet the recommended size\", function () {\n\t\t\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\n\t\t\t\t\t\tavailableDrives.setDrives([\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdevice: '/dev/sdb',\n\t\t\t\t\t\t\t\tname: 'Foo',\n\t\t\t\t\t\t\t\tsize: 1500000000,\n\t\t\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tpath: '/mnt/foo',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tisSystem: false,\n\t\t\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]);\n\n\t\t\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\t\t\t\t\t});\n\n\t\t\t\t\tit('should not auto-select a single protected drive', function () {\n\t\t\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\n\t\t\t\t\t\tavailableDrives.setDrives([\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdevice: '/dev/sdb',\n\t\t\t\t\t\t\t\tname: 'Foo',\n\t\t\t\t\t\t\t\tsize: 2000000000,\n\t\t\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tpath: '/mnt/foo',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tisSystem: false,\n\t\t\t\t\t\t\t\tisReadOnly: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]);\n\n\t\t\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\t\t\t\t\t});\n\n\t\t\t\t\tit('should not auto-select a source drive', function () {\n\t\t\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\n\t\t\t\t\t\tavailableDrives.setDrives([\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdevice: '/dev/sdb',\n\t\t\t\t\t\t\t\tname: 'Foo',\n\t\t\t\t\t\t\t\tsize: 2000000000,\n\t\t\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tpath: path.dirname(this.imagePath),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tisSystem: false,\n\t\t\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]);\n\n\t\t\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\t\t\t\t\t});\n\n\t\t\t\t\tit('should not auto-select a single system drive', function () {\n\t\t\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\n\t\t\t\t\t\tavailableDrives.setDrives([\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdevice: '/dev/sdb',\n\t\t\t\t\t\t\t\tname: 'Foo',\n\t\t\t\t\t\t\t\tsize: 2000000000,\n\t\t\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tpath: '/mnt/foo',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tisSystem: true,\n\t\t\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]);\n\n\t\t\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\t\t\t\t\t});\n\n\t\t\t\t\tit('should not auto-select a single large size drive', function () {\n\t\t\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\n\t\t\t\t\t\tavailableDrives.setDrives([\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdevice: '/dev/sdb',\n\t\t\t\t\t\t\t\tname: 'Foo',\n\t\t\t\t\t\t\t\tsize: constraints.LARGE_DRIVE_SIZE + 1,\n\t\t\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tpath: '/mnt/foo',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tsystem: false,\n\t\t\t\t\t\t\t\tprotected: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]);\n\n\t\t\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\tdescribe('given drives', function () {\n\t\t\tbeforeEach(function () {\n\t\t\t\tthis.drives = [\n\t\t\t\t\t{\n\t\t\t\t\t\tdevice: '/dev/sdb',\n\t\t\t\t\t\tname: 'SD Card',\n\t\t\t\t\t\tsize: 9999999,\n\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpath: '/mnt/foo',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tisSystem: false,\n\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdevice: '/dev/sdc',\n\t\t\t\t\t\tname: 'USB Drive',\n\t\t\t\t\t\tsize: 9999999,\n\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpath: '/mnt/bar',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tisSystem: false,\n\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tavailableDrives.setDrives(this.drives);\n\t\t\t});\n\n\t\t\tdescribe('given one of the drives was selected', function () {\n\t\t\t\tbeforeEach(function () {\n\t\t\t\t\tavailableDrives.setDrives([\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdevice: '/dev/sdc',\n\t\t\t\t\t\t\tname: 'USB Drive',\n\t\t\t\t\t\t\tsize: 9999999,\n\t\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpath: '/mnt/bar',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tisSystem: false,\n\t\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t]);\n\n\t\t\t\t\tselectionState.selectDrive('/dev/sdc');\n\t\t\t\t});\n\n\t\t\t\tafterEach(function () {\n\t\t\t\t\tselectionState.clear();\n\t\t\t\t});\n\n\t\t\t\tit('should be deleted if its not contained in the available drives anymore', function () {\n\t\t\t\t\texpect(selectionState.hasDrive()).to.be.true;\n\n\t\t\t\t\t// We have to provide at least two drives, otherwise,\n\t\t\t\t\t// if we only provide one, the single drive will be\n\t\t\t\t\t// auto-selected.\n\t\t\t\t\tavailableDrives.setDrives([\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdevice: '/dev/sda',\n\t\t\t\t\t\t\tname: 'USB Drive',\n\t\t\t\t\t\t\tsize: 9999999,\n\t\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpath: '/mnt/bar',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tisSystem: false,\n\t\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdevice: '/dev/sdb',\n\t\t\t\t\t\t\tname: 'SD Card',\n\t\t\t\t\t\t\tsize: 9999999,\n\t\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpath: '/mnt/foo',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tisSystem: false,\n\t\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t]);\n\n\t\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe('.hasAvailableDrives()', function () {\n\t\t\t\tit('should return true', function () {\n\t\t\t\t\tconst hasDrives = availableDrives.hasAvailableDrives();\n\t\t\t\t\texpect(hasDrives).to.be.true;\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe('.setDrives()', function () {\n\t\t\t\tit('should keep the same drives if equal', function () {\n\t\t\t\t\tavailableDrives.setDrives(this.drives);\n\t\t\t\t\texpect(availableDrives.getDrives()).to.deep.equal(this.drives);\n\t\t\t\t});\n\n\t\t\t\tit('should return empty array given an empty array', function () {\n\t\t\t\t\tavailableDrives.setDrives([]);\n\t\t\t\t\texpect(availableDrives.getDrives()).to.deep.equal([]);\n\t\t\t\t});\n\n\t\t\t\tit('should consider drives with different $$hashKey the same', function () {\n\t\t\t\t\tthis.drives[0].$$haskey = 1234;\n\t\t\t\t\tavailableDrives.setDrives(this.drives);\n\t\t\t\t\texpect(availableDrives.getDrives()).to.deep.equal(this.drives);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "tests/gui/models/flash-state.spec.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { expect } from 'chai';\n\nimport * as flashState from '../../../lib/gui/app/models/flash-state';\n\ndescribe('Model: flashState', function () {\n\tbeforeEach(function () {\n\t\tflashState.resetState();\n\t});\n\n\tdescribe('flashState', function () {\n\t\tdescribe('.resetState()', function () {\n\t\t\tit('should be able to reset the progress state', function () {\n\t\t\t\tflashState.setFlashingFlag();\n\t\t\t\tflashState.setProgressState({\n\t\t\t\t\tfailed: 0,\n\t\t\t\t\ttype: 'flashing',\n\t\t\t\t\tpercentage: 50,\n\t\t\t\t\teta: 15,\n\t\t\t\t\tspeed: 100000000000,\n\t\t\t\t\taverageSpeed: 100000000000,\n\t\t\t\t\tbytes: 0,\n\t\t\t\t\tposition: 0,\n\t\t\t\t\tactive: 0,\n\t\t\t\t});\n\n\t\t\t\tflashState.resetState();\n\n\t\t\t\texpect(flashState.getFlashState()).to.deep.equal({\n\t\t\t\t\tactive: 0,\n\t\t\t\t\tfailed: 0,\n\t\t\t\t\tpercentage: 0,\n\t\t\t\t\tspeed: null,\n\t\t\t\t\taverageSpeed: null,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit('should be able to reset the progress state', function () {\n\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\tcancelled: false,\n\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t});\n\n\t\t\t\tflashState.resetState();\n\t\t\t\texpect(flashState.getFlashResults()).to.deep.equal({});\n\t\t\t});\n\n\t\t\tit('should unset the flashing flag', function () {\n\t\t\t\tflashState.setFlashingFlag();\n\t\t\t\tflashState.resetState();\n\t\t\t\texpect(flashState.isFlashing()).to.be.false;\n\t\t\t});\n\n\t\t\tit('should unset the flash uuid', function () {\n\t\t\t\tflashState.setFlashingFlag();\n\t\t\t\tflashState.resetState();\n\t\t\t\texpect(flashState.getFlashUuid()).to.be.undefined;\n\t\t\t});\n\t\t});\n\n\t\tdescribe('.isFlashing()', function () {\n\t\t\tit('should return false by default', function () {\n\t\t\t\texpect(flashState.isFlashing()).to.be.false;\n\t\t\t});\n\n\t\t\tit('should return true if flashing', function () {\n\t\t\t\tflashState.setFlashingFlag();\n\t\t\t\texpect(flashState.isFlashing()).to.be.true;\n\t\t\t});\n\t\t});\n\n\t\tdescribe('.setProgressState()', function () {\n\t\t\tit('should not allow setting the state if flashing is false', function () {\n\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\tcancelled: false,\n\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t});\n\n\t\t\t\texpect(function () {\n\t\t\t\t\tflashState.setProgressState({\n\t\t\t\t\t\tfailed: 0,\n\t\t\t\t\t\ttype: 'flashing',\n\t\t\t\t\t\tpercentage: 50,\n\t\t\t\t\t\teta: 15,\n\t\t\t\t\t\tspeed: 100000000000,\n\t\t\t\t\t\taverageSpeed: 100000000000,\n\t\t\t\t\t\tbytes: 0,\n\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\tactive: 0,\n\t\t\t\t\t});\n\t\t\t\t}).to.throw(\"Can't set the flashing state when not flashing\");\n\t\t\t});\n\n\t\t\tit('should not throw if percentage is 0', function () {\n\t\t\t\tflashState.setFlashingFlag();\n\t\t\t\texpect(function () {\n\t\t\t\t\tflashState.setProgressState({\n\t\t\t\t\t\tfailed: 0,\n\t\t\t\t\t\ttype: 'flashing',\n\t\t\t\t\t\tpercentage: 0,\n\t\t\t\t\t\teta: 15,\n\t\t\t\t\t\tspeed: 100000000000,\n\t\t\t\t\t\taverageSpeed: 100000000000,\n\t\t\t\t\t\tbytes: 0,\n\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\tactive: 0,\n\t\t\t\t\t});\n\t\t\t\t}).to.not.throw('Missing flash fields: percentage');\n\t\t\t});\n\n\t\t\tit('should throw if percentage is outside maximum bound', function () {\n\t\t\t\tflashState.setFlashingFlag();\n\t\t\t\texpect(function () {\n\t\t\t\t\tflashState.setProgressState({\n\t\t\t\t\t\tfailed: 0,\n\t\t\t\t\t\ttype: 'flashing',\n\t\t\t\t\t\tpercentage: 101,\n\t\t\t\t\t\teta: 15,\n\t\t\t\t\t\tspeed: 0,\n\t\t\t\t\t\taverageSpeed: 0,\n\t\t\t\t\t\tbytes: 0,\n\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\tactive: 0,\n\t\t\t\t\t});\n\t\t\t\t}).to.throw('Invalid state percentage: 101');\n\t\t\t});\n\n\t\t\tit('should throw if percentage is outside minimum bound', function () {\n\t\t\t\tflashState.setFlashingFlag();\n\t\t\t\texpect(function () {\n\t\t\t\t\tflashState.setProgressState({\n\t\t\t\t\t\tfailed: 0,\n\t\t\t\t\t\ttype: 'flashing',\n\t\t\t\t\t\tpercentage: -1,\n\t\t\t\t\t\teta: 15,\n\t\t\t\t\t\tspeed: 0,\n\t\t\t\t\t\taverageSpeed: 0,\n\t\t\t\t\t\tbytes: 0,\n\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\tactive: 0,\n\t\t\t\t\t});\n\t\t\t\t}).to.throw('Invalid state percentage: -1');\n\t\t\t});\n\n\t\t\tit('should not throw if eta is equal to zero', function () {\n\t\t\t\tflashState.setFlashingFlag();\n\t\t\t\texpect(function () {\n\t\t\t\t\tflashState.setProgressState({\n\t\t\t\t\t\tfailed: 0,\n\t\t\t\t\t\ttype: 'flashing',\n\t\t\t\t\t\tpercentage: 50,\n\t\t\t\t\t\teta: 0,\n\t\t\t\t\t\tspeed: 100000000000,\n\t\t\t\t\t\taverageSpeed: 100000000000,\n\t\t\t\t\t\tbytes: 0,\n\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\tactive: 0,\n\t\t\t\t\t});\n\t\t\t\t}).to.not.throw('Missing flash field eta');\n\t\t\t});\n\n\t\t\tit('should throw if eta is not a number', function () {\n\t\t\t\tflashState.setFlashingFlag();\n\t\t\t\texpect(function () {\n\t\t\t\t\tflashState.setProgressState({\n\t\t\t\t\t\tfailed: 0,\n\t\t\t\t\t\ttype: 'flashing',\n\t\t\t\t\t\tpercentage: 50,\n\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\teta: '15',\n\t\t\t\t\t\tspeed: 100000000000,\n\t\t\t\t\t\taverageSpeed: 100000000000,\n\t\t\t\t\t\tbytes: 0,\n\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\tactive: 0,\n\t\t\t\t\t});\n\t\t\t\t}).to.throw('Invalid state eta: 15');\n\t\t\t});\n\n\t\t\tit('should throw if speed is missing', function () {\n\t\t\t\tflashState.setFlashingFlag();\n\t\t\t\texpect(function () {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tflashState.setProgressState({\n\t\t\t\t\t\tfailed: 0,\n\t\t\t\t\t\ttype: 'flashing',\n\t\t\t\t\t\tpercentage: 50,\n\t\t\t\t\t\teta: 15,\n\t\t\t\t\t\taverageSpeed: 0,\n\t\t\t\t\t\tbytes: 0,\n\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\tactive: 0,\n\t\t\t\t\t});\n\t\t\t\t}).to.throw('Missing flash fields: speed');\n\t\t\t});\n\n\t\t\tit('should not throw if speed is 0', function () {\n\t\t\t\tflashState.setFlashingFlag();\n\t\t\t\texpect(function () {\n\t\t\t\t\tflashState.setProgressState({\n\t\t\t\t\t\tfailed: 0,\n\t\t\t\t\t\ttype: 'flashing',\n\t\t\t\t\t\tpercentage: 50,\n\t\t\t\t\t\teta: 15,\n\t\t\t\t\t\tspeed: 0,\n\t\t\t\t\t\taverageSpeed: 0,\n\t\t\t\t\t\tbytes: 0,\n\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\tactive: 0,\n\t\t\t\t\t});\n\t\t\t\t}).to.not.throw('Missing flash fields: speed');\n\t\t\t});\n\n\t\t\tit('should floor the percentage number', function () {\n\t\t\t\tflashState.setFlashingFlag();\n\t\t\t\tflashState.setProgressState({\n\t\t\t\t\tfailed: 0,\n\t\t\t\t\ttype: 'flashing',\n\t\t\t\t\tpercentage: 50.253559459485,\n\t\t\t\t\teta: 15,\n\t\t\t\t\tspeed: 0,\n\t\t\t\t\taverageSpeed: 0,\n\t\t\t\t\tbytes: 0,\n\t\t\t\t\tposition: 0,\n\t\t\t\t\tactive: 0,\n\t\t\t\t});\n\n\t\t\t\texpect(flashState.getFlashState().percentage).to.equal(50);\n\t\t\t});\n\n\t\t\tit('should error when any field is non-nil but not a finite number', function () {\n\t\t\t\texpect(() => {\n\t\t\t\t\tflashState.setFlashingFlag();\n\t\t\t\t\tflashState.setProgressState({\n\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\tflashing: {},\n\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\tverifying: [],\n\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\tsuccessful: true,\n\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\tfailed: 'string',\n\t\t\t\t\t\tpercentage: 0,\n\t\t\t\t\t\teta: 0,\n\t\t\t\t\t\tspeed: 0,\n\t\t\t\t\t\taverageSpeed: 0,\n\t\t\t\t\t\tbytes: 0,\n\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\tactive: 0,\n\t\t\t\t\t\ttype: 'flashing',\n\t\t\t\t\t});\n\t\t\t\t}).to.throw('State quantity field(s) not finite number');\n\t\t\t});\n\n\t\t\tit('should not error when all quantity fields are zero', function () {\n\t\t\t\texpect(() => {\n\t\t\t\t\tflashState.setFlashingFlag();\n\t\t\t\t\tflashState.setProgressState({\n\t\t\t\t\t\tfailed: 0,\n\t\t\t\t\t\tpercentage: 0,\n\t\t\t\t\t\teta: 0,\n\t\t\t\t\t\tspeed: 0,\n\t\t\t\t\t\taverageSpeed: 0,\n\t\t\t\t\t\tbytes: 0,\n\t\t\t\t\t\tposition: 0,\n\t\t\t\t\t\tactive: 0,\n\t\t\t\t\t\ttype: 'flashing',\n\t\t\t\t\t});\n\t\t\t\t}).to.not.throw();\n\t\t\t});\n\t\t});\n\n\t\tdescribe('.getFlashResults()', function () {\n\t\t\tit('should get the flash results', function () {\n\t\t\t\tflashState.setFlashingFlag();\n\n\t\t\t\tconst expectedResults = {\n\t\t\t\t\tcancelled: false,\n\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t};\n\n\t\t\t\tflashState.unsetFlashingFlag(expectedResults);\n\t\t\t\tconst results = flashState.getFlashResults();\n\t\t\t\texpect(results).to.deep.equal(expectedResults);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('.getFlashState()', function () {\n\t\t\tit('should initially return an empty state', function () {\n\t\t\t\tflashState.resetState();\n\t\t\t\tconst currentFlashState = flashState.getFlashState();\n\t\t\t\texpect(currentFlashState).to.deep.equal({\n\t\t\t\t\tactive: 0,\n\t\t\t\t\tfailed: 0,\n\t\t\t\t\tpercentage: 0,\n\t\t\t\t\tspeed: null,\n\t\t\t\t\taverageSpeed: null,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit('should return the current flash state', function () {\n\t\t\t\tconst state = {\n\t\t\t\t\tfailed: 0,\n\t\t\t\t\tpercentage: 50,\n\t\t\t\t\teta: 15,\n\t\t\t\t\tspeed: 0,\n\t\t\t\t\taverageSpeed: 0,\n\t\t\t\t\tbytes: 0,\n\t\t\t\t\tposition: 0,\n\t\t\t\t\tactive: 0,\n\t\t\t\t\ttype: 'flashing' as const,\n\t\t\t\t};\n\n\t\t\t\tflashState.setFlashingFlag();\n\t\t\t\tflashState.setProgressState(state);\n\t\t\t\tconst currentFlashState = flashState.getFlashState();\n\t\t\t\texpect(currentFlashState).to.deep.equal({\n\t\t\t\t\tfailed: 0,\n\t\t\t\t\tpercentage: 50,\n\t\t\t\t\teta: 15,\n\t\t\t\t\tspeed: 0,\n\t\t\t\t\taverageSpeed: 0,\n\t\t\t\t\tbytes: 0,\n\t\t\t\t\tposition: 0,\n\t\t\t\t\tactive: 0,\n\t\t\t\t\ttype: 'flashing',\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\tdescribe('.unsetFlashingFlag()', function () {\n\t\t\tit('should throw if no flashing results', function () {\n\t\t\t\texpect(function () {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tflashState.unsetFlashingFlag();\n\t\t\t\t}).to.throw('Missing results');\n\t\t\t});\n\n\t\t\tit('should be able to set a string error code', function () {\n\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\tcancelled: false,\n\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t\terrorCode: 'EBUSY',\n\t\t\t\t});\n\n\t\t\t\texpect(flashState.getLastFlashErrorCode()).to.equal('EBUSY');\n\t\t\t});\n\n\t\t\tit('should be able to set a number error code', function () {\n\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\tcancelled: false,\n\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t\terrorCode: 123,\n\t\t\t\t});\n\n\t\t\t\texpect(flashState.getLastFlashErrorCode()).to.equal(123);\n\t\t\t});\n\n\t\t\tit('should throw if errorCode is not a number not a string', function () {\n\t\t\t\texpect(function () {\n\t\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\t\tcancelled: false,\n\t\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\terrorCode: {\n\t\t\t\t\t\t\tname: 'EBUSY',\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}).to.throw('Invalid results errorCode: [object Object]');\n\t\t\t});\n\n\t\t\tit('should default cancelled to false', function () {\n\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t});\n\n\t\t\t\tconst flashResults = flashState.getFlashResults();\n\n\t\t\t\texpect(flashResults).to.deep.equal({\n\t\t\t\t\tcancelled: false,\n\t\t\t\t\tskip: false,\n\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit('should throw if cancelled is not boolean', function () {\n\t\t\t\texpect(function () {\n\t\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\tcancelled: 'false',\n\t\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t\t});\n\t\t\t\t}).to.throw('Invalid results cancelled: false');\n\t\t\t});\n\n\t\t\tit('should throw if cancelled is true and sourceChecksum exists', function () {\n\t\t\t\texpect(function () {\n\t\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\t\tcancelled: true,\n\t\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t\t});\n\t\t\t\t}).to.throw(\n\t\t\t\t\t\"The sourceChecksum value can't exist if the flashing was cancelled\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit('should be able to set flashing to false', function () {\n\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\tcancelled: false,\n\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t});\n\n\t\t\t\texpect(flashState.isFlashing()).to.be.false;\n\t\t\t});\n\n\t\t\tit('should reset the flashing state', function () {\n\t\t\t\tflashState.setFlashingFlag();\n\n\t\t\t\tflashState.setProgressState({\n\t\t\t\t\tfailed: 0,\n\t\t\t\t\ttype: 'flashing',\n\t\t\t\t\tpercentage: 50,\n\t\t\t\t\teta: 15,\n\t\t\t\t\tspeed: 100000000000,\n\t\t\t\t\taverageSpeed: 100000000000,\n\t\t\t\t\tbytes: 0,\n\t\t\t\t\tposition: 0,\n\t\t\t\t\tactive: 2,\n\t\t\t\t});\n\n\t\t\t\texpect(flashState.getFlashState()).to.not.deep.equal({\n\t\t\t\t\tfailed: 0,\n\t\t\t\t\tpercentage: 0,\n\t\t\t\t\tspeed: 0,\n\t\t\t\t\taverageSpeed: 0,\n\t\t\t\t});\n\n\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\tcancelled: false,\n\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t});\n\n\t\t\t\texpect(flashState.getFlashState()).to.deep.equal({\n\t\t\t\t\tactive: 0,\n\t\t\t\t\tfailed: 0,\n\t\t\t\t\tpercentage: 0,\n\t\t\t\t\tspeed: null,\n\t\t\t\t\taverageSpeed: null,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit('should not reset the flash uuid', function () {\n\t\t\t\tflashState.setFlashingFlag();\n\t\t\t\tconst uuidBeforeUnset = flashState.getFlashUuid();\n\n\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t\tcancelled: false,\n\t\t\t\t});\n\n\t\t\t\tconst uuidAfterUnset = flashState.getFlashUuid();\n\t\t\t\texpect(uuidBeforeUnset).to.equal(uuidAfterUnset);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('.setFlashingFlag()', function () {\n\t\t\tit('should be able to set flashing to true', function () {\n\t\t\t\tflashState.setFlashingFlag();\n\t\t\t\texpect(flashState.isFlashing()).to.be.true;\n\t\t\t});\n\n\t\t\tit('should reset the flash results', function () {\n\t\t\t\tconst expectedResults = {\n\t\t\t\t\tcancelled: false,\n\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t};\n\n\t\t\t\tflashState.unsetFlashingFlag(expectedResults);\n\t\t\t\tconst results = flashState.getFlashResults();\n\t\t\t\texpect(results).to.deep.equal(expectedResults);\n\t\t\t\tflashState.setFlashingFlag();\n\t\t\t\texpect(flashState.getFlashResults()).to.deep.equal({});\n\t\t\t});\n\t\t});\n\n\t\tdescribe('.wasLastFlashCancelled()', function () {\n\t\t\tit('should return false given a pristine state', function () {\n\t\t\t\tflashState.resetState();\n\t\t\t\texpect(flashState.wasLastFlashCancelled()).to.be.false;\n\t\t\t});\n\n\t\t\tit('should return false if !cancelled', function () {\n\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t\tcancelled: false,\n\t\t\t\t});\n\n\t\t\t\texpect(flashState.wasLastFlashCancelled()).to.be.false;\n\t\t\t});\n\n\t\t\tit('should return true if cancelled', function () {\n\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\tcancelled: true,\n\t\t\t\t});\n\n\t\t\t\texpect(flashState.wasLastFlashCancelled()).to.be.true;\n\t\t\t});\n\t\t});\n\n\t\tdescribe('.getLastFlashSourceChecksum()', function () {\n\t\t\tit('should return undefined given a pristine state', function () {\n\t\t\t\tflashState.resetState();\n\t\t\t\texpect(flashState.getLastFlashSourceChecksum()).to.be.undefined;\n\t\t\t});\n\n\t\t\tit('should return the last flash source checksum', function () {\n\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t\tcancelled: false,\n\t\t\t\t});\n\n\t\t\t\texpect(flashState.getLastFlashSourceChecksum()).to.equal('1234');\n\t\t\t});\n\n\t\t\tit('should return undefined if the last flash was cancelled', function () {\n\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\tcancelled: true,\n\t\t\t\t});\n\n\t\t\t\texpect(flashState.getLastFlashSourceChecksum()).to.be.undefined;\n\t\t\t});\n\t\t});\n\n\t\tdescribe('.getLastFlashErrorCode()', function () {\n\t\t\tit('should return undefined given a pristine state', function () {\n\t\t\t\tflashState.resetState();\n\t\t\t\texpect(flashState.getLastFlashErrorCode()).to.be.undefined;\n\t\t\t});\n\n\t\t\tit('should return the last flash error code', function () {\n\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t\tcancelled: false,\n\t\t\t\t\terrorCode: 'ENOSPC',\n\t\t\t\t});\n\n\t\t\t\texpect(flashState.getLastFlashErrorCode()).to.equal('ENOSPC');\n\t\t\t});\n\n\t\t\tit('should return undefined if the last flash did not report an error code', function () {\n\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t\tcancelled: false,\n\t\t\t\t});\n\n\t\t\t\texpect(flashState.getLastFlashErrorCode()).to.be.undefined;\n\t\t\t});\n\t\t});\n\n\t\tdescribe('.getFlashUuid()', function () {\n\t\t\tconst UUID_REGEX =\n\t\t\t\t/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;\n\n\t\t\tit('should be initially undefined', function () {\n\t\t\t\texpect(flashState.getFlashUuid()).to.be.undefined;\n\t\t\t});\n\n\t\t\tit('should be a valid uuid if the flashing flag is set', function () {\n\t\t\t\tflashState.setFlashingFlag();\n\t\t\t\tconst uuid = flashState.getFlashUuid();\n\t\t\t\texpect(UUID_REGEX.test(uuid)).to.be.true;\n\t\t\t});\n\n\t\t\tit('should return different uuids every time the flashing flag is set', function () {\n\t\t\t\tflashState.setFlashingFlag();\n\t\t\t\tconst uuid1 = flashState.getFlashUuid();\n\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t\tcancelled: false,\n\t\t\t\t});\n\n\t\t\t\tflashState.setFlashingFlag();\n\t\t\t\tconst uuid2 = flashState.getFlashUuid();\n\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\tcancelled: true,\n\t\t\t\t});\n\n\t\t\t\tflashState.setFlashingFlag();\n\t\t\t\tconst uuid3 = flashState.getFlashUuid();\n\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t\tcancelled: false,\n\t\t\t\t});\n\n\t\t\t\texpect(UUID_REGEX.test(uuid1)).to.be.true;\n\t\t\t\texpect(UUID_REGEX.test(uuid2)).to.be.true;\n\t\t\t\texpect(UUID_REGEX.test(uuid3)).to.be.true;\n\n\t\t\t\texpect(uuid1).to.not.equal(uuid2);\n\t\t\t\texpect(uuid2).to.not.equal(uuid3);\n\t\t\t\texpect(uuid3).to.not.equal(uuid1);\n\t\t\t});\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "tests/gui/models/selection-state.spec.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { expect } from 'chai';\nimport * as path from 'path';\nimport type { SourceMetadata } from '../../../lib/shared/typings/source-selector';\n\nimport * as availableDrives from '../../../lib/gui/app/models/available-drives';\nimport * as selectionState from '../../../lib/gui/app/models/selection-state';\nimport type { DrivelistDrive } from '../../../lib/shared/drive-constraints';\n\ndescribe('Model: selectionState', function () {\n\tdescribe('given a clean state', function () {\n\t\tbeforeEach(function () {\n\t\t\tselectionState.clear();\n\t\t});\n\n\t\tit('getImage() should return undefined', function () {\n\t\t\texpect(selectionState.getImage()).to.be.undefined;\n\t\t});\n\n\t\tit('hasDrive() should return false', function () {\n\t\t\tconst hasDrive = selectionState.hasDrive();\n\t\t\texpect(hasDrive).to.be.false;\n\t\t});\n\n\t\tit('hasImage() should return false', function () {\n\t\t\tconst hasImage = selectionState.hasImage();\n\t\t\texpect(hasImage).to.be.false;\n\t\t});\n\n\t\tit('.getSelectedDrives() should return []', function () {\n\t\t\texpect(selectionState.getSelectedDrives()).to.deep.equal([]);\n\t\t});\n\t});\n\n\tdescribe('given one available drive', function () {\n\t\tbeforeEach(function () {\n\t\t\tthis.drives = [\n\t\t\t\t{\n\t\t\t\t\tdevice: '/dev/disk2',\n\t\t\t\t\tname: 'USB Drive',\n\t\t\t\t\tsize: 999999999,\n\t\t\t\t\tisReadOnly: false,\n\t\t\t\t},\n\t\t\t];\n\t\t});\n\n\t\tafterEach(function () {\n\t\t\tselectionState.clear();\n\t\t\tavailableDrives.setDrives([]);\n\t\t});\n\n\t\tdescribe('.selectDrive()', function () {\n\t\t\tit('should not deselect when warning is attached to image-drive pair', function () {\n\t\t\t\tthis.drives[0].size = 64e10;\n\n\t\t\t\tavailableDrives.setDrives(this.drives);\n\t\t\t\tselectionState.selectDrive('/dev/disk2');\n\t\t\t\tavailableDrives.setDrives(this.drives);\n\t\t\t\texpect(selectionState.getSelectedDevices()[0]).to.equal('/dev/disk2');\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe('given a drive', function () {\n\t\tbeforeEach(function () {\n\t\t\tavailableDrives.setDrives([\n\t\t\t\t{\n\t\t\t\t\tdevice: '/dev/disk2',\n\t\t\t\t\tname: 'USB Drive',\n\t\t\t\t\tsize: 999999999,\n\t\t\t\t\tisReadOnly: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdevice: '/dev/disk5',\n\t\t\t\t\tname: 'USB Drive',\n\t\t\t\t\tsize: 999999999,\n\t\t\t\t\tisReadOnly: false,\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tselectionState.selectDrive('/dev/disk2');\n\t\t});\n\n\t\tafterEach(function () {\n\t\t\tselectionState.clear();\n\t\t});\n\n\t\tdescribe('.hasDrive()', function () {\n\t\t\tit('should return true', function () {\n\t\t\t\tconst hasDrive = selectionState.hasDrive();\n\t\t\t\texpect(hasDrive).to.be.true;\n\t\t\t});\n\t\t});\n\n\t\tdescribe('.selectDrive()', function () {\n\t\t\tit('should queue the drive', function () {\n\t\t\t\tselectionState.selectDrive('/dev/disk5');\n\t\t\t\tconst drives = selectionState.getSelectedDevices();\n\t\t\t\tconst lastDriveDevice = drives.pop();\n\t\t\t\tconst lastDrive = availableDrives\n\t\t\t\t\t.getDrives()\n\t\t\t\t\t.find((drive) => drive.device === lastDriveDevice);\n\t\t\t\texpect(lastDrive).to.deep.equal({\n\t\t\t\t\tdevice: '/dev/disk5',\n\t\t\t\t\tname: 'USB Drive',\n\t\t\t\t\tsize: 999999999,\n\t\t\t\t\tisReadOnly: false,\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\tdescribe('.deselectDrive()', function () {\n\t\t\tit('should clear drive', function () {\n\t\t\t\tconst firstDevice = selectionState.getSelectedDevices()[0];\n\t\t\t\tselectionState.deselectDrive(firstDevice);\n\t\t\t\tconst devices = selectionState.getSelectedDevices();\n\t\t\t\texpect(devices.length).to.equal(0);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('.getSelectedDrives()', function () {\n\t\t\tit('should return that single selected drive', function () {\n\t\t\t\texpect(selectionState.getSelectedDrives()).to.deep.equal([\n\t\t\t\t\t{\n\t\t\t\t\t\tdevice: '/dev/disk2',\n\t\t\t\t\t\tname: 'USB Drive',\n\t\t\t\t\t\tsize: 999999999,\n\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe('given several drives', function () {\n\t\tbeforeEach(function () {\n\t\t\tthis.drives = [\n\t\t\t\t{\n\t\t\t\t\tdevice: '/dev/sdb',\n\t\t\t\t\tdescription: 'DataTraveler 2.0',\n\t\t\t\t\tsize: 999999999,\n\t\t\t\t\tmountpoint: '/media/UNTITLED',\n\t\t\t\t\tname: '/dev/sdb',\n\t\t\t\t\tsystem: false,\n\t\t\t\t\tisReadOnly: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdevice: '/dev/disk2',\n\t\t\t\t\tname: 'USB Drive 2',\n\t\t\t\t\tsize: 999999999,\n\t\t\t\t\tisReadOnly: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdevice: '/dev/disk3',\n\t\t\t\t\tname: 'USB Drive 3',\n\t\t\t\t\tsize: 999999999,\n\t\t\t\t\tisReadOnly: false,\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tavailableDrives.setDrives(this.drives);\n\n\t\t\tselectionState.selectDrive(this.drives[0].device);\n\t\t\tselectionState.selectDrive(this.drives[1].device);\n\t\t});\n\n\t\tafterEach(function () {\n\t\t\tselectionState.clear();\n\t\t\tavailableDrives.setDrives([]);\n\t\t});\n\n\t\tit('should be able to add more drives', function () {\n\t\t\tselectionState.selectDrive(this.drives[2].device);\n\t\t\texpect(selectionState.getSelectedDevices()).to.deep.equal(\n\t\t\t\tthis.drives.map((drive: DrivelistDrive) => drive.device),\n\t\t\t);\n\t\t});\n\n\t\tit('should be able to remove drives', function () {\n\t\t\tselectionState.deselectDrive(this.drives[1].device);\n\t\t\texpect(selectionState.getSelectedDevices()).to.deep.equal([\n\t\t\t\tthis.drives[0].device,\n\t\t\t]);\n\t\t});\n\n\t\tit('should keep system drives selected', function () {\n\t\t\tconst systemDrive = {\n\t\t\t\tdevice: '/dev/disk0',\n\t\t\t\tname: 'USB Drive 0',\n\t\t\t\tsize: 999999999,\n\t\t\t\tisReadOnly: false,\n\t\t\t\tsystem: true,\n\t\t\t};\n\n\t\t\tconst newDrives = [...this.drives.slice(0, -1), systemDrive];\n\t\t\tavailableDrives.setDrives(newDrives);\n\n\t\t\tselectionState.selectDrive(systemDrive.device);\n\t\t\tavailableDrives.setDrives(newDrives);\n\t\t\texpect(selectionState.getSelectedDevices()).to.deep.equal(\n\t\t\t\tnewDrives.map((drive: DrivelistDrive) => drive.device),\n\t\t\t);\n\t\t});\n\n\t\tit('should be able to remove a drive', function () {\n\t\t\texpect(selectionState.getSelectedDevices().length).to.equal(2);\n\t\t\tselectionState.toggleDrive(this.drives[0].device);\n\t\t\texpect(selectionState.getSelectedDevices()).to.deep.equal([\n\t\t\t\tthis.drives[1].device,\n\t\t\t]);\n\t\t});\n\n\t\tdescribe('.deselectAllDrives()', function () {\n\t\t\tit('should remove all drives', function () {\n\t\t\t\tselectionState.deselectAllDrives();\n\t\t\t\texpect(selectionState.getSelectedDevices()).to.deep.equal([]);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('.deselectDrive()', function () {\n\t\t\tit('should clear drives', function () {\n\t\t\t\tconst devices = selectionState.getSelectedDevices();\n\t\t\t\tselectionState.deselectDrive(devices[0]);\n\t\t\t\tselectionState.deselectDrive(devices[1]);\n\t\t\t\texpect(selectionState.getSelectedDevices().length).to.equal(0);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('.getSelectedDrives()', function () {\n\t\t\tit('should return the selected drives', function () {\n\t\t\t\texpect(selectionState.getSelectedDrives()).to.deep.equal([\n\t\t\t\t\t{\n\t\t\t\t\t\tdevice: '/dev/disk2',\n\t\t\t\t\t\tname: 'USB Drive 2',\n\t\t\t\t\t\tsize: 999999999,\n\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdevice: '/dev/sdb',\n\t\t\t\t\t\tdescription: 'DataTraveler 2.0',\n\t\t\t\t\t\tsize: 999999999,\n\t\t\t\t\t\tmountpoint: '/media/UNTITLED',\n\t\t\t\t\t\tname: '/dev/sdb',\n\t\t\t\t\t\tsystem: false,\n\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe('given no drive', function () {\n\t\tdescribe('.selectDrive()', function () {\n\t\t\tit('should be able to set a drive', function () {\n\t\t\t\tavailableDrives.setDrives([\n\t\t\t\t\t{\n\t\t\t\t\t\tdevice: '/dev/disk5',\n\t\t\t\t\t\tname: 'USB Drive',\n\t\t\t\t\t\tsize: 999999999,\n\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t},\n\t\t\t\t]);\n\n\t\t\t\tselectionState.selectDrive('/dev/disk5');\n\t\t\t\texpect(selectionState.getSelectedDevices()[0]).to.equal('/dev/disk5');\n\t\t\t});\n\n\t\t\tit('should throw if drive is read-only', function () {\n\t\t\t\tavailableDrives.setDrives([\n\t\t\t\t\t{\n\t\t\t\t\t\tdevice: '/dev/disk1',\n\t\t\t\t\t\tname: 'USB Drive',\n\t\t\t\t\t\tsize: 999999999,\n\t\t\t\t\t\tisReadOnly: true,\n\t\t\t\t\t},\n\t\t\t\t]);\n\n\t\t\t\texpect(function () {\n\t\t\t\t\tselectionState.selectDrive('/dev/disk1');\n\t\t\t\t}).to.throw('The drive is write-protected');\n\t\t\t});\n\n\t\t\tit('should throw if the drive is not available', function () {\n\t\t\t\tavailableDrives.setDrives([\n\t\t\t\t\t{\n\t\t\t\t\t\tdevice: '/dev/disk1',\n\t\t\t\t\t\tname: 'USB Drive',\n\t\t\t\t\t\tsize: 999999999,\n\t\t\t\t\t\tisReadOnly: true,\n\t\t\t\t\t},\n\t\t\t\t]);\n\n\t\t\t\texpect(function () {\n\t\t\t\t\tselectionState.selectDrive('/dev/disk5');\n\t\t\t\t}).to.throw('The drive is not available: /dev/disk5');\n\t\t\t});\n\n\t\t\tit('should throw if device is not a string', function () {\n\t\t\t\texpect(function () {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tselectionState.selectDrive(123);\n\t\t\t\t}).to.throw('Invalid drive: 123');\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe('given an image', function () {\n\t\tbeforeEach(function () {\n\t\t\tthis.image = {\n\t\t\t\tpath: 'foo.img',\n\t\t\t\textension: 'img',\n\t\t\t\tsize: 999999999,\n\t\t\t\trecommendedDriveSize: 1000000000,\n\t\t\t\turl: 'https://www.raspbian.org',\n\t\t\t\tsupportUrl: 'https://www.raspbian.org/forums/',\n\t\t\t\tname: 'Raspbian',\n\t\t\t\tlogo: '<svg><text fill=\"red\">Raspbian</text></svg>',\n\t\t\t};\n\n\t\t\tselectionState.selectSource(this.image);\n\t\t});\n\n\t\tdescribe('.selectDrive()', function () {\n\t\t\tit('should throw if drive is not large enough', function () {\n\t\t\t\tavailableDrives.setDrives([\n\t\t\t\t\t{\n\t\t\t\t\t\tdevice: '/dev/disk2',\n\t\t\t\t\t\tname: 'USB Drive',\n\t\t\t\t\t\tsize: 999999998,\n\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t},\n\t\t\t\t]);\n\n\t\t\t\texpect(function () {\n\t\t\t\t\tselectionState.selectDrive('/dev/disk2');\n\t\t\t\t}).to.throw('The drive is not large enough');\n\t\t\t});\n\t\t});\n\n\t\tdescribe('.getImage()', function () {\n\t\t\tit('should return the image', function () {\n\t\t\t\texpect(selectionState.getImage()).to.deep.equal(this.image);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('.hasImage()', function () {\n\t\t\tit('should return true', function () {\n\t\t\t\tconst hasImage = selectionState.hasImage();\n\t\t\t\texpect(hasImage).to.be.true;\n\t\t\t});\n\t\t});\n\n\t\tdescribe('.selectImage()', function () {\n\t\t\tit('should override the image', function () {\n\t\t\t\tselectionState.selectSource({\n\t\t\t\t\tdescription: 'bar.img',\n\t\t\t\t\tdisplayName: 'bar.img',\n\t\t\t\t\tpath: 'bar.img',\n\t\t\t\t\textension: 'img',\n\t\t\t\t\tsize: 999999999,\n\t\t\t\t\tisSizeEstimated: false,\n\t\t\t\t\tSourceType: 'File',\n\t\t\t\t});\n\n\t\t\t\tconst imagePath = selectionState.getImage()?.path;\n\t\t\t\texpect(imagePath).to.equal('bar.img');\n\t\t\t\tconst imageSize = selectionState.getImage()?.size;\n\t\t\t\texpect(imageSize).to.equal(999999999);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('.deselectImage()', function () {\n\t\t\tit('should clear the image', function () {\n\t\t\t\tselectionState.deselectImage();\n\n\t\t\t\tconst imagePath = selectionState.getImage()?.path;\n\t\t\t\texpect(imagePath).to.be.undefined;\n\t\t\t\tconst imageSize = selectionState.getImage()?.size;\n\t\t\t\texpect(imageSize).to.be.undefined;\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe('given no image', function () {\n\t\tdescribe('.selectImage()', function () {\n\t\t\tafterEach(selectionState.clear);\n\n\t\t\tconst image: SourceMetadata = {\n\t\t\t\tdescription: 'foo.img',\n\t\t\t\tdisplayName: 'foo.img',\n\t\t\t\tpath: 'foo.img',\n\t\t\t\textension: 'img',\n\t\t\t\tsize: 999999999,\n\t\t\t\tisSizeEstimated: false,\n\t\t\t\tSourceType: 'File',\n\t\t\t\trecommendedDriveSize: 2000000000,\n\t\t\t};\n\n\t\t\tit('should be able to set an image', function () {\n\t\t\t\tselectionState.selectSource(image);\n\n\t\t\t\tconst imagePath = selectionState.getImage()?.path;\n\t\t\t\texpect(imagePath).to.equal('foo.img');\n\t\t\t\tconst imageSize = selectionState.getImage()?.size;\n\t\t\t\texpect(imageSize).to.equal(999999999);\n\t\t\t});\n\n\t\t\tit('should be able to set an image with an archive extension', function () {\n\t\t\t\tselectionState.selectSource({\n\t\t\t\t\t...image,\n\t\t\t\t\tpath: 'foo.zip',\n\t\t\t\t\tarchiveExtension: 'zip',\n\t\t\t\t});\n\n\t\t\t\tconst imagePath = selectionState.getImage()?.path;\n\t\t\t\texpect(imagePath).to.equal('foo.zip');\n\t\t\t});\n\n\t\t\tit('should infer a compressed raw image if the penultimate extension is missing', function () {\n\t\t\t\tselectionState.selectSource({\n\t\t\t\t\t...image,\n\t\t\t\t\tpath: 'foo.xz',\n\t\t\t\t\tarchiveExtension: 'xz',\n\t\t\t\t});\n\n\t\t\t\tconst imagePath = selectionState.getImage()?.path;\n\t\t\t\texpect(imagePath).to.equal('foo.xz');\n\t\t\t});\n\n\t\t\tit('should infer a compressed raw image if the penultimate extension is not a file extension', function () {\n\t\t\t\tselectionState.selectSource({\n\t\t\t\t\t...image,\n\t\t\t\t\tpath: 'something.linux-x86-64.gz',\n\t\t\t\t\tarchiveExtension: 'gz',\n\t\t\t\t});\n\n\t\t\t\tconst imagePath = selectionState.getImage()?.path;\n\t\t\t\texpect(imagePath).to.equal('something.linux-x86-64.gz');\n\t\t\t});\n\n\t\t\tit('should throw if the original size is a float number', function () {\n\t\t\t\texpect(function () {\n\t\t\t\t\tselectionState.selectSource({\n\t\t\t\t\t\t...image,\n\t\t\t\t\t\tpath: 'foo.img',\n\t\t\t\t\t\textension: 'img',\n\t\t\t\t\t\tsize: 999999999,\n\t\t\t\t\t\tcompressedSize: 999999999.999,\n\t\t\t\t\t\tisSizeEstimated: false,\n\t\t\t\t\t});\n\t\t\t\t}).to.throw('Invalid image compressed size: 999999999.999');\n\t\t\t});\n\n\t\t\tit('should throw if the original size is negative', function () {\n\t\t\t\texpect(function () {\n\t\t\t\t\tselectionState.selectSource({\n\t\t\t\t\t\t...image,\n\t\t\t\t\t\tcompressedSize: -1,\n\t\t\t\t\t});\n\t\t\t\t}).to.throw('Invalid image compressed size: -1');\n\t\t\t});\n\n\t\t\tit('should throw if the final size is a float number', function () {\n\t\t\t\texpect(function () {\n\t\t\t\t\tselectionState.selectSource({\n\t\t\t\t\t\t...image,\n\t\t\t\t\t\tsize: 999999999.999,\n\t\t\t\t\t});\n\t\t\t\t}).to.throw('Invalid image size: 999999999.999');\n\t\t\t});\n\n\t\t\tit('should throw if the final size is negative', function () {\n\t\t\t\texpect(function () {\n\t\t\t\t\tselectionState.selectSource({\n\t\t\t\t\t\t...image,\n\t\t\t\t\t\tsize: -1,\n\t\t\t\t\t});\n\t\t\t\t}).to.throw('Invalid image size: -1');\n\t\t\t});\n\n\t\t\tit('should de-select a previously selected not-large-enough drive', function () {\n\t\t\t\tavailableDrives.setDrives([\n\t\t\t\t\t{\n\t\t\t\t\t\tdevice: '/dev/disk1',\n\t\t\t\t\t\tname: 'USB Drive',\n\t\t\t\t\t\tsize: 123456789,\n\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t},\n\t\t\t\t]);\n\n\t\t\t\tselectionState.selectDrive('/dev/disk1');\n\t\t\t\texpect(selectionState.hasDrive()).to.be.true;\n\n\t\t\t\tselectionState.selectSource({\n\t\t\t\t\t...image,\n\t\t\t\t\tsize: 1234567890,\n\t\t\t\t});\n\n\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\t\t\t\tselectionState.deselectImage();\n\t\t\t});\n\n\t\t\tit('should de-select a previously selected not-recommended drive', function () {\n\t\t\t\tavailableDrives.setDrives([\n\t\t\t\t\t{\n\t\t\t\t\t\tdevice: '/dev/disk1',\n\t\t\t\t\t\tname: 'USB Drive',\n\t\t\t\t\t\tsize: 1200000000,\n\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t},\n\t\t\t\t]);\n\n\t\t\t\tselectionState.selectDrive('/dev/disk1');\n\t\t\t\texpect(selectionState.hasDrive()).to.be.true;\n\n\t\t\t\tselectionState.selectSource({\n\t\t\t\t\t...image,\n\t\t\t\t\trecommendedDriveSize: 1500000000,\n\t\t\t\t});\n\n\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\t\t\t\tselectionState.deselectImage();\n\t\t\t});\n\n\t\t\tit('should de-select a previously selected source drive', function () {\n\t\t\t\tconst imagePath =\n\t\t\t\t\tprocess.platform === 'win32'\n\t\t\t\t\t\t? 'E:\\\\bar\\\\foo.img'\n\t\t\t\t\t\t: '/mnt/bar/foo.img';\n\n\t\t\t\tavailableDrives.setDrives([\n\t\t\t\t\t{\n\t\t\t\t\t\tdevice: '/dev/disk1',\n\t\t\t\t\t\tname: 'USB Drive',\n\t\t\t\t\t\tsize: 1200000000,\n\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpath: path.dirname(imagePath),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t},\n\t\t\t\t]);\n\n\t\t\t\tselectionState.selectDrive('/dev/disk1');\n\t\t\t\texpect(selectionState.hasDrive()).to.be.true;\n\n\t\t\t\tselectionState.selectSource({\n\t\t\t\t\t...image,\n\t\t\t\t\tpath: imagePath,\n\t\t\t\t\textension: 'img',\n\t\t\t\t\tsize: 999999999,\n\t\t\t\t});\n\n\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\t\t\t\tselectionState.deselectImage();\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe('given a drive and an image', function () {\n\t\tconst image: SourceMetadata = {\n\t\t\tdescription: 'foo.img',\n\t\t\tdisplayName: 'foo.img',\n\t\t\tpath: 'foo.img',\n\t\t\textension: 'img',\n\t\t\tsize: 999999999,\n\t\t\tSourceType: 'File',\n\t\t\tisSizeEstimated: false,\n\t\t};\n\n\t\tbeforeEach(function () {\n\t\t\tavailableDrives.setDrives([\n\t\t\t\t{\n\t\t\t\t\tdevice: '/dev/disk1',\n\t\t\t\t\tname: 'USB Drive',\n\t\t\t\t\tsize: 999999999,\n\t\t\t\t\tisReadOnly: false,\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tselectionState.selectDrive('/dev/disk1');\n\n\t\t\tselectionState.selectSource(image);\n\t\t});\n\n\t\tdescribe('.clear()', function () {\n\t\t\tit('should clear all selections', function () {\n\t\t\t\texpect(selectionState.hasDrive()).to.be.true;\n\t\t\t\texpect(selectionState.hasImage()).to.be.true;\n\n\t\t\t\tselectionState.clear();\n\n\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\t\t\t\texpect(selectionState.hasImage()).to.be.false;\n\t\t\t});\n\t\t});\n\n\t\tdescribe('.deselectImage()', function () {\n\t\t\tbeforeEach(function () {\n\t\t\t\tselectionState.deselectImage();\n\t\t\t});\n\n\t\t\tit('getImagePath() should return undefined', function () {\n\t\t\t\tconst imagePath = selectionState.getImage()?.path;\n\t\t\t\texpect(imagePath).to.be.undefined;\n\t\t\t});\n\n\t\t\tit('getImageSize() should return undefined', function () {\n\t\t\t\tconst imageSize = selectionState.getImage()?.size;\n\t\t\t\texpect(imageSize).to.be.undefined;\n\t\t\t});\n\n\t\t\tit('should not clear any drives', function () {\n\t\t\t\texpect(selectionState.hasDrive()).to.be.true;\n\t\t\t});\n\n\t\t\tit('hasImage() should return false', function () {\n\t\t\t\tconst hasImage = selectionState.hasImage();\n\t\t\t\texpect(hasImage).to.be.false;\n\t\t\t});\n\t\t});\n\n\t\tdescribe('.deselectAllDrives()', function () {\n\t\t\tbeforeEach(function () {\n\t\t\t\tselectionState.deselectAllDrives();\n\t\t\t});\n\n\t\t\tit('getImagePath() should return the image path', function () {\n\t\t\t\tconst imagePath = selectionState.getImage()?.path;\n\t\t\t\texpect(imagePath).to.equal('foo.img');\n\t\t\t});\n\n\t\t\tit('getImageSize() should return the image size', function () {\n\t\t\t\tconst imageSize = selectionState.getImage()?.size;\n\t\t\t\texpect(imageSize).to.equal(999999999);\n\t\t\t});\n\n\t\t\tit('hasDrive() should return false', function () {\n\t\t\t\tconst hasDrive = selectionState.hasDrive();\n\t\t\t\texpect(hasDrive).to.be.false;\n\t\t\t});\n\n\t\t\tit('should not clear the image', function () {\n\t\t\t\texpect(selectionState.hasImage()).to.be.true;\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe('given several drives', function () {\n\t\tconst image: SourceMetadata = {\n\t\t\tdescription: 'foo.img',\n\t\t\tdisplayName: 'foo.img',\n\t\t\tpath: 'foo.img',\n\t\t\textension: 'img',\n\t\t\tsize: 999999999,\n\t\t\tSourceType: 'File',\n\t\t\tisSizeEstimated: false,\n\t\t};\n\n\t\tbeforeEach(function () {\n\t\t\tavailableDrives.setDrives([\n\t\t\t\t{\n\t\t\t\t\tdevice: '/dev/disk1',\n\t\t\t\t\tname: 'USB Drive 1',\n\t\t\t\t\tsize: 999999999,\n\t\t\t\t\tisReadOnly: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdevice: '/dev/disk2',\n\t\t\t\t\tname: 'USB Drive 2',\n\t\t\t\t\tsize: 999999999,\n\t\t\t\t\tisReadOnly: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdevice: '/dev/disk3',\n\t\t\t\t\tname: 'USB Drive 3',\n\t\t\t\t\tsize: 999999999,\n\t\t\t\t\tisReadOnly: false,\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tselectionState.selectDrive('/dev/disk1');\n\t\t\tselectionState.selectDrive('/dev/disk2');\n\t\t\tselectionState.selectDrive('/dev/disk3');\n\n\t\t\tselectionState.selectSource(image);\n\t\t});\n\n\t\tdescribe('.clear()', function () {\n\t\t\tit('should clear all selections', function () {\n\t\t\t\texpect(selectionState.hasDrive()).to.be.true;\n\t\t\t\texpect(selectionState.hasImage()).to.be.true;\n\n\t\t\t\tselectionState.clear();\n\n\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\t\t\t\texpect(selectionState.hasImage()).to.be.false;\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe('.toggleDrive()', function () {\n\t\tdescribe('given a selected drive', function () {\n\t\t\tbeforeEach(function () {\n\t\t\t\tthis.drive = {\n\t\t\t\t\tdevice: '/dev/sdb',\n\t\t\t\t\tdescription: 'DataTraveler 2.0',\n\t\t\t\t\tsize: 999999999,\n\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: '/media/UNTITLED',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tname: '/dev/sdb',\n\t\t\t\t\tisSystem: false,\n\t\t\t\t\tisReadOnly: false,\n\t\t\t\t};\n\n\t\t\t\tavailableDrives.setDrives([\n\t\t\t\t\tthis.drive,\n\t\t\t\t\t{\n\t\t\t\t\t\tdevice: '/dev/disk2',\n\t\t\t\t\t\tname: 'USB Drive 2',\n\t\t\t\t\t\tsize: 999999999,\n\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t},\n\t\t\t\t]);\n\n\t\t\t\tselectionState.selectDrive(this.drive.device);\n\t\t\t});\n\n\t\t\tafterEach(function () {\n\t\t\t\tselectionState.clear();\n\t\t\t\tavailableDrives.setDrives([]);\n\t\t\t});\n\n\t\t\tit('should be able to remove the drive', function () {\n\t\t\t\texpect(selectionState.hasDrive()).to.be.true;\n\t\t\t\tselectionState.toggleDrive(this.drive.device);\n\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\t\t\t});\n\n\t\t\tit('should not replace a different drive', function () {\n\t\t\t\tconst drive = {\n\t\t\t\t\tdevice: '/dev/disk2',\n\t\t\t\t\tname: 'USB Drive',\n\t\t\t\t\tsize: 999999999,\n\t\t\t\t\tisReadOnly: false,\n\t\t\t\t};\n\n\t\t\t\texpect(selectionState.getSelectedDevices()[0]).to.deep.equal(\n\t\t\t\t\tthis.drive.device,\n\t\t\t\t);\n\t\t\t\tselectionState.toggleDrive(drive.device);\n\t\t\t\texpect(selectionState.getSelectedDevices()[0]).to.deep.equal(\n\t\t\t\t\tthis.drive.device,\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('given no selected drive', function () {\n\t\t\tbeforeEach(function () {\n\t\t\t\tselectionState.clear();\n\n\t\t\t\tavailableDrives.setDrives([\n\t\t\t\t\t{\n\t\t\t\t\t\tdevice: '/dev/disk2',\n\t\t\t\t\t\tname: 'USB Drive 2',\n\t\t\t\t\t\tsize: 999999999,\n\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdevice: '/dev/disk3',\n\t\t\t\t\t\tname: 'USB Drive 3',\n\t\t\t\t\t\tsize: 999999999,\n\t\t\t\t\t\tisReadOnly: false,\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t});\n\n\t\t\tafterEach(function () {\n\t\t\t\tavailableDrives.setDrives([]);\n\t\t\t});\n\n\t\t\tit('should set the drive', function () {\n\t\t\t\tconst drive = {\n\t\t\t\t\tdevice: '/dev/disk2',\n\t\t\t\t\tname: 'USB Drive 2',\n\t\t\t\t\tsize: 999999999,\n\t\t\t\t\tisReadOnly: false,\n\t\t\t\t};\n\n\t\t\t\texpect(selectionState.hasDrive()).to.be.false;\n\t\t\t\tselectionState.toggleDrive(drive.device);\n\t\t\t\texpect(selectionState.getSelectedDevices()[0]).to.equal('/dev/disk2');\n\t\t\t});\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "tests/gui/models/settings.spec.ts",
    "content": "/*\n * Copyright 2017 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { expect } from 'chai';\nimport { stub } from 'sinon';\n\nimport * as settings from '../../../lib/gui/app/models/settings';\n\nasync function checkError(promise: Promise<any>, fn: (err: Error) => any) {\n\ttry {\n\t\tawait promise;\n\t} catch (error: any) {\n\t\tawait fn(error);\n\t\treturn;\n\t}\n\tthrow new Error('Expected error was not thrown');\n}\n\ndescribe('Browser: settings', () => {\n\tit('should be able to set and read values', async () => {\n\t\texpect(await settings.get('foo')).to.be.undefined;\n\t\tawait settings.set('foo', true);\n\t\texpect(await settings.get('foo')).to.be.true;\n\t\tawait settings.set('foo', false);\n\t\texpect(await settings.get('foo')).to.be.false;\n\t});\n\n\tdescribe('.set()', () => {\n\t\tit('should not change the application state if storing to the local machine results in an error', async () => {\n\t\t\tawait settings.set('foo', 'bar');\n\t\t\texpect(await settings.get('foo')).to.equal('bar');\n\n\t\t\tconst writeConfigFileStub = stub();\n\t\t\twriteConfigFileStub.returns(Promise.reject(new Error('settings error')));\n\n\t\t\tconst promise = settings.set('foo', 'baz', writeConfigFileStub);\n\t\t\tawait checkError(promise, async (error) => {\n\t\t\t\texpect(error).to.be.an.instanceof(Error);\n\t\t\t\texpect(error.message).to.equal('settings error');\n\t\t\t\texpect(await settings.get('foo')).to.equal('bar');\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe('.set()', () => {\n\t\tit('should set an unknown key', async () => {\n\t\t\texpect(await settings.get('foobar')).to.be.undefined;\n\t\t\tawait settings.set('foobar', true);\n\t\t\texpect(await settings.get('foobar')).to.be.true;\n\t\t});\n\n\t\tit('should set the key to undefined if no value', async () => {\n\t\t\tawait settings.set('foo', 'bar');\n\t\t\texpect(await settings.get('foo')).to.equal('bar');\n\t\t\tawait settings.set('foo', undefined);\n\t\t\texpect(await settings.get('foo')).to.be.undefined;\n\t\t});\n\n\t\tit('should store the setting to the local machine', async () => {\n\t\t\tconst data = await settings.readAll();\n\t\t\texpect(data.foo).to.be.undefined;\n\t\t\tawait settings.set('foo', 'bar');\n\t\t\tconst data1 = await settings.readAll();\n\t\t\texpect(data1.foo).to.equal('bar');\n\t\t});\n\n\t\tit('should not change the application state if storing to the local machine results in an error', async () => {\n\t\t\tawait settings.set('foo', 'bar');\n\t\t\texpect(await settings.get('foo')).to.equal('bar');\n\n\t\t\tconst writeConfigFileStub = stub();\n\t\t\twriteConfigFileStub.returns(Promise.reject(new Error('settings error')));\n\n\t\t\tawait checkError(\n\t\t\t\tsettings.set('foo', 'baz', writeConfigFileStub),\n\t\t\t\tasync (error) => {\n\t\t\t\t\texpect(error).to.be.an.instanceof(Error);\n\t\t\t\t\texpect(error.message).to.equal('settings error');\n\t\t\t\t\texpect(await settings.get('foo')).to.equal('bar');\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "tests/gui/modules/image-writer.spec.ts",
    "content": "/*\n *\n * TODO:\n * This test should be replaced by an E2E test.\n *\n */\n\n/*\n * Copyright 2020 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { expect } from 'chai';\nimport type { Drive as DrivelistDrive } from 'drivelist';\nimport type { SinonStub } from 'sinon';\nimport { assert, stub } from 'sinon';\n\nimport type { SourceMetadata } from '../../../lib/shared/typings/source-selector';\nimport * as flashState from '../../../lib/gui/app/models/flash-state';\nimport * as imageWriter from '../../../lib/gui/app/modules/image-writer';\n\n// @ts-ignore\nconst fakeDrive: DrivelistDrive = {};\n\ndescribe('Browser: imageWriter', () => {\n\tdescribe('.flash()', () => {\n\t\tconst image: SourceMetadata = {\n\t\t\thasMBR: false,\n\t\t\tpartitions: [],\n\t\t\tdescription: 'foo.img',\n\t\t\tdisplayName: 'foo.img',\n\t\t\tpath: 'foo.img',\n\t\t\tSourceType: 'File',\n\t\t\textension: 'img',\n\t\t};\n\n\t\tdescribe('given a successful write', () => {\n\t\t\tlet performWriteStub: SinonStub;\n\n\t\t\tbeforeEach(() => {\n\t\t\t\tperformWriteStub = stub();\n\t\t\t\tperformWriteStub.returns(\n\t\t\t\t\tPromise.resolve({\n\t\t\t\t\t\tcancelled: false,\n\t\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tafterEach(() => {\n\t\t\t\tperformWriteStub.reset();\n\t\t\t});\n\n\t\t\tit('should set flashing to false when done', async () => {\n\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\tcancelled: false,\n\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t});\n\n\t\t\t\ttry {\n\t\t\t\t\tawait imageWriter.flash(image, [fakeDrive], performWriteStub);\n\t\t\t\t} catch {\n\t\t\t\t\t// noop\n\t\t\t\t} finally {\n\t\t\t\t\texpect(flashState.isFlashing()).to.be.false;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit('should prevent writing more than once', async () => {\n\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\tcancelled: false,\n\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t});\n\n\t\t\t\ttry {\n\t\t\t\t\tawait Promise.all([\n\t\t\t\t\t\timageWriter.flash(image, [fakeDrive], performWriteStub),\n\t\t\t\t\t\timageWriter.flash(image, [fakeDrive], performWriteStub),\n\t\t\t\t\t]);\n\t\t\t\t\tassert.fail('Writing twice should fail');\n\t\t\t\t} catch (error: any) {\n\t\t\t\t\texpect(error.message).to.equal(\n\t\t\t\t\t\t'There is already a flash in progress',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tdescribe('given an unsuccessful write', () => {\n\t\t\tlet performWriteStub: SinonStub;\n\n\t\t\tbeforeEach(() => {\n\t\t\t\tperformWriteStub = stub();\n\t\t\t\tconst error: Error & { code?: string } = new Error('write error');\n\t\t\t\terror.code = 'FOO';\n\t\t\t\tperformWriteStub.returns(Promise.reject(error));\n\t\t\t});\n\n\t\t\tafterEach(() => {\n\t\t\t\tperformWriteStub.reset();\n\t\t\t});\n\n\t\t\tit('should set flashing to false when done', async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait imageWriter.flash(image, [fakeDrive], performWriteStub);\n\t\t\t\t} catch {\n\t\t\t\t\t// noop\n\t\t\t\t} finally {\n\t\t\t\t\texpect(flashState.isFlashing()).to.be.false;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit('should set the error code in the flash results', async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait imageWriter.flash(image, [fakeDrive], performWriteStub);\n\t\t\t\t} catch {\n\t\t\t\t\t// noop\n\t\t\t\t} finally {\n\t\t\t\t\tconst flashResults = flashState.getFlashResults();\n\t\t\t\t\texpect(flashResults.errorCode).to.equal('FOO');\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit('should be rejected with the error', async () => {\n\t\t\t\tflashState.unsetFlashingFlag({\n\t\t\t\t\tcancelled: false,\n\t\t\t\t\tsourceChecksum: '1234',\n\t\t\t\t});\n\t\t\t\ttry {\n\t\t\t\t\tawait imageWriter.flash(image, [fakeDrive], performWriteStub);\n\t\t\t\t} catch (error: any) {\n\t\t\t\t\texpect(error).to.be.an.instanceof(Error);\n\t\t\t\t\texpect(error.message).to.equal('write error');\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "tests/gui/modules/progress-status.spec.ts",
    "content": "/*\n * Copyright 2020 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { expect } from 'chai';\nimport * as i18next from 'i18next';\nimport en_translation from '../../../lib/gui/app/i18n/en';\n\nimport * as progressStatus from '../../../lib/gui/app/modules/progress-status';\n\ndescribe('Browser: progressStatus', function () {\n\tdescribe('.titleFromFlashState()', function () {\n\t\tbeforeEach(async function () {\n\t\t\tthis.state = {\n\t\t\t\tactive: 1,\n\t\t\t\ttype: 'flashing',\n\t\t\t\tfailed: 0,\n\t\t\t\tpercentage: 0,\n\t\t\t\teta: 15,\n\t\t\t\tspeed: 100000000000000,\n\t\t\t};\n\n\t\t\tawait i18next.init({\n\t\t\t\tlng: 'en', // Set the default language\n\t\t\t\tresources: {\n\t\t\t\t\ten: en_translation,\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\n\t\tit('should report 0% if percentage == 0 but speed != 0', function () {\n\t\t\texpect(progressStatus.titleFromFlashState(this.state)).to.equal(\n\t\t\t\t'0% Flashing...',\n\t\t\t);\n\t\t});\n\n\t\tit('should handle percentage == 0, flashing', function () {\n\t\t\tthis.state.speed = 0;\n\t\t\texpect(progressStatus.titleFromFlashState(this.state)).to.equal(\n\t\t\t\t'0% Flashing...',\n\t\t\t);\n\t\t});\n\n\t\tit('should handle percentage == 0, verifying', function () {\n\t\t\tthis.state.speed = 0;\n\t\t\tthis.state.type = 'verifying';\n\t\t\texpect(progressStatus.titleFromFlashState(this.state)).to.equal(\n\t\t\t\t'0% Validating...',\n\t\t\t);\n\t\t});\n\n\t\tit('should handle percentage == 50, flashing', function () {\n\t\t\tthis.state.percentage = 50;\n\t\t\texpect(progressStatus.titleFromFlashState(this.state)).to.equal(\n\t\t\t\t'50% Flashing...',\n\t\t\t);\n\t\t});\n\n\t\tit('should handle percentage == 50, verifying', function () {\n\t\t\tthis.state.percentage = 50;\n\t\t\tthis.state.type = 'verifying';\n\t\t\texpect(progressStatus.titleFromFlashState(this.state)).to.equal(\n\t\t\t\t'50% Validating...',\n\t\t\t);\n\t\t});\n\n\t\tit('should handle percentage == 100, flashing', function () {\n\t\t\tthis.state.percentage = 100;\n\t\t\texpect(progressStatus.titleFromFlashState(this.state)).to.equal(\n\t\t\t\t'Finishing...',\n\t\t\t);\n\t\t});\n\n\t\tit('should handle percentage == 100, verifying', function () {\n\t\t\tthis.state.percentage = 100;\n\t\t\tthis.state.type = 'verifying';\n\t\t\texpect(progressStatus.titleFromFlashState(this.state)).to.equal(\n\t\t\t\t'Finishing...',\n\t\t\t);\n\t\t});\n\n\t\tit('should handle percentage == 100, validating', function () {\n\t\t\tthis.state.percentage = 100;\n\t\t\texpect(progressStatus.titleFromFlashState(this.state)).to.equal(\n\t\t\t\t'Finishing...',\n\t\t\t);\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "tests/gui/os/window-progress.spec.ts",
    "content": "/*\n *\n * TODO:\n * This test should be replaced by an E2E test.\n *\n */\n\n/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { expect } from 'chai';\nimport { assert, spy } from 'sinon';\n\nimport * as windowProgress from '../../../lib/gui/app/os/window-progress';\n\ndescribe('Browser: WindowProgress', function () {\n\tdescribe('windowProgress', function () {\n\t\tdescribe('given a stubbed current window', function () {\n\t\t\tbeforeEach(function () {\n\t\t\t\tthis.setProgressBarSpy = spy();\n\t\t\t\tthis.setTitleSpy = spy();\n\n\t\t\t\twindowProgress.currentWindow.setProgressBar = this.setProgressBarSpy;\n\t\t\t\twindowProgress.currentWindow.setTitle = this.setTitleSpy;\n\n\t\t\t\tthis.state = {\n\t\t\t\t\tactive: 1,\n\t\t\t\t\ttype: 'flashing',\n\t\t\t\t\tfailed: 0,\n\t\t\t\t\tpercentage: 85,\n\t\t\t\t\tspeed: 100,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tdescribe('.set()', function () {\n\t\t\t\tit('should translate 0-100 percentages to 0-1 ranges', function () {\n\t\t\t\t\twindowProgress.set(this.state);\n\t\t\t\t\tassert.calledWith(this.setProgressBarSpy, 0.85);\n\t\t\t\t});\n\n\t\t\t\tit('should set 0 given 0', function () {\n\t\t\t\t\tthis.state.percentage = 0;\n\t\t\t\t\twindowProgress.set(this.state);\n\t\t\t\t\tassert.calledWith(this.setProgressBarSpy, 0);\n\t\t\t\t});\n\n\t\t\t\tit('should set 1 given 100', function () {\n\t\t\t\t\tthis.state.percentage = 100;\n\t\t\t\t\twindowProgress.set(this.state);\n\t\t\t\t\tassert.calledWith(this.setProgressBarSpy, 1);\n\t\t\t\t});\n\n\t\t\t\tit('should throw if given a percentage higher than 100', function () {\n\t\t\t\t\tthis.state.percentage = 101;\n\t\t\t\t\tconst state = this.state;\n\t\t\t\t\texpect(function () {\n\t\t\t\t\t\twindowProgress.set(state);\n\t\t\t\t\t}).to.throw('Invalid percentage: 101');\n\t\t\t\t});\n\n\t\t\t\tit('should throw if given a percentage less than 0', function () {\n\t\t\t\t\tthis.state.percentage = -1;\n\t\t\t\t\tconst state = this.state;\n\t\t\t\t\texpect(function () {\n\t\t\t\t\t\twindowProgress.set(state);\n\t\t\t\t\t}).to.throw('Invalid percentage: -1');\n\t\t\t\t});\n\n\t\t\t\tit('should set the flashing title', function () {\n\t\t\t\t\twindowProgress.set(this.state);\n\t\t\t\t\tassert.calledWith(this.setTitleSpy, ' – 85% Flashing...');\n\t\t\t\t});\n\n\t\t\t\tit('should set the verifying title', function () {\n\t\t\t\t\tthis.state.type = 'verifying';\n\t\t\t\t\twindowProgress.set(this.state);\n\t\t\t\t\tassert.calledWith(this.setTitleSpy, ' – 85% Validating...');\n\t\t\t\t});\n\n\t\t\t\tit('should set the starting title', function () {\n\t\t\t\t\tthis.state.percentage = 0;\n\t\t\t\t\tthis.state.speed = 0;\n\t\t\t\t\twindowProgress.set(this.state);\n\t\t\t\t\tassert.calledWith(this.setTitleSpy, ' – 0% Flashing...');\n\t\t\t\t});\n\n\t\t\t\tit('should set the finishing title', function () {\n\t\t\t\t\tthis.state.percentage = 100;\n\t\t\t\t\twindowProgress.set(this.state);\n\t\t\t\t\tassert.calledWith(this.setTitleSpy, ' – Finishing...');\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe('.clear()', function () {\n\t\t\t\tit('should set -1', function () {\n\t\t\t\t\twindowProgress.clear();\n\t\t\t\t\tassert.calledWith(this.setProgressBarSpy, -1);\n\t\t\t\t});\n\n\t\t\t\tit('should clear the window title', function () {\n\t\t\t\t\twindowProgress.clear();\n\t\t\t\t\tassert.calledWith(this.setTitleSpy, '');\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "tests/gui/os/windows-network-drives.spec.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { expect } from 'chai';\nimport { promises as fs } from 'fs';\nimport * as os from 'os';\nimport type { SinonStub } from 'sinon';\nimport { stub } from 'sinon';\n\nimport * as wnd from '../../../lib/gui/app/os/windows-network-drives';\n\nfunction mockGetWmicOutput() {\n\treturn fs.readFile('tests/data/wmic-output.txt', {\n\t\tencoding: 'ucs2',\n\t});\n}\n\ndescribe('Network drives on Windows', () => {\n\tlet osPlatformStub: SinonStub;\n\n\tbefore(async () => {\n\t\tosPlatformStub = stub(os, 'platform');\n\t\tosPlatformStub.returns('win32');\n\t});\n\n\tit('should parse network drive mapping on Windows', async () => {\n\t\texpect(\n\t\t\tawait wnd.replaceWindowsNetworkDriveLetter(\n\t\t\t\t'Z:\\\\some-folder\\\\some-file',\n\t\t\t\tmockGetWmicOutput,\n\t\t\t),\n\t\t).to.equal('\\\\\\\\192.168.1.1\\\\Publicé\\\\some-folder\\\\some-file');\n\t});\n\n\tafter(() => {\n\t\tosPlatformStub.restore();\n\t});\n});\n"
  },
  {
    "path": "tests/gui/utils/middle-ellipsis.spec.ts",
    "content": "/*\n * Copyright 2018 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { expect } from 'chai';\n\nimport { middleEllipsis } from '../../../lib/gui/app/utils/middle-ellipsis';\n\ndescribe('Browser: MiddleEllipsis', function () {\n\tdescribe('.middleEllipsis()', function () {\n\t\tit('should throw error if limit < 3', function () {\n\t\t\texpect(() => {\n\t\t\t\tmiddleEllipsis('No', 2);\n\t\t\t}).to.throw('middleEllipsis: Limit should be at least 3');\n\t\t});\n\n\t\tdescribe('given the input length is greater than the limit', function () {\n\t\t\tit('should always truncate input to an odd length', function () {\n\t\t\t\tconst alphabet = 'abcdefghijklmnopqrstuvwxyz';\n\t\t\t\texpect(middleEllipsis(alphabet, 3)).to.have.lengthOf(3);\n\t\t\t\texpect(middleEllipsis(alphabet, 4)).to.have.lengthOf(3);\n\t\t\t\texpect(middleEllipsis(alphabet, 5)).to.have.lengthOf(5);\n\t\t\t\texpect(middleEllipsis(alphabet, 6)).to.have.lengthOf(5);\n\t\t\t});\n\t\t});\n\n\t\tit('should return the input if it is within the bounds of limit', function () {\n\t\t\texpect(middleEllipsis('Hello', 10)).to.equal('Hello');\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "tests/gui/window-config.json",
    "content": "{\n  \"webPreferences\": {\n    \"enableRemoteModule\": true\n  }\n}\n"
  },
  {
    "path": "tests/shared/drive-constraints.spec.ts",
    "content": "/*\n * Copyright 2017 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { expect } from 'chai';\nimport * as path from 'path';\nimport type { SourceMetadata } from '../../lib/shared/typings/source-selector';\n\nimport * as constraints from '../../lib/shared/drive-constraints';\nimport * as messages from '../../lib/shared/messages';\n\ndescribe('Shared: DriveConstraints', function () {\n\tdescribe('.isSystemDrive()', function () {\n\t\tit('should return true if the drive is a system drive', function () {\n\t\t\tconst result = constraints.isSystemDrive({\n\t\t\t\tdevice: '/dev/disk2',\n\t\t\t\tsize: 999999999,\n\t\t\t\tisReadOnly: true,\n\t\t\t\tisSystem: true,\n\t\t\t} as constraints.DrivelistDrive);\n\n\t\t\texpect(result).to.be.true;\n\t\t});\n\n\t\tit('should default to `false` if the `system` property is `undefined`', function () {\n\t\t\tconst result = constraints.isSystemDrive({\n\t\t\t\tdevice: '/dev/disk2',\n\t\t\t\tsize: 999999999,\n\t\t\t\tisReadOnly: true,\n\t\t\t} as constraints.DrivelistDrive);\n\n\t\t\texpect(result).to.be.false;\n\t\t});\n\n\t\tit('should return false if the drive is a removable drive', function () {\n\t\t\tconst result = constraints.isSystemDrive({\n\t\t\t\tdevice: '/dev/disk2',\n\t\t\t\tsize: 999999999,\n\t\t\t\tisReadOnly: true,\n\t\t\t\tisSystem: false,\n\t\t\t} as constraints.DrivelistDrive);\n\n\t\t\texpect(result).to.be.false;\n\t\t});\n\t});\n\n\tdescribe('.isSourceDrive()', function () {\n\t\tit('should return false if no image', function () {\n\t\t\tconst result = constraints.isSourceDrive(\n\t\t\t\t{\n\t\t\t\t\tdevice: '/dev/disk2',\n\t\t\t\t\tsize: 999999999,\n\t\t\t\t\tisReadOnly: true,\n\t\t\t\t\tisSystem: false,\n\t\t\t\t} as constraints.DrivelistDrive,\n\t\t\t\t// @ts-ignore\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\texpect(result).to.be.false;\n\t\t});\n\n\t\tit('should return false if there are no mount points', function () {\n\t\t\tconst result = constraints.isSourceDrive(\n\t\t\t\t{\n\t\t\t\t\tdevice: '/dev/disk2',\n\t\t\t\t\tsize: 999999999,\n\t\t\t\t\tisReadOnly: true,\n\t\t\t\t\tisSystem: false,\n\t\t\t\t} as constraints.DrivelistDrive,\n\t\t\t\t{\n\t\t\t\t\tdescription: 'image.img',\n\t\t\t\t\tdisplayName: 'image.img',\n\t\t\t\t\tpath: '/Volumes/Untitled/image.img',\n\t\t\t\t\thasMBR: false,\n\t\t\t\t\tpartitions: [],\n\t\t\t\t\tSourceType: 'File',\n\t\t\t\t},\n\t\t\t);\n\n\t\t\texpect(result).to.be.false;\n\t\t});\n\n\t\tdescribe('given Windows paths', function () {\n\t\t\tconst windowsImage: SourceMetadata = {\n\t\t\t\tdescription: 'image.img',\n\t\t\t\tdisplayName: 'image.img',\n\t\t\t\tpath: 'E:\\\\image.img',\n\t\t\t\thasMBR: false,\n\t\t\t\tpartitions: [],\n\t\t\t\tSourceType: 'File',\n\t\t\t};\n\t\t\tbeforeEach(function () {\n\t\t\t\tthis.separator = path.sep;\n\t\t\t\t// @ts-ignore\n\t\t\t\tpath.sep = '\\\\';\n\t\t\t});\n\n\t\t\tafterEach(function () {\n\t\t\t\t// @ts-ignore\n\t\t\t\tpath.sep = this.separator;\n\t\t\t});\n\n\t\t\tit('should return true if the image lives directly inside a mount point of the drive', function () {\n\t\t\t\tconst result = constraints.isSourceDrive(\n\t\t\t\t\t{\n\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: 'label',\n\t\t\t\t\t\t\t\tpath: 'E:',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: 'label',\n\t\t\t\t\t\t\t\tpath: 'F:',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t} as constraints.DrivelistDrive,\n\t\t\t\t\twindowsImage,\n\t\t\t\t);\n\n\t\t\t\texpect(result).to.be.true;\n\t\t\t});\n\n\t\t\tit('should return true if the image lives inside a mount point of the drive', function () {\n\t\t\t\tconst result = constraints.isSourceDrive(\n\t\t\t\t\t{\n\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: 'label',\n\t\t\t\t\t\t\t\tpath: 'E:',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: 'label',\n\t\t\t\t\t\t\t\tpath: 'F:',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t} as constraints.DrivelistDrive,\n\t\t\t\t\t{\n\t\t\t\t\t\t...windowsImage,\n\t\t\t\t\t\tpath: 'E:\\\\foo\\\\bar\\\\image.img',\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\texpect(result).to.be.true;\n\t\t\t});\n\n\t\t\tit('should return false if the image does not live inside a mount point of the drive', function () {\n\t\t\t\tconst result = constraints.isSourceDrive(\n\t\t\t\t\t{\n\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: 'label',\n\t\t\t\t\t\t\t\tpath: 'E:',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: 'label',\n\t\t\t\t\t\t\t\tpath: 'F:',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t} as constraints.DrivelistDrive,\n\t\t\t\t\t{\n\t\t\t\t\t\t...windowsImage,\n\t\t\t\t\t\tpath: 'G:\\\\image.img',\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\texpect(result).to.be.false;\n\t\t\t});\n\n\t\t\tit('should return false if the image is in a mount point that is a substring of the image mount point', function () {\n\t\t\t\tconst result = constraints.isSourceDrive(\n\t\t\t\t\t{\n\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: 'label',\n\t\t\t\t\t\t\t\tpath: 'E:\\\\fo',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t} as constraints.DrivelistDrive,\n\t\t\t\t\t{\n\t\t\t\t\t\t...windowsImage,\n\t\t\t\t\t\tpath: 'E:\\\\foo/image.img',\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\texpect(result).to.be.false;\n\t\t\t});\n\t\t});\n\n\t\tdescribe('given UNIX paths', function () {\n\t\t\tconst image: SourceMetadata = {\n\t\t\t\tdescription: 'image.img',\n\t\t\t\tdisplayName: 'image.img',\n\t\t\t\tpath: '/Volumes/Untitled/image.img',\n\t\t\t\thasMBR: false,\n\t\t\t\tpartitions: [],\n\t\t\t\tSourceType: 'File',\n\t\t\t};\n\t\t\tbeforeEach(function () {\n\t\t\t\tthis.separator = path.sep;\n\t\t\t\t// @ts-ignore\n\t\t\t\tpath.sep = '/';\n\t\t\t});\n\n\t\t\tafterEach(function () {\n\t\t\t\t// @ts-ignore\n\t\t\t\tpath.sep = this.separator;\n\t\t\t});\n\n\t\t\tit('should return true if the mount point is / and the image lives directly inside it', function () {\n\t\t\t\tconst result = constraints.isSourceDrive(\n\t\t\t\t\t{\n\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpath: '/',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t} as constraints.DrivelistDrive,\n\t\t\t\t\t{\n\t\t\t\t\t\t...image,\n\t\t\t\t\t\tpath: '/image.img',\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\texpect(result).to.be.true;\n\t\t\t});\n\n\t\t\tit('should return true if the image lives directly inside a mount point of the drive', function () {\n\t\t\t\tconst result = constraints.isSourceDrive(\n\t\t\t\t\t{\n\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpath: '/Volumes/A',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpath: '/Volumes/B',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t} as constraints.DrivelistDrive,\n\t\t\t\t\t{\n\t\t\t\t\t\t...image,\n\t\t\t\t\t\tpath: '/Volumes/A/image.img',\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\texpect(result).to.be.true;\n\t\t\t});\n\n\t\t\tit('should return true if the image lives inside a mount point of the drive', function () {\n\t\t\t\tconst result = constraints.isSourceDrive(\n\t\t\t\t\t{\n\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpath: '/Volumes/A',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpath: '/Volumes/B',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t} as constraints.DrivelistDrive,\n\t\t\t\t\t{\n\t\t\t\t\t\t...image,\n\t\t\t\t\t\tpath: '/Volumes/A/foo/bar/image.img',\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\texpect(result).to.be.true;\n\t\t\t});\n\n\t\t\tit('should return false if the image does not live inside a mount point of the drive', function () {\n\t\t\t\tconst result = constraints.isSourceDrive(\n\t\t\t\t\t{\n\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpath: '/Volumes/A',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpath: '/Volumes/B',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t} as constraints.DrivelistDrive,\n\t\t\t\t\t{\n\t\t\t\t\t\t...image,\n\t\t\t\t\t\tpath: '/Volumes/C/image.img',\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\texpect(result).to.be.false;\n\t\t\t});\n\n\t\t\tit('should return false if the image is in a mount point that is a substring of the image mount point', function () {\n\t\t\t\tconst result = constraints.isSourceDrive(\n\t\t\t\t\t{\n\t\t\t\t\t\tmountpoints: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpath: '/Volumes/fo',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t} as constraints.DrivelistDrive,\n\t\t\t\t\t{\n\t\t\t\t\t\t...image,\n\t\t\t\t\t\tpath: '/Volumes/foo/image.img',\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\texpect(result).to.be.false;\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe('.isDriveLargeEnough()', function () {\n\t\tbeforeEach(function () {\n\t\t\tthis.drive = {\n\t\t\t\tdevice: '/dev/disk1',\n\t\t\t\tsize: 1000000000,\n\t\t\t\tisReadOnly: false,\n\t\t\t};\n\t\t});\n\n\t\tdescribe('given the final image size estimation flag is false', function () {\n\t\t\tdescribe('given the original size is less than the drive size', function () {\n\t\t\t\tbeforeEach(function () {\n\t\t\t\t\tthis.image = {\n\t\t\t\t\t\tpath: path.join(__dirname, 'rpi.img'),\n\t\t\t\t\t\tsize: this.drive.size - 1,\n\t\t\t\t\t\tisSizeEstimated: false,\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\tit('should return true if the final size is less than the drive size', function () {\n\t\t\t\t\texpect(constraints.isDriveLargeEnough(this.drive, this.image)).to.be\n\t\t\t\t\t\t.true;\n\t\t\t\t});\n\n\t\t\t\tit('should return true if the final size is equal to the drive size', function () {\n\t\t\t\t\tthis.image.size = this.drive.size;\n\t\t\t\t\texpect(constraints.isDriveLargeEnough(this.drive, this.image)).to.be\n\t\t\t\t\t\t.true;\n\t\t\t\t});\n\n\t\t\t\tit('should return false if the final size is greater than the drive size', function () {\n\t\t\t\t\tthis.image.size = this.drive.size + 1;\n\t\t\t\t\texpect(constraints.isDriveLargeEnough(this.drive, this.image)).to.be\n\t\t\t\t\t\t.false;\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe('given the original size is equal to the drive size', function () {\n\t\t\t\tbeforeEach(function () {\n\t\t\t\t\tthis.image = {\n\t\t\t\t\t\tpath: path.join(__dirname, 'rpi.img'),\n\t\t\t\t\t\tsize: this.drive.size,\n\t\t\t\t\t\tisSizeEstimated: false,\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\tit('should return true if the final size is less than the drive size', function () {\n\t\t\t\t\tthis.image.size = this.drive.size - 1;\n\t\t\t\t\texpect(constraints.isDriveLargeEnough(this.drive, this.image)).to.be\n\t\t\t\t\t\t.true;\n\t\t\t\t});\n\n\t\t\t\tit('should return true if the final size is equal to the drive size', function () {\n\t\t\t\t\texpect(constraints.isDriveLargeEnough(this.drive, this.image)).to.be\n\t\t\t\t\t\t.true;\n\t\t\t\t});\n\n\t\t\t\tit('should return false if the final size is greater than the drive size', function () {\n\t\t\t\t\tthis.image.size = this.drive.size + 1;\n\t\t\t\t\texpect(constraints.isDriveLargeEnough(this.drive, this.image)).to.be\n\t\t\t\t\t\t.false;\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe('given the original size is greater than the drive size', function () {\n\t\t\t\tbeforeEach(function () {\n\t\t\t\t\tthis.image = {\n\t\t\t\t\t\tpath: path.join(__dirname, 'rpi.img'),\n\t\t\t\t\t\tsize: this.drive.size + 1,\n\t\t\t\t\t\tisSizeEstimated: false,\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\tit('should return true if the final size is less than the drive size', function () {\n\t\t\t\t\tthis.image.size = this.drive.size - 1;\n\t\t\t\t\texpect(constraints.isDriveLargeEnough(this.drive, this.image)).to.be\n\t\t\t\t\t\t.true;\n\t\t\t\t});\n\n\t\t\t\tit('should return true if the final size is equal to the drive size', function () {\n\t\t\t\t\tthis.image.size = this.drive.size;\n\t\t\t\t\texpect(constraints.isDriveLargeEnough(this.drive, this.image)).to.be\n\t\t\t\t\t\t.true;\n\t\t\t\t});\n\n\t\t\t\tit('should return false if the final size is greater than the drive size', function () {\n\t\t\t\t\texpect(constraints.isDriveLargeEnough(this.drive, this.image)).to.be\n\t\t\t\t\t\t.false;\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\tdescribe('given the final image size estimation flag is true', function () {\n\t\t\tdescribe('given the original size is less than the drive size', function () {\n\t\t\t\tbeforeEach(function () {\n\t\t\t\t\tthis.image = {\n\t\t\t\t\t\tpath: path.join(__dirname, 'rpi.img'),\n\t\t\t\t\t\tsize: this.drive.size - 1,\n\t\t\t\t\t\tcompressedSize: this.drive.size - 1,\n\t\t\t\t\t\tisSizeEstimated: true,\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\tit('should return true if the final size is less than the drive size', function () {\n\t\t\t\t\texpect(constraints.isDriveLargeEnough(this.drive, this.image)).to.be\n\t\t\t\t\t\t.true;\n\t\t\t\t});\n\n\t\t\t\tit('should return true if the final size is equal to the drive size', function () {\n\t\t\t\t\tthis.image.size = this.drive.size;\n\t\t\t\t\texpect(constraints.isDriveLargeEnough(this.drive, this.image)).to.be\n\t\t\t\t\t\t.true;\n\t\t\t\t});\n\n\t\t\t\tit('should return true if the final size is greater than the drive size', function () {\n\t\t\t\t\tthis.image.size = this.drive.size + 1;\n\t\t\t\t\texpect(constraints.isDriveLargeEnough(this.drive, this.image)).to.be\n\t\t\t\t\t\t.true;\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe('given the original size is equal to the drive size', function () {\n\t\t\t\tbeforeEach(function () {\n\t\t\t\t\tthis.image = {\n\t\t\t\t\t\tpath: path.join(__dirname, 'rpi.img'),\n\t\t\t\t\t\tsize: this.drive.size,\n\t\t\t\t\t\tcompressedSize: this.drive.size,\n\t\t\t\t\t\tisSizeEstimated: true,\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\tit('should return true if the final size is less than the drive size', function () {\n\t\t\t\t\tthis.image.size = this.drive.size - 1;\n\t\t\t\t\texpect(constraints.isDriveLargeEnough(this.drive, this.image)).to.be\n\t\t\t\t\t\t.true;\n\t\t\t\t});\n\n\t\t\t\tit('should return true if the final size is equal to the drive size', function () {\n\t\t\t\t\texpect(constraints.isDriveLargeEnough(this.drive, this.image)).to.be\n\t\t\t\t\t\t.true;\n\t\t\t\t});\n\n\t\t\t\tit('should return true if the final size is greater than the drive size', function () {\n\t\t\t\t\tthis.image.size = this.drive.size + 1;\n\t\t\t\t\texpect(constraints.isDriveLargeEnough(this.drive, this.image)).to.be\n\t\t\t\t\t\t.true;\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe('given the original size is greater than the drive size', function () {\n\t\t\t\tbeforeEach(function () {\n\t\t\t\t\tthis.image = {\n\t\t\t\t\t\tpath: path.join(__dirname, 'rpi.img'),\n\t\t\t\t\t\tsize: this.drive.size + 1,\n\t\t\t\t\t\tcompressedSize: this.drive.size + 1,\n\t\t\t\t\t\tisSizeEstimated: true,\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\tit('should return false if the final size is less than the drive size', function () {\n\t\t\t\t\tthis.image.size = this.drive.size - 1;\n\t\t\t\t\texpect(constraints.isDriveLargeEnough(this.drive, this.image)).to.be\n\t\t\t\t\t\t.false;\n\t\t\t\t});\n\n\t\t\t\tit('should return false if the final size is equal to the drive size', function () {\n\t\t\t\t\tthis.image.size = this.drive.size;\n\t\t\t\t\texpect(constraints.isDriveLargeEnough(this.drive, this.image)).to.be\n\t\t\t\t\t\t.false;\n\t\t\t\t});\n\n\t\t\t\tit('should return false if the final size is greater than the drive size', function () {\n\t\t\t\t\texpect(constraints.isDriveLargeEnough(this.drive, this.image)).to.be\n\t\t\t\t\t\t.false;\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\tit('should return true if the image is undefined', function () {\n\t\t\tconst result = constraints.isDriveLargeEnough(\n\t\t\t\t{\n\t\t\t\t\tdevice: '/dev/disk1',\n\t\t\t\t\tsize: 1000000000,\n\t\t\t\t\tisReadOnly: false,\n\t\t\t\t} as constraints.DrivelistDrive,\n\t\t\t\t// @ts-ignore\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\texpect(result).to.be.true;\n\t\t});\n\t});\n\n\tdescribe('.isDriveSizeRecommended()', function () {\n\t\tconst image: SourceMetadata = {\n\t\t\tdescription: 'rpi.img',\n\t\t\tdisplayName: 'rpi.img',\n\t\t\tpath: path.join(__dirname, 'rpi.img'),\n\t\t\tsize: 1000000000,\n\t\t\tisSizeEstimated: false,\n\t\t\trecommendedDriveSize: 2000000000,\n\t\t\tSourceType: 'File',\n\t\t};\n\t\tit('should return true if the drive size is greater than the recommended size ', function () {\n\t\t\tconst result = constraints.isDriveSizeRecommended(\n\t\t\t\t{\n\t\t\t\t\tdevice: '/dev/disk1',\n\t\t\t\t\tsize: 2000000001,\n\t\t\t\t\tisReadOnly: false,\n\t\t\t\t} as constraints.DrivelistDrive,\n\t\t\t\timage,\n\t\t\t);\n\n\t\t\texpect(result).to.be.true;\n\t\t});\n\n\t\tit('should return true if the drive size is equal to recommended size', function () {\n\t\t\tconst result = constraints.isDriveSizeRecommended(\n\t\t\t\t{\n\t\t\t\t\tdevice: '/dev/disk1',\n\t\t\t\t\tsize: 2000000000,\n\t\t\t\t\tisReadOnly: false,\n\t\t\t\t} as constraints.DrivelistDrive,\n\t\t\t\timage,\n\t\t\t);\n\n\t\t\texpect(result).to.be.true;\n\t\t});\n\n\t\tit('should return false if the drive size is less than the recommended size', function () {\n\t\t\tconst result = constraints.isDriveSizeRecommended(\n\t\t\t\t{\n\t\t\t\t\tdevice: '/dev/disk1',\n\t\t\t\t\tsize: 2000000000,\n\t\t\t\t\tisReadOnly: false,\n\t\t\t\t} as constraints.DrivelistDrive,\n\t\t\t\t{\n\t\t\t\t\t...image,\n\t\t\t\t\trecommendedDriveSize: 2000000001,\n\t\t\t\t},\n\t\t\t);\n\n\t\t\texpect(result).to.be.false;\n\t\t});\n\n\t\tit('should return true if the recommended drive size is undefined', function () {\n\t\t\tconst result = constraints.isDriveSizeRecommended(\n\t\t\t\t{\n\t\t\t\t\tdevice: '/dev/disk1',\n\t\t\t\t\tsize: 2000000000,\n\t\t\t\t\tisReadOnly: false,\n\t\t\t\t} as constraints.DrivelistDrive,\n\t\t\t\t{\n\t\t\t\t\t...image,\n\t\t\t\t\trecommendedDriveSize: undefined,\n\t\t\t\t},\n\t\t\t);\n\n\t\t\texpect(result).to.be.true;\n\t\t});\n\n\t\tit('should return true if the image is undefined', function () {\n\t\t\tconst result = constraints.isDriveSizeRecommended(\n\t\t\t\t{\n\t\t\t\t\tdevice: '/dev/disk1',\n\t\t\t\t\tsize: 2000000000,\n\t\t\t\t\tisReadOnly: false,\n\t\t\t\t} as constraints.DrivelistDrive,\n\t\t\t\t// @ts-ignore\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\texpect(result).to.be.true;\n\t\t});\n\t});\n\n\tdescribe('.isDriveValid()', function () {\n\t\tbeforeEach(function () {\n\t\t\tif (process.platform === 'win32') {\n\t\t\t\tthis.mountpoint = 'E:\\\\foo';\n\t\t\t} else {\n\t\t\t\tthis.mountpoint = '/mnt/foo';\n\t\t\t}\n\n\t\t\tthis.drive = {\n\t\t\t\tdevice: '/dev/disk2',\n\t\t\t\tmountpoints: [\n\t\t\t\t\t{\n\t\t\t\t\t\tpath: this.mountpoint,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tsize: 4000000000,\n\t\t\t};\n\t\t});\n\n\t\tdescribe('given the drive is locked', function () {\n\t\t\tbeforeEach(function () {\n\t\t\t\tthis.drive.isReadOnly = true;\n\t\t\t});\n\n\t\t\tdescribe('given the drive is disabled', function () {\n\t\t\t\tconst image: SourceMetadata = {\n\t\t\t\t\tdescription: 'rpi.img',\n\t\t\t\t\tdisplayName: 'rpi.img',\n\t\t\t\t\tpath: '',\n\t\t\t\t\tSourceType: 'File',\n\t\t\t\t\tsize: 2000000000,\n\t\t\t\t\tisSizeEstimated: false,\n\t\t\t\t};\n\t\t\t\tbeforeEach(function () {\n\t\t\t\t\tthis.drive.disabled = true;\n\t\t\t\t});\n\n\t\t\t\tit('should return false if the drive is not large enough and is a source drive', function () {\n\t\t\t\t\texpect(\n\t\t\t\t\t\tconstraints.isDriveValid(this.drive, {\n\t\t\t\t\t\t\t...image,\n\t\t\t\t\t\t\tpath: path.join(this.mountpoint, 'rpi.img'),\n\t\t\t\t\t\t\tsize: 5000000000,\n\t\t\t\t\t\t}),\n\t\t\t\t\t).to.be.false;\n\t\t\t\t});\n\n\t\t\t\tit('should return false if the drive is not large enough and is not a source drive', function () {\n\t\t\t\t\texpect(\n\t\t\t\t\t\tconstraints.isDriveValid(this.drive, {\n\t\t\t\t\t\t\t...image,\n\t\t\t\t\t\t\tpath: path.resolve(this.mountpoint, '../bar/rpi.img'),\n\t\t\t\t\t\t}),\n\t\t\t\t\t).to.be.false;\n\t\t\t\t});\n\n\t\t\t\tit('should return false if the drive is large enough and is a source drive', function () {\n\t\t\t\t\texpect(constraints.isDriveValid(this.drive, image)).to.be.false;\n\t\t\t\t});\n\n\t\t\t\tit('should return false if the drive is large enough and is not a source drive', function () {\n\t\t\t\t\texpect(\n\t\t\t\t\t\tconstraints.isDriveValid(this.drive, {\n\t\t\t\t\t\t\t...image,\n\t\t\t\t\t\t\tpath: path.resolve(this.mountpoint, '../bar/rpi.img'),\n\t\t\t\t\t\t}),\n\t\t\t\t\t).to.be.false;\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe('given the drive is not disabled', function () {\n\t\t\t\tconst image: SourceMetadata = {\n\t\t\t\t\tdescription: 'rpi.img',\n\t\t\t\t\tdisplayName: 'rpi.img',\n\t\t\t\t\tpath: '',\n\t\t\t\t\tSourceType: 'File',\n\t\t\t\t\tsize: 2000000000,\n\t\t\t\t\tisSizeEstimated: false,\n\t\t\t\t};\n\t\t\t\tbeforeEach(function () {\n\t\t\t\t\tthis.drive.disabled = false;\n\t\t\t\t});\n\n\t\t\t\tit('should return false if the drive is not large enough and is the source drive', function () {\n\t\t\t\t\texpect(\n\t\t\t\t\t\tconstraints.isDriveValid(this.drive, {\n\t\t\t\t\t\t\t...image,\n\t\t\t\t\t\t\tpath: path.join(this.mountpoint, 'rpi.img'),\n\t\t\t\t\t\t\tsize: 5000000000,\n\t\t\t\t\t\t}),\n\t\t\t\t\t).to.be.false;\n\t\t\t\t});\n\n\t\t\t\tit('should return false if the drive is not large enough and is not the source drive', function () {\n\t\t\t\t\texpect(\n\t\t\t\t\t\tconstraints.isDriveValid(this.drive, {\n\t\t\t\t\t\t\t...image,\n\t\t\t\t\t\t\tpath: path.resolve(this.mountpoint, '../bar/rpi.img'),\n\t\t\t\t\t\t\tsize: 5000000000,\n\t\t\t\t\t\t}),\n\t\t\t\t\t).to.be.false;\n\t\t\t\t});\n\n\t\t\t\tit('should return true if the drive is large enough and is the source drive', function () {\n\t\t\t\t\texpect(constraints.isDriveValid(this.drive, image)).to.be.true;\n\t\t\t\t});\n\n\t\t\t\tit('should return true if the drive is large enough and is not the source drive', function () {\n\t\t\t\t\texpect(\n\t\t\t\t\t\tconstraints.isDriveValid(this.drive, {\n\t\t\t\t\t\t\t...image,\n\t\t\t\t\t\t\tpath: path.resolve(this.mountpoint, '../bar/rpi.img'),\n\t\t\t\t\t\t}),\n\t\t\t\t\t).to.be.true;\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\tdescribe('given the drive is not locked', function () {\n\t\t\tconst image: SourceMetadata = {\n\t\t\t\tdescription: 'rpi.img',\n\t\t\t\tdisplayName: 'rpi.img',\n\t\t\t\tpath: '',\n\t\t\t\tSourceType: 'File',\n\t\t\t\tsize: 2000000000,\n\t\t\t\tisSizeEstimated: false,\n\t\t\t};\n\t\t\tbeforeEach(function () {\n\t\t\t\tthis.drive.isReadOnly = false;\n\t\t\t});\n\n\t\t\tdescribe('given the drive is disabled', function () {\n\t\t\t\tbeforeEach(function () {\n\t\t\t\t\tthis.drive.disabled = true;\n\t\t\t\t});\n\n\t\t\t\tit('should return false if the drive is not large enough and is a source drive', function () {\n\t\t\t\t\texpect(\n\t\t\t\t\t\tconstraints.isDriveValid(this.drive, {\n\t\t\t\t\t\t\t...image,\n\t\t\t\t\t\t\tpath: path.join(this.mountpoint, 'rpi.img'),\n\t\t\t\t\t\t\tsize: 5000000000,\n\t\t\t\t\t\t}),\n\t\t\t\t\t).to.be.false;\n\t\t\t\t});\n\n\t\t\t\tit('should return false if the drive is not large enough and is not a source drive', function () {\n\t\t\t\t\texpect(\n\t\t\t\t\t\tconstraints.isDriveValid(this.drive, {\n\t\t\t\t\t\t\t...image,\n\t\t\t\t\t\t\tpath: path.resolve(this.mountpoint, '../bar/rpi.img'),\n\t\t\t\t\t\t\tsize: 5000000000,\n\t\t\t\t\t\t}),\n\t\t\t\t\t).to.be.false;\n\t\t\t\t});\n\n\t\t\t\tit('should return false if the drive is large enough and is a source drive', function () {\n\t\t\t\t\texpect(constraints.isDriveValid(this.drive, image)).to.be.false;\n\t\t\t\t});\n\n\t\t\t\tit('should return false if the drive is large enough and is not a source drive', function () {\n\t\t\t\t\texpect(\n\t\t\t\t\t\tconstraints.isDriveValid(this.drive, {\n\t\t\t\t\t\t\t...image,\n\t\t\t\t\t\t\tpath: path.resolve(this.mountpoint, '../bar/rpi.img'),\n\t\t\t\t\t\t}),\n\t\t\t\t\t).to.be.false;\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe('given the drive is not disabled', function () {\n\t\t\t\tbeforeEach(function () {\n\t\t\t\t\tthis.drive.disabled = false;\n\t\t\t\t});\n\n\t\t\t\tit('should return false if the drive is not large enough and is a source drive', function () {\n\t\t\t\t\texpect(\n\t\t\t\t\t\tconstraints.isDriveValid(this.drive, {\n\t\t\t\t\t\t\t...image,\n\t\t\t\t\t\t\tpath: path.join(this.mountpoint, 'rpi.img'),\n\t\t\t\t\t\t\tsize: 5000000000,\n\t\t\t\t\t\t}),\n\t\t\t\t\t).to.be.false;\n\t\t\t\t});\n\n\t\t\t\tit('should return false if the drive is not large enough and is not a source drive', function () {\n\t\t\t\t\texpect(\n\t\t\t\t\t\tconstraints.isDriveValid(this.drive, {\n\t\t\t\t\t\t\t...image,\n\t\t\t\t\t\t\tpath: path.resolve(this.mountpoint, '../bar/rpi.img'),\n\t\t\t\t\t\t\tsize: 5000000000,\n\t\t\t\t\t\t}),\n\t\t\t\t\t).to.be.false;\n\t\t\t\t});\n\n\t\t\t\tit('should return false if the drive is large enough and is a source drive', function () {\n\t\t\t\t\texpect(\n\t\t\t\t\t\tconstraints.isDriveValid(this.drive, {\n\t\t\t\t\t\t\t...image,\n\t\t\t\t\t\t\tpath: path.join(this.mountpoint, 'rpi.img'),\n\t\t\t\t\t\t}),\n\t\t\t\t\t).to.be.false;\n\t\t\t\t});\n\n\t\t\t\tit('should return true if the drive is large enough and is not a source drive', function () {\n\t\t\t\t\texpect(\n\t\t\t\t\t\tconstraints.isDriveValid(this.drive, {\n\t\t\t\t\t\t\t...image,\n\t\t\t\t\t\t\tpath: path.resolve(this.mountpoint, '../bar/rpi.img'),\n\t\t\t\t\t\t}),\n\t\t\t\t\t).to.be.true;\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe('.isDriveSizeLarge()', function () {\n\t\tbeforeEach(function () {\n\t\t\tthis.drive = {\n\t\t\t\tdevice: '/dev/disk2',\n\t\t\t\tisReadonly: false,\n\t\t\t\tisSystem: false,\n\t\t\t\tdisabled: false,\n\t\t\t\tmountpoints: [\n\t\t\t\t\t{\n\t\t\t\t\t\tpath: this.mountpoint,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tsize: constraints.LARGE_DRIVE_SIZE + 1,\n\t\t\t};\n\n\t\t\tthis.image = {\n\t\t\t\tSourceType: 'File',\n\t\t\t\tpath: path.join(__dirname, 'rpi.img'),\n\t\t\t\tsize: this.drive.size - 1,\n\t\t\t\tisSizeEstimated: false,\n\t\t\t};\n\t\t});\n\n\t\tdescribe('given a drive bigger than the unusually large drive size', function () {\n\t\t\tit('should return true', function () {\n\t\t\t\texpect(constraints.isDriveSizeLarge(this.drive)).to.be.true;\n\t\t\t});\n\t\t});\n\n\t\tdescribe('given a drive smaller than the unusually large drive size', function () {\n\t\t\tit('should return false', function () {\n\t\t\t\tthis.drive.size = constraints.LARGE_DRIVE_SIZE - 1;\n\t\t\t\texpect(constraints.isDriveSizeLarge(this.drive)).to.be.false;\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe('.getDriveImageCompatibilityStatuses', function () {\n\t\tbeforeEach(function () {\n\t\t\tif (process.platform === 'win32') {\n\t\t\t\tthis.mountpoint = 'E:';\n\t\t\t\tthis.separator = '\\\\';\n\t\t\t} else {\n\t\t\t\tthis.mountpoint = '/mnt/foo';\n\t\t\t\tthis.separator = '/';\n\t\t\t}\n\n\t\t\tthis.drive = {\n\t\t\t\tdevice: '/dev/disk2',\n\t\t\t\tisReadOnly: false,\n\t\t\t\tisSystem: false,\n\t\t\t\tdisabled: false,\n\t\t\t\tmountpoints: [\n\t\t\t\t\t{\n\t\t\t\t\t\tpath: this.mountpoint,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tsize: 4000000000,\n\t\t\t};\n\n\t\t\tthis.image = {\n\t\t\t\tSourceType: 'File',\n\t\t\t\tpath: path.join(__dirname, 'rpi.img'),\n\t\t\t\tsize: this.drive.size - 1,\n\t\t\t\tisSizeEstimated: false,\n\t\t\t};\n\t\t});\n\n\t\tconst compareTuplesMessages = (\n\t\t\ttuple1: { message: string },\n\t\t\ttuple2: { message: string },\n\t\t) => {\n\t\t\tif (tuple1.message.toLowerCase() === tuple2.message.toLowerCase()) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn tuple1.message.toLowerCase() > tuple2.message.toLowerCase()\n\t\t\t\t? 1\n\t\t\t\t: -1;\n\t\t};\n\n\t\tconst expectStatusTypesAndMessagesToBe = (\n\t\t\tresultList: Array<{ message: string }>,\n\t\t\texpectedTuples: Array<['WARNING' | 'ERROR', string]>,\n\t\t\tparams?: number,\n\t\t) => {\n\t\t\t// Sort so that order doesn't matter\n\t\t\tconst expectedTuplesSorted = expectedTuples\n\t\t\t\t.map((tuple) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: constraints.COMPATIBILITY_STATUS_TYPES[tuple[0]],\n\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\tmessage: messages.compatibility[tuple[1]](params),\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t\t\t.sort(compareTuplesMessages);\n\t\t\tconst resultTuplesSorted = resultList.sort(compareTuplesMessages);\n\n\t\t\texpect(resultTuplesSorted).to.deep.equal(expectedTuplesSorted);\n\t\t};\n\n\t\tdescribe('given there are no errors or warnings', () => {\n\t\t\tit('should return an empty list', function () {\n\t\t\t\tconst result = constraints.getDriveImageCompatibilityStatuses(\n\t\t\t\t\tthis.drive,\n\t\t\t\t\tthis.image,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\n\t\t\t\texpect(result).to.deep.equal([]);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('given the drive is disabled', () => {\n\t\t\tit('should return an empty list', function () {\n\t\t\t\tthis.drive.disabled = true;\n\t\t\t\tconst result = constraints.getDriveImageCompatibilityStatuses(\n\t\t\t\t\tthis.drive,\n\t\t\t\t\tthis.image,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\n\t\t\t\tconst expectedTuples: Array<['WARNING' | 'ERROR', string]> = [];\n\t\t\t\texpectStatusTypesAndMessagesToBe(result, expectedTuples);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('given the drive contains the image', () => {\n\t\t\tit('should return the contains-image error', function () {\n\t\t\t\tthis.image.path = path.join(this.mountpoint, 'rpi.img');\n\n\t\t\t\tconst result = constraints.getDriveImageCompatibilityStatuses(\n\t\t\t\t\tthis.drive,\n\t\t\t\t\tthis.image,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst expectedTuples = [['ERROR', 'containsImage']];\n\n\t\t\t\t// @ts-ignore\n\t\t\t\texpectStatusTypesAndMessagesToBe(result, expectedTuples);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('given the drive is a system drive', () => {\n\t\t\tit('should return the system drive warning', function () {\n\t\t\t\tthis.drive.isSystem = true;\n\n\t\t\t\tconst result = constraints.getDriveImageCompatibilityStatuses(\n\t\t\t\t\tthis.drive,\n\t\t\t\t\tthis.image,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t\tconst expectedTuples = [['WARNING', 'system']];\n\n\t\t\t\t// @ts-ignore\n\t\t\t\texpectStatusTypesAndMessagesToBe(result, expectedTuples);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('given the drive is too small', () => {\n\t\t\tit('should return the too small error', function () {\n\t\t\t\tthis.image.size = this.drive.size + 1;\n\n\t\t\t\tconst result = constraints.getDriveImageCompatibilityStatuses(\n\t\t\t\t\tthis.drive,\n\t\t\t\t\tthis.image,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t\tconst expected = [\n\t\t\t\t\t{\n\t\t\t\t\t\tmessage: messages.compatibility.tooSmall(),\n\t\t\t\t\t\ttype: constraints.COMPATIBILITY_STATUS_TYPES.ERROR,\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\texpect(result).to.deep.equal(expected);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('given the drive size is null', () => {\n\t\t\tit('should not return the too small error', function () {\n\t\t\t\tthis.image.size = this.drive.size + 1;\n\t\t\t\tthis.drive.size = null;\n\n\t\t\t\tconst result = constraints.getDriveImageCompatibilityStatuses(\n\t\t\t\t\tthis.drive,\n\t\t\t\t\tthis.image,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst expectedTuples = [];\n\n\t\t\t\t// @ts-ignore\n\t\t\t\texpectStatusTypesAndMessagesToBe(result, expectedTuples);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('given the drive is locked', () => {\n\t\t\tit('should return the locked drive error', function () {\n\t\t\t\tthis.drive.isReadOnly = true;\n\n\t\t\t\tconst result = constraints.getDriveImageCompatibilityStatuses(\n\t\t\t\t\tthis.drive,\n\t\t\t\t\tthis.image,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst expectedTuples = [['ERROR', 'locked']];\n\n\t\t\t\t// @ts-ignore\n\t\t\t\texpectStatusTypesAndMessagesToBe(result, expectedTuples);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('given the drive is smaller than the recommended size', () => {\n\t\t\tit('should return the smaller than recommended size warning', function () {\n\t\t\t\tthis.image.recommendedDriveSize = this.drive.size + 1;\n\n\t\t\t\tconst result = constraints.getDriveImageCompatibilityStatuses(\n\t\t\t\t\tthis.drive,\n\t\t\t\t\tthis.image,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst expectedTuples = [['WARNING', 'sizeNotRecommended']];\n\n\t\t\t\t// @ts-ignore\n\t\t\t\texpectStatusTypesAndMessagesToBe(result, expectedTuples);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('given the drive is unusually large', function () {\n\t\t\tit('should return the large drive size warning', function () {\n\t\t\t\tthis.drive.size = constraints.LARGE_DRIVE_SIZE + 1;\n\n\t\t\t\tconst result = constraints.getDriveImageCompatibilityStatuses(\n\t\t\t\t\tthis.drive,\n\t\t\t\t\tthis.image,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t\tconst expectedTuples = [['WARNING', 'largeDrive']];\n\n\t\t\t\texpectStatusTypesAndMessagesToBe(\n\t\t\t\t\tresult,\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\texpectedTuples,\n\t\t\t\t\tthis.drive.size,\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('given the drive contains the image and the drive is locked', () => {\n\t\t\tit('should return the locked error by precedence', function () {\n\t\t\t\tthis.drive.isReadOnly = true;\n\t\t\t\tthis.image.path = path.join(this.mountpoint, 'rpi.img');\n\n\t\t\t\tconst result = constraints.getDriveImageCompatibilityStatuses(\n\t\t\t\t\tthis.drive,\n\t\t\t\t\tthis.image,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst expectedTuples = [\n\t\t\t\t\t['ERROR', 'locked'],\n\t\t\t\t\t['ERROR', 'containsImage'],\n\t\t\t\t];\n\n\t\t\t\t// @ts-ignore\n\t\t\t\texpectStatusTypesAndMessagesToBe(result, expectedTuples);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('given a locked and too small drive', () => {\n\t\t\tit('should return the locked error by precedence', function () {\n\t\t\t\tthis.drive.isReadOnly = true;\n\n\t\t\t\tconst result = constraints.getDriveImageCompatibilityStatuses(\n\t\t\t\t\tthis.drive,\n\t\t\t\t\tthis.image,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst expectedTuples = [['ERROR', 'locked']];\n\n\t\t\t\t// @ts-ignore\n\t\t\t\texpectStatusTypesAndMessagesToBe(result, expectedTuples);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('given a too small and system drive', () => {\n\t\t\tit('should return the too small drive error by precedence', function () {\n\t\t\t\tthis.image.size = this.drive.size + 1;\n\t\t\t\tthis.drive.isSystem = true;\n\n\t\t\t\tconst result = constraints.getDriveImageCompatibilityStatuses(\n\t\t\t\t\tthis.drive,\n\t\t\t\t\tthis.image,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t\tconst expected = [\n\t\t\t\t\t{\n\t\t\t\t\t\tmessage: messages.compatibility.tooSmall(),\n\t\t\t\t\t\ttype: constraints.COMPATIBILITY_STATUS_TYPES.ERROR,\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\texpect(result).to.deep.equal(expected);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('given a system drive and not recommended drive size', () => {\n\t\t\tit('should return both warnings', function () {\n\t\t\t\tthis.drive.isSystem = true;\n\t\t\t\tthis.image.recommendedDriveSize = this.drive.size + 1;\n\n\t\t\t\tconst result = constraints.getDriveImageCompatibilityStatuses(\n\t\t\t\t\tthis.drive,\n\t\t\t\t\tthis.image,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst expectedTuples = [\n\t\t\t\t\t['WARNING', 'sizeNotRecommended'],\n\t\t\t\t\t['WARNING', 'system'],\n\t\t\t\t];\n\n\t\t\t\t// @ts-ignore\n\t\t\t\texpectStatusTypesAndMessagesToBe(result, expectedTuples);\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe('.getListDriveImageCompatibilityStatuses()', function () {\n\t\tconst drivePaths =\n\t\t\tprocess.platform === 'win32'\n\t\t\t\t? ['E:\\\\', 'F:\\\\', 'G:\\\\', 'H:\\\\', 'J:\\\\', 'K:\\\\']\n\t\t\t\t: [\n\t\t\t\t\t\t'/dev/disk1',\n\t\t\t\t\t\t'/dev/disk2',\n\t\t\t\t\t\t'/dev/disk3',\n\t\t\t\t\t\t'/dev/disk4',\n\t\t\t\t\t\t'/dev/disk5',\n\t\t\t\t\t\t'/dev/disk6',\n\t\t\t\t\t];\n\t\tconst drives = [\n\t\t\t{\n\t\t\t\tdevice: drivePaths[0],\n\t\t\t\tdescription: 'My Drive',\n\t\t\t\tsize: 123456789,\n\t\t\t\tdisplayName: drivePaths[0],\n\t\t\t\tmountpoints: [{ path: __dirname }],\n\t\t\t\tisSystem: false,\n\t\t\t\tisReadOnly: false,\n\t\t\t} as unknown as constraints.DrivelistDrive,\n\t\t\t{\n\t\t\t\tdevice: drivePaths[1],\n\t\t\t\tdescription: 'My Other Drive',\n\t\t\t\tsize: 123456789,\n\t\t\t\tdisplayName: drivePaths[1],\n\t\t\t\tmountpoints: [],\n\t\t\t\tisSystem: false,\n\t\t\t\tisReadOnly: true,\n\t\t\t} as unknown as constraints.DrivelistDrive,\n\t\t\t{\n\t\t\t\tdevice: drivePaths[2],\n\t\t\t\tdescription: 'My Drive',\n\t\t\t\tsize: 1234567,\n\t\t\t\tdisplayName: drivePaths[2],\n\t\t\t\tmountpoints: [],\n\t\t\t\tisSystem: false,\n\t\t\t\tisReadOnly: false,\n\t\t\t} as unknown as constraints.DrivelistDrive,\n\t\t\t{\n\t\t\t\tdevice: drivePaths[3],\n\t\t\t\tdescription: 'My Drive',\n\t\t\t\tsize: 123456789,\n\t\t\t\tdisplayName: drivePaths[3],\n\t\t\t\tmountpoints: [],\n\t\t\t\tisSystem: true,\n\t\t\t\tisReadOnly: false,\n\t\t\t} as unknown as constraints.DrivelistDrive,\n\t\t\t{\n\t\t\t\tdevice: drivePaths[4],\n\t\t\t\tdescription: 'My Drive',\n\t\t\t\tsize: 128000000001,\n\t\t\t\tdisplayName: drivePaths[4],\n\t\t\t\tmountpoints: [],\n\t\t\t\tisSystem: false,\n\t\t\t\tisReadOnly: false,\n\t\t\t} as unknown as constraints.DrivelistDrive,\n\t\t\t{\n\t\t\t\tdevice: drivePaths[5],\n\t\t\t\tdescription: 'My Drive',\n\t\t\t\tsize: 12345678,\n\t\t\t\tdisplayName: drivePaths[5],\n\t\t\t\tmountpoints: [],\n\t\t\t\tisSystem: false,\n\t\t\t\tisReadOnly: false,\n\t\t\t} as unknown as constraints.DrivelistDrive,\n\t\t\t{\n\t\t\t\tdevice: drivePaths[6],\n\t\t\t\tdescription: 'My Drive',\n\t\t\t\tsize: 123456789,\n\t\t\t\tdisplayName: drivePaths[6],\n\t\t\t\tmountpoints: [],\n\t\t\t\tisSystem: false,\n\t\t\t\tisReadOnly: false,\n\t\t\t} as unknown as constraints.DrivelistDrive,\n\t\t];\n\n\t\tconst image: SourceMetadata = {\n\t\t\tdescription: 'rpi.img',\n\t\t\tdisplayName: 'rpi.img',\n\t\t\tpath: path.join(__dirname, 'rpi.img'),\n\t\t\tSourceType: 'File',\n\t\t\t// @ts-ignore\n\t\t\tsize: drives[2].size + 1,\n\t\t\tisSizeEstimated: false,\n\t\t\t// @ts-ignore\n\t\t\trecommendedDriveSize: drives[5].size + 1,\n\t\t};\n\n\t\tdescribe('given no drives', function () {\n\t\t\tit('should return no statuses', function () {\n\t\t\t\texpect(\n\t\t\t\t\tconstraints.getListDriveImageCompatibilityStatuses([], image, true),\n\t\t\t\t).to.deep.equal([]);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('given one drive', function () {\n\t\t\tit('should return contains image error', function () {\n\t\t\t\texpect(\n\t\t\t\t\tconstraints.getListDriveImageCompatibilityStatuses(\n\t\t\t\t\t\t[drives[0]],\n\t\t\t\t\t\timage,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t),\n\t\t\t\t).to.deep.equal([\n\t\t\t\t\t{\n\t\t\t\t\t\tmessage: 'Source drive',\n\t\t\t\t\t\ttype: 2,\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t});\n\n\t\t\tit('should return locked error', function () {\n\t\t\t\texpect(\n\t\t\t\t\tconstraints.getListDriveImageCompatibilityStatuses(\n\t\t\t\t\t\t[drives[1]],\n\t\t\t\t\t\timage,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t),\n\t\t\t\t).to.deep.equal([\n\t\t\t\t\t{\n\t\t\t\t\t\tmessage: 'Locked',\n\t\t\t\t\t\ttype: 2,\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t});\n\n\t\t\tit('should return too small for image error', function () {\n\t\t\t\texpect(\n\t\t\t\t\tconstraints.getListDriveImageCompatibilityStatuses(\n\t\t\t\t\t\t[drives[2]],\n\t\t\t\t\t\timage,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t),\n\t\t\t\t).to.deep.equal([\n\t\t\t\t\t{\n\t\t\t\t\t\tmessage: 'Too small',\n\t\t\t\t\t\ttype: 2,\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t});\n\n\t\t\tit('should return system drive warning', function () {\n\t\t\t\texpect(\n\t\t\t\t\tconstraints.getListDriveImageCompatibilityStatuses(\n\t\t\t\t\t\t[drives[3]],\n\t\t\t\t\t\timage,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t),\n\t\t\t\t).to.deep.equal([\n\t\t\t\t\t{\n\t\t\t\t\t\tmessage: 'System drive',\n\t\t\t\t\t\ttype: 1,\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t});\n\n\t\t\tit('should return large drive warning', function () {\n\t\t\t\texpect(\n\t\t\t\t\tconstraints.getListDriveImageCompatibilityStatuses(\n\t\t\t\t\t\t[drives[4]],\n\t\t\t\t\t\timage,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t),\n\t\t\t\t).to.deep.equal([\n\t\t\t\t\t{\n\t\t\t\t\t\tmessage: 'Large drive',\n\t\t\t\t\t\ttype: 1,\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t});\n\n\t\t\tit('should return not recommended warning', function () {\n\t\t\t\texpect(\n\t\t\t\t\tconstraints.getListDriveImageCompatibilityStatuses(\n\t\t\t\t\t\t[drives[5]],\n\t\t\t\t\t\timage,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t),\n\t\t\t\t).to.deep.equal([\n\t\t\t\t\t{\n\t\t\t\t\t\tmessage: 'Not recommended',\n\t\t\t\t\t\ttype: 1,\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('given multiple drives with all warnings/errors', function () {\n\t\t\tit('should return all statuses', function () {\n\t\t\t\texpect(\n\t\t\t\t\tconstraints.getListDriveImageCompatibilityStatuses(\n\t\t\t\t\t\tdrives,\n\t\t\t\t\t\timage,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t),\n\t\t\t\t).to.deep.equal([\n\t\t\t\t\t{\n\t\t\t\t\t\tmessage: 'Source drive',\n\t\t\t\t\t\ttype: 2,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tmessage: 'Locked',\n\t\t\t\t\t\ttype: 2,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tmessage: 'Too small',\n\t\t\t\t\t\ttype: 2,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tmessage: 'System drive',\n\t\t\t\t\t\ttype: 1,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tmessage: 'Large drive',\n\t\t\t\t\t\ttype: 1,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tmessage: 'Not recommended',\n\t\t\t\t\t\ttype: 1,\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t});\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "tests/shared/errors.spec.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { expect } from 'chai';\nimport * as _ from 'lodash';\n\nimport * as errors from '../../lib/shared/errors';\n\ndescribe('Shared: Errors', function () {\n\tdescribe('.HUMAN_FRIENDLY', function () {\n\t\tit('should be a plain object', function () {\n\t\t\texpect(_.isPlainObject(errors.HUMAN_FRIENDLY)).to.be.true;\n\t\t});\n\n\t\tit('should contain title and description function properties', function () {\n\t\t\texpect(\n\t\t\t\t_.every(\n\t\t\t\t\t_.map(errors.HUMAN_FRIENDLY, (error) => {\n\t\t\t\t\t\treturn _.isFunction(error.title) && _.isFunction(error.description);\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t).to.be.true;\n\t\t});\n\t});\n\n\tdescribe('.getTitle()', function () {\n\t\tit('should return a generic error message if the error is an empty object', function () {\n\t\t\tconst error = {};\n\t\t\t// @ts-ignore\n\t\t\texpect(errors.getTitle(error)).to.equal('An error ocurred');\n\t\t});\n\n\t\tit('should return the error message', function () {\n\t\t\tconst error = new Error('This is an error');\n\t\t\texpect(errors.getTitle(error)).to.equal('This is an error');\n\t\t});\n\n\t\tit('should return the error code if there is no message', function () {\n\t\t\tconst error = new Error();\n\t\t\t// @ts-ignore\n\t\t\terror.code = 'MYERROR';\n\t\t\texpect(errors.getTitle(error)).to.equal('Error code: MYERROR');\n\t\t});\n\n\t\tit('should prioritize the message over the code', function () {\n\t\t\tconst error = new Error('Foo bar');\n\t\t\t// @ts-ignore\n\t\t\terror.code = 'MYERROR';\n\t\t\texpect(errors.getTitle(error)).to.equal('Foo bar');\n\t\t});\n\n\t\tit('should prioritize the code over the message if the message is an empty string', function () {\n\t\t\tconst error = new Error('');\n\t\t\t// @ts-ignore\n\t\t\terror.code = 'MYERROR';\n\t\t\texpect(errors.getTitle(error)).to.equal('Error code: MYERROR');\n\t\t});\n\n\t\tit('should prioritize the code over the message if the message is a blank string', function () {\n\t\t\tconst error = new Error('    ');\n\t\t\t// @ts-ignore\n\t\t\terror.code = 'MYERROR';\n\t\t\texpect(errors.getTitle(error)).to.equal('Error code: MYERROR');\n\t\t});\n\n\t\tit('should understand an error-like object with a code', function () {\n\t\t\tconst error = {\n\t\t\t\tcode: 'MYERROR',\n\t\t\t};\n\n\t\t\t// @ts-ignore\n\t\t\texpect(errors.getTitle(error)).to.equal('Error code: MYERROR');\n\t\t});\n\n\t\tit('should understand an error-like object with a message', function () {\n\t\t\tconst error = {\n\t\t\t\tmessage: 'Hello world',\n\t\t\t};\n\n\t\t\t// @ts-ignore\n\t\t\texpect(errors.getTitle(error)).to.equal('Hello world');\n\t\t});\n\n\t\tit('should understand an error-like object with a message and a code', function () {\n\t\t\tconst error = {\n\t\t\t\tmessage: 'Hello world',\n\t\t\t\tcode: 'MYERROR',\n\t\t\t};\n\n\t\t\t// @ts-ignore\n\t\t\texpect(errors.getTitle(error)).to.equal('Hello world');\n\t\t});\n\n\t\tit('should display an error code 0', function () {\n\t\t\tconst error = new Error();\n\t\t\t// @ts-ignore\n\t\t\terror.code = 0;\n\t\t\texpect(errors.getTitle(error)).to.equal('Error code: 0');\n\t\t});\n\n\t\tit('should display an error code 1', function () {\n\t\t\tconst error = new Error();\n\t\t\t// @ts-ignore\n\t\t\terror.code = 1;\n\t\t\texpect(errors.getTitle(error)).to.equal('Error code: 1');\n\t\t});\n\n\t\tit('should display an error code -1', function () {\n\t\t\tconst error = new Error();\n\t\t\t// @ts-ignore\n\t\t\terror.code = -1;\n\t\t\texpect(errors.getTitle(error)).to.equal('Error code: -1');\n\t\t});\n\n\t\tit('should not display an empty string error code', function () {\n\t\t\tconst error = new Error();\n\t\t\t// @ts-ignore\n\t\t\terror.code = '';\n\t\t\texpect(errors.getTitle(error)).to.equal('An error ocurred');\n\t\t});\n\n\t\tit('should not display a blank string error code', function () {\n\t\t\tconst error = new Error();\n\t\t\t// @ts-ignore\n\t\t\terror.code = '   ';\n\t\t\texpect(errors.getTitle(error)).to.equal('An error ocurred');\n\t\t});\n\n\t\tit('should return a generic error message if no information was found', function () {\n\t\t\tconst error = new Error();\n\t\t\texpect(errors.getTitle(error)).to.equal('An error ocurred');\n\t\t});\n\n\t\tit('should return a generic error message if no code and the message is empty', function () {\n\t\t\tconst error = new Error('');\n\t\t\texpect(errors.getTitle(error)).to.equal('An error ocurred');\n\t\t});\n\n\t\tit('should return a generic error message if no code and the message is blank', function () {\n\t\t\tconst error = new Error('   ');\n\t\t\texpect(errors.getTitle(error)).to.equal('An error ocurred');\n\t\t});\n\n\t\tit('should rephrase an ENOENT error', function () {\n\t\t\tconst error = new Error('ENOENT error');\n\t\t\t// @ts-ignore\n\t\t\terror.path = '/foo/bar';\n\t\t\t// @ts-ignore\n\t\t\terror.code = 'ENOENT';\n\t\t\texpect(errors.getTitle(error)).to.equal(\n\t\t\t\t'No such file or directory: /foo/bar',\n\t\t\t);\n\t\t});\n\n\t\tit('should rephrase an EPERM error', function () {\n\t\t\tconst error = new Error('EPERM error');\n\t\t\t// @ts-ignore\n\t\t\terror.code = 'EPERM';\n\t\t\texpect(errors.getTitle(error)).to.equal(\n\t\t\t\t\"You're not authorized to perform this operation\",\n\t\t\t);\n\t\t});\n\n\t\tit('should rephrase an EACCES error', function () {\n\t\t\tconst error = new Error('EACCES error');\n\t\t\t// @ts-ignore\n\t\t\terror.code = 'EACCES';\n\t\t\texpect(errors.getTitle(error)).to.equal(\n\t\t\t\t\"You don't have access to this resource\",\n\t\t\t);\n\t\t});\n\n\t\tit('should rephrase an ENOMEM error', function () {\n\t\t\tconst error = new Error('ENOMEM error');\n\t\t\t// @ts-ignore\n\t\t\terror.code = 'ENOMEM';\n\t\t\texpect(errors.getTitle(error)).to.equal('Your system ran out of memory');\n\t\t});\n\t});\n\n\tdescribe('.getDescription()', function () {\n\t\tit('should understand an error-like object with a description', function () {\n\t\t\tconst error = {\n\t\t\t\tdescription: 'My description',\n\t\t\t};\n\n\t\t\t// @ts-ignore\n\t\t\texpect(errors.getDescription(error)).to.equal('My description');\n\t\t});\n\n\t\tit('should understand an error-like object with a stack', function () {\n\t\t\tconst error = {\n\t\t\t\tstack: 'My stack',\n\t\t\t};\n\n\t\t\t// @ts-ignore\n\t\t\texpect(errors.getDescription(error)).to.equal('My stack');\n\t\t});\n\n\t\tit('should understand an error-like object with a description and a stack', function () {\n\t\t\tconst error = {\n\t\t\t\tdescription: 'My description',\n\t\t\t\tstack: 'My stack',\n\t\t\t};\n\n\t\t\t// @ts-ignore\n\t\t\texpect(errors.getDescription(error)).to.equal('My description');\n\t\t});\n\n\t\tit('should stringify and beautify an object without any known property', function () {\n\t\t\tconst error = {\n\t\t\t\tname: 'John Doe',\n\t\t\t\tjob: 'Developer',\n\t\t\t};\n\n\t\t\t// @ts-ignore\n\t\t\texpect(errors.getDescription(error)).to.equal(\n\t\t\t\t['{', '  \"name\": \"John Doe\",', '  \"job\": \"Developer\"', '}'].join('\\n'),\n\t\t\t);\n\t\t});\n\n\t\tit('should return the stack for a basic error', function () {\n\t\t\tconst error = new Error('Foo');\n\t\t\texpect(errors.getDescription(error)).to.equal(error.stack);\n\t\t});\n\n\t\tit('should prefer a description property to a stack', function () {\n\t\t\tconst error = new Error('Foo');\n\t\t\t// @ts-ignore\n\t\t\terror.description = 'My description';\n\t\t\texpect(errors.getDescription(error)).to.equal('My description');\n\t\t});\n\n\t\tit('should return the stack if the description is an empty string', function () {\n\t\t\tconst error = new Error('Foo');\n\t\t\t// @ts-ignore\n\t\t\terror.description = '';\n\t\t\texpect(errors.getDescription(error)).to.equal(error.stack);\n\t\t});\n\n\t\tit('should return the stack if the description is a blank string', function () {\n\t\t\tconst error = new Error('Foo');\n\t\t\t// @ts-ignore\n\t\t\terror.description = '   ';\n\t\t\texpect(errors.getDescription(error)).to.equal(error.stack);\n\t\t});\n\n\t\tit('should get a generic description for ENOENT', function () {\n\t\t\tconst error = new Error('Foo');\n\t\t\t// @ts-ignore\n\t\t\terror.code = 'ENOENT';\n\t\t\texpect(errors.getDescription(error)).to.equal(\n\t\t\t\t\"The file you're trying to access doesn't exist\",\n\t\t\t);\n\t\t});\n\n\t\tit('should get a generic description for EPERM', function () {\n\t\t\tconst error = new Error('Foo');\n\t\t\t// @ts-ignore\n\t\t\terror.code = 'EPERM';\n\t\t\texpect(errors.getDescription(error)).to.equal(\n\t\t\t\t'Please ensure you have necessary permissions for this task',\n\t\t\t);\n\t\t});\n\n\t\tit('should get a generic description for EACCES', function () {\n\t\t\tconst error = new Error('Foo');\n\t\t\t// @ts-ignore\n\t\t\terror.code = 'EACCES';\n\t\t\tconst message =\n\t\t\t\t'Please ensure you have necessary permissions to access this resource';\n\t\t\texpect(errors.getDescription(error)).to.equal(message);\n\t\t});\n\n\t\tit('should get a generic description for ENOMEM', function () {\n\t\t\tconst error = new Error('Foo');\n\t\t\t// @ts-ignore\n\t\t\terror.code = 'ENOMEM';\n\t\t\tconst message =\n\t\t\t\t'Please make sure your system has enough available memory for this task';\n\t\t\texpect(errors.getDescription(error)).to.equal(message);\n\t\t});\n\n\t\tit('should prefer a description property than a code description', function () {\n\t\t\tconst error = new Error('Foo');\n\t\t\t// @ts-ignore\n\t\t\terror.code = 'ENOMEM';\n\t\t\t// @ts-ignore\n\t\t\terror.description = 'Memory error';\n\t\t\texpect(errors.getDescription(error)).to.equal('Memory error');\n\t\t});\n\n\t\tdescribe('given userFriendlyDescriptionsOnly is false', function () {\n\t\t\tit('should return the stack for a basic error', function () {\n\t\t\t\tconst error = new Error('Foo');\n\t\t\t\texpect(errors.getDescription(error)).to.equal(error.stack);\n\t\t\t});\n\n\t\t\tit('should return the stack if the description is an empty string', function () {\n\t\t\t\tconst error = new Error('Foo');\n\t\t\t\t// @ts-ignore\n\t\t\t\terror.description = '';\n\t\t\t\texpect(errors.getDescription(error)).to.equal(error.stack);\n\t\t\t});\n\n\t\t\tit('should return the stack if the description is a blank string', function () {\n\t\t\t\tconst error = new Error('Foo');\n\t\t\t\t// @ts-ignore\n\t\t\t\terror.description = '   ';\n\t\t\t\texpect(errors.getDescription(error)).to.equal(error.stack);\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe('.createError()', function () {\n\t\tit('should be an instance of Error', function () {\n\t\t\tconst error = errors.createError({\n\t\t\t\ttitle: 'Foo',\n\t\t\t\tdescription: 'Something happened',\n\t\t\t});\n\n\t\t\texpect(error).to.be.an.instanceof(Error);\n\t\t});\n\n\t\tit('should correctly add both a title and a description', function () {\n\t\t\tconst error = errors.createError({\n\t\t\t\ttitle: 'Foo',\n\t\t\t\tdescription: 'Something happened',\n\t\t\t});\n\n\t\t\texpect(errors.getTitle(error)).to.equal('Foo');\n\t\t\texpect(errors.getDescription(error)).to.equal('Something happened');\n\t\t});\n\n\t\tit('should correctly add a code', function () {\n\t\t\tconst error = errors.createError({\n\t\t\t\ttitle: 'Foo',\n\t\t\t\tdescription: 'Something happened',\n\t\t\t\tcode: 'ENOENT',\n\t\t\t});\n\n\t\t\texpect(error.code).to.equal('ENOENT');\n\t\t});\n\n\t\tit('should correctly add only a title', function () {\n\t\t\tconst error = errors.createError({\n\t\t\t\ttitle: 'Foo',\n\t\t\t});\n\n\t\t\texpect(errors.getTitle(error)).to.equal('Foo');\n\t\t\texpect(errors.getDescription(error)).to.equal(error.stack);\n\t\t});\n\n\t\tit('should ignore an empty description', function () {\n\t\t\tconst error = errors.createError({\n\t\t\t\ttitle: 'Foo',\n\t\t\t\tdescription: '',\n\t\t\t});\n\n\t\t\texpect(errors.getDescription(error)).to.equal(error.stack);\n\t\t});\n\n\t\tit('should ignore a blank description', function () {\n\t\t\tconst error = errors.createError({\n\t\t\t\ttitle: 'Foo',\n\t\t\t\tdescription: '     ',\n\t\t\t});\n\n\t\t\texpect(errors.getDescription(error)).to.equal(error.stack);\n\t\t});\n\n\t\tit('should throw if no title', function () {\n\t\t\texpect(() => {\n\t\t\t\t// @ts-ignore\n\t\t\t\terrors.createError({});\n\t\t\t}).to.throw('Invalid error title: undefined');\n\t\t});\n\n\t\tit('should throw if there is a description but no title', function () {\n\t\t\texpect(() => {\n\t\t\t\t// @ts-ignore\n\t\t\t\terrors.createError({\n\t\t\t\t\tdescription: 'foo',\n\t\t\t\t});\n\t\t\t}).to.throw('Invalid error title: undefined');\n\t\t});\n\n\t\tit('should throw if title is empty', function () {\n\t\t\texpect(() => {\n\t\t\t\terrors.createError({\n\t\t\t\t\ttitle: '',\n\t\t\t\t});\n\t\t\t}).to.throw('Invalid error title: ');\n\t\t});\n\n\t\tit('should throw if title is blank', function () {\n\t\t\texpect(() => {\n\t\t\t\terrors.createError({\n\t\t\t\t\ttitle: '    ',\n\t\t\t\t});\n\t\t\t}).to.throw('Invalid error title:    ');\n\t\t});\n\t});\n\n\tdescribe('.createUserError()', function () {\n\t\tit('should be an instance of Error', function () {\n\t\t\tconst error = errors.createUserError({\n\t\t\t\ttitle: 'Foo',\n\t\t\t\tdescription: 'Something happened',\n\t\t\t});\n\n\t\t\texpect(error).to.be.an.instanceof(Error);\n\t\t});\n\n\t\tit('should correctly add both a title and a description', function () {\n\t\t\tconst error = errors.createUserError({\n\t\t\t\ttitle: 'Foo',\n\t\t\t\tdescription: 'Something happened',\n\t\t\t});\n\n\t\t\texpect(errors.getTitle(error)).to.equal('Foo');\n\t\t\texpect(errors.getDescription(error)).to.equal('Something happened');\n\t\t});\n\n\t\tit('should correctly add only a title', function () {\n\t\t\t// @ts-ignore\n\t\t\tconst error = errors.createUserError({\n\t\t\t\ttitle: 'Foo',\n\t\t\t});\n\n\t\t\texpect(errors.getTitle(error)).to.equal('Foo');\n\t\t\texpect(errors.getDescription(error)).to.equal(error.stack);\n\t\t});\n\n\t\tit('should correctly add a code', function () {\n\t\t\t// @ts-ignore\n\t\t\tconst error = errors.createUserError({\n\t\t\t\ttitle: 'Foo',\n\t\t\t\tcode: 'ENOENT',\n\t\t\t});\n\n\t\t\t// @ts-ignore\n\t\t\texpect(error.code).to.equal('ENOENT');\n\t\t});\n\n\t\tit('should ignore an empty description', function () {\n\t\t\tconst error = errors.createUserError({\n\t\t\t\ttitle: 'Foo',\n\t\t\t\tdescription: '',\n\t\t\t});\n\n\t\t\texpect(errors.getDescription(error)).to.equal(error.stack);\n\t\t});\n\n\t\tit('should ignore a blank description', function () {\n\t\t\tconst error = errors.createUserError({\n\t\t\t\ttitle: 'Foo',\n\t\t\t\tdescription: '     ',\n\t\t\t});\n\n\t\t\texpect(errors.getDescription(error)).to.equal(error.stack);\n\t\t});\n\n\t\tit('should throw if no title', function () {\n\t\t\texpect(() => {\n\t\t\t\t// @ts-ignore\n\t\t\t\terrors.createUserError({});\n\t\t\t}).to.throw('Invalid error title: undefined');\n\t\t});\n\n\t\tit('should throw if title is empty', function () {\n\t\t\texpect(() => {\n\t\t\t\t// @ts-ignore\n\t\t\t\terrors.createUserError({\n\t\t\t\t\ttitle: '',\n\t\t\t\t});\n\t\t\t}).to.throw('Invalid error title: ');\n\t\t});\n\n\t\tit('should throw if there is a description but no title', function () {\n\t\t\texpect(() => {\n\t\t\t\t// @ts-ignore\n\t\t\t\terrors.createUserError({\n\t\t\t\t\tdescription: 'foo',\n\t\t\t\t});\n\t\t\t}).to.throw('Invalid error title: undefined');\n\t\t});\n\n\t\tit('should throw if title is blank', function () {\n\t\t\texpect(() => {\n\t\t\t\t// @ts-ignore\n\t\t\t\terrors.createUserError({\n\t\t\t\t\ttitle: '   ',\n\t\t\t\t});\n\t\t\t}).to.throw('Invalid error title:    ');\n\t\t});\n\t});\n\n\tdescribe('.toJSON()', function () {\n\t\tit('should convert a simple error', function () {\n\t\t\tconst error = new Error('My error');\n\t\t\texpect(errors.toJSON(error)).to.deep.equal({\n\t\t\t\tcode: undefined,\n\t\t\t\tdescription: undefined,\n\t\t\t\tmessage: 'My error',\n\t\t\t\tstack: error.stack,\n\t\t\t\treport: undefined,\n\t\t\t\tstderr: undefined,\n\t\t\t\tstdout: undefined,\n\t\t\t\tsyscall: undefined,\n\t\t\t\tname: 'Error',\n\t\t\t\terrno: undefined,\n\t\t\t\tdevice: undefined,\n\t\t\t});\n\t\t});\n\n\t\tit('should convert an error with a description', function () {\n\t\t\tconst error = new Error('My error');\n\t\t\t// @ts-ignore\n\t\t\terror.description = 'My description';\n\n\t\t\texpect(errors.toJSON(error)).to.deep.equal({\n\t\t\t\tcode: undefined,\n\t\t\t\tdescription: 'My description',\n\t\t\t\tmessage: 'My error',\n\t\t\t\tstack: error.stack,\n\t\t\t\treport: undefined,\n\t\t\t\tstderr: undefined,\n\t\t\t\tstdout: undefined,\n\t\t\t\tsyscall: undefined,\n\t\t\t\tname: 'Error',\n\t\t\t\terrno: undefined,\n\t\t\t\tdevice: undefined,\n\t\t\t});\n\t\t});\n\n\t\tit('should convert an error with a code', function () {\n\t\t\tconst error = new Error('My error');\n\t\t\t// @ts-ignore\n\t\t\terror.code = 'ENOENT';\n\n\t\t\texpect(errors.toJSON(error)).to.deep.equal({\n\t\t\t\tcode: 'ENOENT',\n\t\t\t\tdescription: undefined,\n\t\t\t\tmessage: 'My error',\n\t\t\t\tstack: error.stack,\n\t\t\t\treport: undefined,\n\t\t\t\tstderr: undefined,\n\t\t\t\tstdout: undefined,\n\t\t\t\tsyscall: undefined,\n\t\t\t\tname: 'Error',\n\t\t\t\terrno: undefined,\n\t\t\t\tdevice: undefined,\n\t\t\t});\n\t\t});\n\n\t\tit('should convert an error with a description and a code', function () {\n\t\t\tconst error = new Error('My error');\n\t\t\t// @ts-ignore\n\t\t\terror.description = 'My description';\n\t\t\t// @ts-ignore\n\t\t\terror.code = 'ENOENT';\n\n\t\t\texpect(errors.toJSON(error)).to.deep.equal({\n\t\t\t\tcode: 'ENOENT',\n\t\t\t\tdescription: 'My description',\n\t\t\t\tmessage: 'My error',\n\t\t\t\tstack: error.stack,\n\t\t\t\treport: undefined,\n\t\t\t\tstderr: undefined,\n\t\t\t\tstdout: undefined,\n\t\t\t\tsyscall: undefined,\n\t\t\t\tname: 'Error',\n\t\t\t\terrno: undefined,\n\t\t\t\tdevice: undefined,\n\t\t\t});\n\t\t});\n\n\t\tit('should convert an error with a report value', function () {\n\t\t\tconst error = new Error('My error');\n\t\t\t// @ts-ignore\n\t\t\terror.report = true;\n\n\t\t\texpect(errors.toJSON(error)).to.deep.equal({\n\t\t\t\tcode: undefined,\n\t\t\t\tdescription: undefined,\n\t\t\t\tmessage: 'My error',\n\t\t\t\tstack: error.stack,\n\t\t\t\treport: true,\n\t\t\t\tstderr: undefined,\n\t\t\t\tstdout: undefined,\n\t\t\t\tsyscall: undefined,\n\t\t\t\tname: 'Error',\n\t\t\t\terrno: undefined,\n\t\t\t\tdevice: undefined,\n\t\t\t});\n\t\t});\n\n\t\tit('should convert an error without a message', function () {\n\t\t\tconst error = new Error();\n\n\t\t\texpect(errors.toJSON(error)).to.deep.equal({\n\t\t\t\tcode: undefined,\n\t\t\t\tdescription: undefined,\n\t\t\t\tmessage: '',\n\t\t\t\tstack: error.stack,\n\t\t\t\treport: undefined,\n\t\t\t\tstderr: undefined,\n\t\t\t\tstdout: undefined,\n\t\t\t\tsyscall: undefined,\n\t\t\t\tname: 'Error',\n\t\t\t\terrno: undefined,\n\t\t\t\tdevice: undefined,\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe('.fromJSON()', function () {\n\t\tit('should return an Error object', function () {\n\t\t\tconst error = new Error('My error');\n\t\t\tconst result = errors.fromJSON(errors.toJSON(error));\n\t\t\texpect(result).to.be.an.instanceof(Error);\n\t\t});\n\n\t\tit('should convert a simple JSON error', function () {\n\t\t\tconst error = new Error('My error');\n\t\t\tconst result = errors.fromJSON(errors.toJSON(error));\n\n\t\t\texpect(result.message).to.equal(error.message);\n\t\t\t// @ts-ignore\n\t\t\texpect(result.description).to.equal(error.description);\n\t\t\t// @ts-ignore\n\t\t\texpect(result.code).to.equal(error.code);\n\t\t\texpect(result.stack).to.equal(error.stack);\n\t\t\t// @ts-ignore\n\t\t\texpect(result.report).to.equal(error.report);\n\t\t});\n\n\t\tit('should convert a JSON error with a description', function () {\n\t\t\tconst error = new Error('My error');\n\t\t\t// @ts-ignore\n\t\t\terror.description = 'My description';\n\t\t\tconst result = errors.fromJSON(errors.toJSON(error));\n\n\t\t\texpect(result.message).to.equal(error.message);\n\t\t\t// @ts-ignore\n\t\t\texpect(result.description).to.equal(error.description);\n\t\t\t// @ts-ignore\n\t\t\texpect(result.code).to.equal(error.code);\n\t\t\texpect(result.stack).to.equal(error.stack);\n\t\t\t// @ts-ignore\n\t\t\texpect(result.report).to.equal(error.report);\n\t\t});\n\n\t\tit('should convert a JSON error with a code', function () {\n\t\t\tconst error = new Error('My error');\n\t\t\t// @ts-ignore\n\t\t\terror.code = 'ENOENT';\n\t\t\tconst result = errors.fromJSON(errors.toJSON(error));\n\n\t\t\texpect(result.message).to.equal(error.message);\n\t\t\t// @ts-ignore\n\t\t\texpect(result.description).to.equal(error.description);\n\t\t\t// @ts-ignore\n\t\t\texpect(result.code).to.equal(error.code);\n\t\t\texpect(result.stack).to.equal(error.stack);\n\t\t\t// @ts-ignore\n\t\t\texpect(result.report).to.equal(error.report);\n\t\t});\n\n\t\tit('should convert a JSON error with a report value', function () {\n\t\t\tconst error = new Error('My error');\n\t\t\t// @ts-ignore\n\t\t\terror.report = false;\n\t\t\tconst result = errors.fromJSON(errors.toJSON(error));\n\n\t\t\texpect(result.message).to.equal(error.message);\n\t\t\t// @ts-ignore\n\t\t\texpect(result.description).to.equal(error.description);\n\t\t\t// @ts-ignore\n\t\t\texpect(result.code).to.equal(error.code);\n\t\t\texpect(result.stack).to.equal(error.stack);\n\t\t\t// @ts-ignore\n\t\t\texpect(result.report).to.equal(error.report);\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "tests/shared/messages.spec.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { expect } from 'chai';\nimport * as _ from 'lodash';\n\nimport * as messages from '../../lib/shared/messages';\n\ndescribe('Shared: Messages', function () {\n\tbeforeEach(function () {\n\t\tthis.drives = [\n\t\t\t{\n\t\t\t\tdescription: 'My Drive',\n\t\t\t\tdisplayName: '/dev/disk1',\n\t\t\t},\n\t\t\t{\n\t\t\t\tdescription: 'Other Drive',\n\t\t\t\tdisplayName: '/dev/disk2',\n\t\t\t},\n\t\t];\n\t});\n\n\tit('should contain object properties', function () {\n\t\texpect(_.every(_.map(messages, _.isPlainObject))).to.be.true;\n\t});\n\n\tit('should contain function properties in each category', function () {\n\t\t_.each(messages, (category) => {\n\t\t\texpect(_.every(_.map(category, _.isFunction))).to.be.true;\n\t\t});\n\t});\n\n\tdescribe('.info', function () {\n\t\tdescribe('.flashComplete()', function () {\n\t\t\tit('should use singular when there are single results', function () {\n\t\t\t\tconst msg = messages.info.flashComplete('image.img', this.drives, {\n\t\t\t\t\tfailed: 1,\n\t\t\t\t\tsuccessful: 1,\n\t\t\t\t});\n\n\t\t\t\texpect(msg).to.equal(\n\t\t\t\t\t'image.img was successfully flashed to 1 target and failed to be flashed to 1 target',\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit('should use plural when there are multiple results', function () {\n\t\t\t\tconst msg = messages.info.flashComplete('image.img', this.drives, {\n\t\t\t\t\tfailed: 2,\n\t\t\t\t\tsuccessful: 2,\n\t\t\t\t});\n\n\t\t\t\texpect(msg).to.equal(\n\t\t\t\t\t'image.img was successfully flashed to 2 targets and failed to be flashed to 2 targets',\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit('should not contain failed target part when there are none', function () {\n\t\t\t\tconst msg = messages.info.flashComplete('image.img', this.drives, {\n\t\t\t\t\tfailed: 0,\n\t\t\t\t\tsuccessful: 2,\n\t\t\t\t});\n\n\t\t\t\texpect(msg).to.equal('image.img was successfully flashed to 2 targets');\n\t\t\t});\n\n\t\t\tit('should show drive name and description when only target', function () {\n\t\t\t\tconst msg = messages.info.flashComplete('image.img', this.drives, {\n\t\t\t\t\tfailed: 0,\n\t\t\t\t\tsuccessful: 1,\n\t\t\t\t});\n\n\t\t\t\texpect(msg).to.equal(\n\t\t\t\t\t'image.img was successfully flashed to My Drive (/dev/disk1)',\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe('.error', function () {\n\t\tdescribe('.flashFailure()', function () {\n\t\t\tit('should use plural when there are multiple drives', function () {\n\t\t\t\tconst msg = messages.error.flashFailure('image.img', this.drives);\n\n\t\t\t\texpect(msg).to.equal(\n\t\t\t\t\t'Something went wrong while writing image.img to 2 targets.',\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit('should use singular when there is one drive', function () {\n\t\t\t\tconst msg = messages.error.flashFailure('image.img', [this.drives[0]]);\n\n\t\t\t\texpect(msg).to.equal(\n\t\t\t\t\t'Something went wrong while writing image.img to My Drive (/dev/disk1).',\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "tests/shared/supported-formats.spec.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { expect } from 'chai';\nimport * as _ from 'lodash';\n\nimport * as supportedFormats from '../../lib/shared/supported-formats';\n\ndescribe('Shared: SupportedFormats', function () {\n\tdescribe('.looksLikeWindowsImage()', function () {\n\t\t_.each(\n\t\t\t[\n\t\t\t\t'C:\\\\path\\\\to\\\\en_windows_10_multiple_editions_version_1607_updated_jan_2017_x64_dvd_9714399.iso',\n\t\t\t\t'/path/to/en_windows_10_multiple_editions_version_1607_updated_jan_2017_x64_dvd_9714399.iso',\n\t\t\t\t'/path/to/Win10_1607_SingleLang_English_x32.iso',\n\t\t\t\t'/path/to/en_winxp_pro_x86_build2600_iso.img',\n\t\t\t],\n\t\t\t(imagePath) => {\n\t\t\t\tit(`should return true if filename is ${imagePath}`, function () {\n\t\t\t\t\tconst looksLikeWindowsImage =\n\t\t\t\t\t\tsupportedFormats.looksLikeWindowsImage(imagePath);\n\t\t\t\t\texpect(looksLikeWindowsImage).to.be.true;\n\t\t\t\t});\n\t\t\t},\n\t\t);\n\n\t\t_.each(\n\t\t\t[\n\t\t\t\t'C:\\\\path\\\\to\\\\2017-01-11-raspbian-jessie.img',\n\t\t\t\t'/path/to/2017-01-11-raspbian-jessie.img',\n\t\t\t],\n\t\t\t(imagePath) => {\n\t\t\t\tit(`should return false if filename is ${imagePath}`, function () {\n\t\t\t\t\tconst looksLikeWindowsImage =\n\t\t\t\t\t\tsupportedFormats.looksLikeWindowsImage(imagePath);\n\t\t\t\t\texpect(looksLikeWindowsImage).to.be.false;\n\t\t\t\t});\n\t\t\t},\n\t\t);\n\t});\n});\n"
  },
  {
    "path": "tests/shared/units.spec.ts",
    "content": "/*\n * Copyright 2016 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { expect } from 'chai';\nimport { bytesToMegabytes } from '../../lib/shared/units';\n\ndescribe('Shared: Units', function () {\n\tdescribe('.bytesToMegabytes()', function () {\n\t\tit('should convert bytes to megabytes', function () {\n\t\t\texpect(bytesToMegabytes(1.2e7)).to.equal(12);\n\t\t\texpect(bytesToMegabytes(332000)).to.equal(0.332);\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "tests/shared/utils.spec.ts",
    "content": "/*\n * Copyright 2017 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { expect } from 'chai';\n\nimport * as utils from '../../lib/shared/utils';\n\ndescribe('Shared: Utils', function () {\n\tdescribe('.isValidPercentage()', function () {\n\t\tit('should return false if percentage is not a number', function () {\n\t\t\texpect(utils.isValidPercentage('50')).to.be.false;\n\t\t});\n\n\t\tit('should return false if percentage is null', function () {\n\t\t\texpect(utils.isValidPercentage(null)).to.be.false;\n\t\t});\n\n\t\tit('should return false if percentage is undefined', function () {\n\t\t\texpect(utils.isValidPercentage(undefined)).to.be.false;\n\t\t});\n\n\t\tit('should return false if percentage is an integer less than 0', function () {\n\t\t\texpect(utils.isValidPercentage(-1)).to.be.false;\n\t\t});\n\n\t\tit('should return false if percentage is a float less than 0', function () {\n\t\t\texpect(utils.isValidPercentage(-0.1)).to.be.false;\n\t\t});\n\n\t\tit('should return true if percentage is 0', function () {\n\t\t\texpect(utils.isValidPercentage(0)).to.be.true;\n\t\t});\n\n\t\tit('should return true if percentage is an integer greater than 0, but less than 100', function () {\n\t\t\texpect(utils.isValidPercentage(50)).to.be.true;\n\t\t});\n\n\t\tit('should return true if percentage is a float greater than 0, but less than 100', function () {\n\t\t\texpect(utils.isValidPercentage(49.55)).to.be.true;\n\t\t});\n\n\t\tit('should return true if percentage is 100', function () {\n\t\t\texpect(utils.isValidPercentage(100)).to.be.true;\n\t\t});\n\n\t\tit('should return false if percentage is an integer greater than 100', function () {\n\t\t\texpect(utils.isValidPercentage(101)).to.be.false;\n\t\t});\n\n\t\tit('should return false if percentage is a float greater than 100', function () {\n\t\t\texpect(utils.isValidPercentage(100.001)).to.be.false;\n\t\t});\n\t});\n\n\tdescribe('.percentageToFloat()', function () {\n\t\tit('should throw an error if given a string percentage', function () {\n\t\t\texpect(function () {\n\t\t\t\tutils.percentageToFloat('50');\n\t\t\t}).to.throw('Invalid percentage: 50');\n\t\t});\n\n\t\tit('should throw an error if given a null percentage', function () {\n\t\t\texpect(function () {\n\t\t\t\tutils.percentageToFloat(null);\n\t\t\t}).to.throw('Invalid percentage: null');\n\t\t});\n\n\t\tit('should throw an error if given an undefined percentage', function () {\n\t\t\texpect(function () {\n\t\t\t\tutils.percentageToFloat(undefined);\n\t\t\t}).to.throw('Invalid percentage: undefined');\n\t\t});\n\n\t\tit('should throw an error if given an integer percentage < 0', function () {\n\t\t\texpect(function () {\n\t\t\t\tutils.percentageToFloat(-1);\n\t\t\t}).to.throw('Invalid percentage: -1');\n\t\t});\n\n\t\tit('should throw an error if given a float percentage < 0', function () {\n\t\t\texpect(function () {\n\t\t\t\tutils.percentageToFloat(-0.1);\n\t\t\t}).to.throw('Invalid percentage: -0.1');\n\t\t});\n\n\t\tit('should covert a 0 percentage to 0', function () {\n\t\t\texpect(utils.percentageToFloat(0)).to.equal(0);\n\t\t});\n\n\t\tit('should covert an integer percentage to a float', function () {\n\t\t\texpect(utils.percentageToFloat(50)).to.equal(0.5);\n\t\t});\n\n\t\tit('should covert an float percentage to a float', function () {\n\t\t\texpect(utils.percentageToFloat(46.54)).to.equal(0.4654);\n\t\t});\n\n\t\tit('should covert a 100 percentage to 1', function () {\n\t\t\texpect(utils.percentageToFloat(100)).to.equal(1);\n\t\t});\n\n\t\tit('should throw an error if given an integer percentage > 100', function () {\n\t\t\texpect(function () {\n\t\t\t\tutils.percentageToFloat(101);\n\t\t\t}).to.throw('Invalid percentage: 101');\n\t\t});\n\n\t\tit('should throw an error if given a float percentage > 100', function () {\n\t\t\texpect(function () {\n\t\t\t\tutils.percentageToFloat(100.01);\n\t\t\t}).to.throw('Invalid percentage: 100.01');\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "tests/test.e2e.ts",
    "content": "import { browser } from '@wdio/globals';\n\ndescribe('Electron Testing', () => {\n\tit('should print application title', async () => {\n\t\tconsole.log('Hello', await browser.getTitle(), 'application!');\n\t});\n});\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n\t\"compilerOptions\": {\n\t\t\"strict\": true,\n\t\t\"target\": \"es2019\",\n\t\t\"typeRoots\": [\"./node_modules/@types\", \"./typings\"],\n\t\t\"module\": \"commonjs\",\n\t\t\"lib\": [\"dom\", \"esnext\"],\n\t\t\"declaration\": true,\n\t\t\"declarationMap\": true,\n\t\t\"jsx\": \"react\",\n\t\t\"pretty\": true,\n\t\t\"sourceMap\": true,\n\t\t\"noUnusedLocals\": true,\n\t\t\"noUnusedParameters\": true,\n\t\t\"noImplicitReturns\": true,\n\t\t\"noFallthroughCasesInSwitch\": true,\n\t\t\"moduleResolution\": \"node\",\n\t\t\"allowSyntheticDefaultImports\": true,\n\t\t\"resolveJsonModule\": true\n\t}\n}\n"
  },
  {
    "path": "tsconfig.sidecar.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2020\",\n    \"allowJs\": false,\n    \"skipLibCheck\": true,\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"typeRoots\": [\"./node_modules/@types\", \"./typings\"],\n    \"module\": \"commonjs\",\n    \"moduleResolution\": \"Node\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true\n  },\n  \"include\": [\"lib/util\"]\n}\n"
  },
  {
    "path": "wdio.conf.ts",
    "content": "/// <reference types=\"wdio-electron-service\" />\nimport type { Options } from '@wdio/types';\n\nexport const config: Options.Testrunner = {\n\t//\n\t// ====================\n\t// Runner Configuration\n\t// ====================\n\t// WebdriverIO supports running e2e tests as well as unit and component tests.\n\trunner: 'local',\n\tautoCompileOpts: {\n\t\tautoCompile: true,\n\t\ttsNodeOpts: {\n\t\t\tproject: './tsconfig.json',\n\t\t\ttranspileOnly: true,\n\t\t},\n\t},\n\n\t//\n\t// ==================\n\t// Specify Test Files\n\t// ==================\n\t// Define which test specs should run. The pattern is relative to the directory\n\t// of the configuration file being run.\n\t//\n\t// The specs are defined as an array of spec files (optionally using wildcards\n\t// that will be expanded). The test for each spec file will be run in a separate\n\t// worker process. In order to have a group of spec files run in the same worker\n\t// process simply enclose them in an array within the specs array.\n\t//\n\t// The path of the spec files will be resolved relative from the directory of\n\t// of the config file unless it's absolute.\n\t//\n\tspecs: ['./tests/**/*.spec.ts'],\n\t// Patterns to exclude.\n\t// FIXME: Remove the following exclusions once the tests are ported to WDIO\n\texclude: [\n\t\t'tests/gui/modules/image-writer.spec.ts',\n\t\t'tests/gui/os/window-progress.spec.ts',\n\t\t'tests/gui/models/available-drives.spec.ts',\n\t\t'tests/gui/models/flash-state.spec.ts',\n\t\t'tests/gui/models/selection-state.spec.ts',\n\t\t'tests/gui/models/settings.spec.ts',\n\t\t'tests/shared/drive-constraints.spec.ts',\n\t\t'tests/shared/messages.spec.ts',\n\t\t'tests/gui/modules/progress-status.spec.ts',\n\t],\n\t//\n\t// ============\n\t// Capabilities\n\t// ============\n\t// Define your capabilities here. WebdriverIO can run multiple capabilities at the same\n\t// time. Depending on the number of capabilities, WebdriverIO launches several test\n\t// sessions. Within your capabilities you can overwrite the spec and exclude options in\n\t// order to group specific specs to a specific capability.\n\t//\n\t// First, you can define how many instances should be started at the same time. Let's\n\t// say you have 3 different capabilities (Chrome, Firefox, and Safari) and you have\n\t// set maxInstances to 1; wdio will spawn 3 processes. Therefore, if you have 10 spec\n\t// files and you set maxInstances to 10, all spec files will get tested at the same time\n\t// and 30 processes will get spawned. The property handles how many capabilities\n\t// from the same test should run tests.\n\t//\n\tmaxInstances: 10,\n\t//\n\t// If you have trouble getting all important capabilities together, check out the\n\t// Sauce Labs platform configurator - a great tool to configure your capabilities:\n\t// https://saucelabs.com/platform/platform-configurator\n\t//\n\tcapabilities: [\n\t\t{\n\t\t\tbrowserName: 'electron',\n\t\t\t// Electron service options\n\t\t\t// see https://webdriver.io/docs/desktop-testing/electron/configuration/#service-options\n\t\t\t'wdio:electronServiceOptions': {\n\t\t\t\tappArgs: process.platform === 'linux' ? ['headless'] : [],\n\t\t\t},\n\t\t},\n\t],\n\n\t//\n\t// ===================\n\t// Test Configurations\n\t// ===================\n\t// Define all options that are relevant for the WebdriverIO instance here\n\t//\n\t// Level of logging verbosity: trace | debug | info | warn | error | silent\n\tlogLevel: 'info',\n\t//\n\t// Set specific log levels per logger\n\t// loggers:\n\t// - webdriver, webdriverio\n\t// - @wdio/browserstack-service, @wdio/devtools-service, @wdio/sauce-service\n\t// - @wdio/mocha-framework, @wdio/jasmine-framework\n\t// - @wdio/local-runner\n\t// - @wdio/sumologic-reporter\n\t// - @wdio/cli, @wdio/config, @wdio/utils\n\t// Level of logging verbosity: trace | debug | info | warn | error | silent\n\t// logLevels: {\n\t//     webdriver: 'info',\n\t//     '@wdio/appium-service': 'info'\n\t// },\n\t//\n\t// If you only want to run your tests until a specific amount of tests have failed use\n\t// bail (default is 0 - don't bail, run all tests).\n\tbail: 0,\n\t//\n\t// Set a base URL in order to shorten url command calls. If your `url` parameter starts\n\t// with `/`, the base url gets prepended, not including the path portion of your baseUrl.\n\t// If your `url` parameter starts without a scheme or `/` (like `some/path`), the base url\n\t// gets prepended directly.\n\t// baseUrl: 'http://localhost:8080',\n\t//\n\t// Default timeout for all waitFor* commands.\n\twaitforTimeout: 10000,\n\t//\n\t// Default timeout in milliseconds for request\n\t// if browser driver or grid doesn't send response\n\tconnectionRetryTimeout: 120000,\n\t//\n\t// Default request retries count\n\tconnectionRetryCount: 3,\n\t//\n\t// Test runner services\n\t// Services take over a specific job you don't want to take care of. They enhance\n\t// your test setup with almost no effort. Unlike plugins, they don't add new\n\t// commands. Instead, they hook themselves up into the test process.\n\tservices: ['electron'],\n\n\t// Framework you want to run your specs with.\n\t// The following are supported: Mocha, Jasmine, and Cucumber\n\t// see also: https://webdriver.io/docs/frameworks\n\t//\n\t// Make sure you have the wdio adapter package for the specific framework installed\n\t// before running any tests.\n\tframework: 'mocha',\n\n\t//\n\t// The number of times to retry the entire specfile when it fails as a whole\n\t// specFileRetries: 1,\n\t//\n\t// Delay in seconds between the spec file retry attempts\n\t// specFileRetriesDelay: 0,\n\t//\n\t// Whether or not retried spec files should be retried immediately or deferred to the end of the queue\n\t// specFileRetriesDeferred: false,\n\t//\n\t// Test reporter for stdout.\n\t// The only one supported by default is 'dot'\n\t// see also: https://webdriver.io/docs/dot-reporter\n\treporters: ['spec'],\n\n\t// Options to be passed to Mocha.\n\t// See the full list at http://mochajs.org/\n\tmochaOpts: {\n\t\tui: 'bdd',\n\t\ttimeout: 60000,\n\t},\n\n\t//\n\t// =====\n\t// Hooks\n\t// =====\n\t// WebdriverIO provides several hooks you can use to interfere with the test process in order to enhance\n\t// it and to build services around it. You can either apply a single function or an array of\n\t// methods to it. If one of them returns with a promise, WebdriverIO will wait until that promise got\n\t// resolved to continue.\n\t/**\n\t * Gets executed once before all workers get launched.\n\t * @param {object} config wdio configuration object\n\t * @param {Array.<Object>} capabilities list of capabilities details\n\t */\n\t// onPrepare: function (config, capabilities) {\n\t// },\n\t/**\n\t * Gets executed before a worker process is spawned and can be used to initialize specific service\n\t * for that worker as well as modify runtime environments in an async fashion.\n\t * @param  {string} cid      capability id (e.g 0-0)\n\t * @param  {object} caps     object containing capabilities for session that will be spawn in the worker\n\t * @param  {object} specs    specs to be run in the worker process\n\t * @param  {object} args     object that will be merged with the main configuration once worker is initialized\n\t * @param  {object} execArgv list of string arguments passed to the worker process\n\t */\n\t// onWorkerStart: function (cid, caps, specs, args, execArgv) {\n\t// },\n\t/**\n\t * Gets executed just after a worker process has exited.\n\t * @param  {string} cid      capability id (e.g 0-0)\n\t * @param  {number} exitCode 0 - success, 1 - fail\n\t * @param  {object} specs    specs to be run in the worker process\n\t * @param  {number} retries  number of retries used\n\t */\n\t// onWorkerEnd: function (cid, exitCode, specs, retries) {\n\t// },\n\t/**\n\t * Gets executed just before initialising the webdriver session and test framework. It allows you\n\t * to manipulate configurations depending on the capability or spec.\n\t * @param {object} config wdio configuration object\n\t * @param {Array.<Object>} capabilities list of capabilities details\n\t * @param {Array.<String>} specs List of spec file paths that are to be run\n\t * @param {string} cid worker id (e.g. 0-0)\n\t */\n\t// beforeSession: function (config, capabilities, specs, cid) {\n\t// },\n\t/**\n\t * Gets executed before test execution begins. At this point you can access to all global\n\t * variables like `browser`. It is the perfect place to define custom commands.\n\t * @param {Array.<Object>} capabilities list of capabilities details\n\t * @param {Array.<String>} specs        List of spec file paths that are to be run\n\t * @param {object}         browser      instance of created browser/device session\n\t */\n\t// before: function (capabilities, specs) {\n\t// },\n\t/**\n\t * Runs before a WebdriverIO command gets executed.\n\t * @param {string} commandName hook command name\n\t * @param {Array} args arguments that command would receive\n\t */\n\t// beforeCommand: function (commandName, args) {\n\t// },\n\t/**\n\t * Hook that gets executed before the suite starts\n\t * @param {object} suite suite details\n\t */\n\t// beforeSuite: function (suite) {\n\t// },\n\t/**\n\t * Function to be executed before a test (in Mocha/Jasmine) starts.\n\t */\n\t// beforeTest: function (test, context) {\n\t// },\n\t/**\n\t * Hook that gets executed _before_ a hook within the suite starts (e.g. runs before calling\n\t * beforeEach in Mocha)\n\t */\n\t// beforeHook: function (test, context, hookName) {\n\t// },\n\t/**\n\t * Hook that gets executed _after_ a hook within the suite starts (e.g. runs after calling\n\t * afterEach in Mocha)\n\t */\n\t// afterHook: function (test, context, { error, result, duration, passed, retries }, hookName) {\n\t// },\n\t/**\n\t * Function to be executed after a test (in Mocha/Jasmine only)\n\t * @param {object}  test             test object\n\t * @param {object}  context          scope object the test was executed with\n\t * @param {Error}   result.error     error object in case the test fails, otherwise `undefined`\n\t * @param {*}       result.result    return object of test function\n\t * @param {number}  result.duration  duration of test\n\t * @param {boolean} result.passed    true if test has passed, otherwise false\n\t * @param {object}  result.retries   information about spec related retries, e.g. `{ attempts: 0, limit: 0 }`\n\t */\n\t// afterTest: function(test, context, { error, result, duration, passed, retries }) {\n\t// },\n\n\t/**\n\t * Hook that gets executed after the suite has ended\n\t * @param {object} suite suite details\n\t */\n\t// afterSuite: function (suite) {\n\t// },\n\t/**\n\t * Runs after a WebdriverIO command gets executed\n\t * @param {string} commandName hook command name\n\t * @param {Array} args arguments that command would receive\n\t * @param {number} result 0 - command success, 1 - command error\n\t * @param {object} error error object if any\n\t */\n\t// afterCommand: function (commandName, args, result, error) {\n\t// },\n\t/**\n\t * Gets executed after all tests are done. You still have access to all global variables from\n\t * the test.\n\t * @param {number} result 0 - test pass, 1 - test fail\n\t * @param {Array.<Object>} capabilities list of capabilities details\n\t * @param {Array.<String>} specs List of spec file paths that ran\n\t */\n\t// after: function (result, capabilities, specs) {\n\t// },\n\t/**\n\t * Gets executed right after terminating the webdriver session.\n\t * @param {object} config wdio configuration object\n\t * @param {Array.<Object>} capabilities list of capabilities details\n\t * @param {Array.<String>} specs List of spec file paths that ran\n\t */\n\t// afterSession: function (config, capabilities, specs) {\n\t// },\n\t/**\n\t * Gets executed after all workers got shut down and the process is about to exit. An error\n\t * thrown in the onComplete hook will result in the test run failing.\n\t * @param {object} exitCode 0 - success, 1 - fail\n\t * @param {object} config wdio configuration object\n\t * @param {Array.<Object>} capabilities list of capabilities details\n\t * @param {<Object>} results object containing test results\n\t */\n\t// onComplete: function(exitCode, config, capabilities, results) {\n\t// },\n\t/**\n\t * Gets executed when a refresh happens.\n\t * @param {string} oldSessionId session ID of the old session\n\t * @param {string} newSessionId session ID of the new session\n\t */\n\t// onReload: function(oldSessionId, newSessionId) {\n\t// }\n\t/**\n\t * Hook that gets executed before a WebdriverIO assertion happens.\n\t * @param {object} params information about the assertion to be executed\n\t */\n\t// beforeAssertion: function(params) {\n\t// }\n\t/**\n\t * Hook that gets executed after a WebdriverIO assertion happened.\n\t * @param {object} params information about the assertion that was executed, including its results\n\t */\n\t// afterAssertion: function(params) {\n\t// }\n};\n"
  },
  {
    "path": "webpack.config.ts",
    "content": "/*\n * Copyright 2017 balena.io\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\")\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Configuration, ModuleOptions } from 'webpack';\nimport { resolve } from 'path';\n\nimport { BannerPlugin, IgnorePlugin, DefinePlugin } from 'webpack';\n\nconst rules: Required<ModuleOptions>['rules'] = [\n\t// Add support for native node modules\n\t{\n\t\t// We're specifying native_modules in the test because the asset relocator loader generates a\n\t\t// \"fake\" .node file which is really a cjs file.\n\t\ttest: /native_modules[/\\\\].+\\.node$/,\n\t\tuse: 'node-loader',\n\t},\n\t{\n\t\ttest: /[/\\\\]node_modules[/\\\\].+\\.(m?js|node)$/,\n\t\tparser: { amd: false },\n\t\tuse: {\n\t\t\tloader: '@vercel/webpack-asset-relocator-loader',\n\t\t\toptions: {\n\t\t\t\toutputAssetBase: 'native_modules',\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttest: /\\.tsx?$/,\n\t\texclude: /(node_modules|\\.webpack)/,\n\t\tuse: {\n\t\t\tloader: 'ts-loader',\n\t\t\toptions: {\n\t\t\t\ttranspileOnly: true,\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttest: /\\.css$/,\n\t\tuse: ['style-loader', 'css-loader'],\n\t},\n\t{\n\t\ttest: /\\.(woff|woff2|eot|ttf|otf)$/,\n\t\tloader: 'file-loader',\n\t},\n\t{\n\t\ttest: /\\.svg$/,\n\t\tuse: '@svgr/webpack',\n\t},\n];\n\nconst injectAnalyticsToken = new DefinePlugin({\n\t'process.env.SENTRY_TOKEN': JSON.stringify(process.env.SENTRY_TOKEN || ''),\n});\n\nexport const rendererConfig: Configuration = {\n\tmodule: {\n\t\trules,\n\t},\n\tplugins: [\n\t\t// Ignore `aws-crt` which is a dependency of (ultimately) `aws4-axios` which is used\n\t\t// by etcher-sdk and does a runtime check to its availability. We’re not currently\n\t\t// using the “assume role” functionality (AFAIU) of aws4-axios and we don’t care that\n\t\t// it’s not found, so force webpack to ignore the import.\n\t\t// See https://github.com/aws/aws-sdk-js-v3/issues/3025\n\t\tnew IgnorePlugin({\n\t\t\tresourceRegExp: /^aws-crt$/,\n\t\t}),\n\t\t// Remove \"Download the React DevTools for a better development experience\" message\n\t\tnew BannerPlugin({\n\t\t\tbanner: '__REACT_DEVTOOLS_GLOBAL_HOOK__ = { isDisabled: true };',\n\t\t\traw: true,\n\t\t}),\n\t\tinjectAnalyticsToken,\n\t],\n\n\tresolve: {\n\t\textensions: ['.js', '.ts', '.jsx', '.tsx', '.css'],\n\t\talias: {\n\t\t\t// need to alias ws to the wrapper to avoid the browser fake version to be used\n\t\t\tws: resolve(__dirname, 'node_modules/ws/wrapper.mjs'),\n\t\t},\n\t},\n};\n\nexport const mainConfig: Configuration = {\n\tentry: {\n\t\tetcher: './lib/gui/etcher.ts',\n\t},\n\tmodule: {\n\t\trules,\n\t},\n\tresolve: {\n\t\textensions: ['.js', '.ts', '.jsx', '.tsx', '.css', '.json'],\n\t},\n\tplugins: [injectAnalyticsToken],\n};\n"
  }
]